[C++][Office] Excel 增益集自订另存新档及存成XPS、PDF问题

摘要:[C++][Office] Excel 增益集自订另存新档

在 Excel 增益集当中我们需要取得存档之后的文件名,所以在 WorkbookBeforeSave 事件当中进行尝试。

因为这个事件在存档前就已经触发了,无法取得使用者到底存成了什么文件名,所以我们取消掉 Office 自己调用的 SaveAs Dialog,让我们自行调用,这样就可以让使用者在我们自己产生的 Dialog 中存档,进行后续动作。

调用 SaveAsDialog 的方式有两种,各有优缺

如何自行调用 SaveAsDialog

1. 使用 Office::FileDialog,可以容易取得存档后的文件名、附档,但原本 PDF 及 XPS 档的发布选项将会不见


 void CALLBACK CConnect::WorkbookBeforeSave(
	Excel::_Workbook* Wb,
	VARIANT_BOOL SaveAsUI,
	VARIANT_BOOL* Cancel)
{
	Office:: FileDialog* fileDialog;
	*Cancel = true;
	Wb->Application->get_FileDialog(Office::mosFileDialogSaveAs, &fileDialog);
	if(fileDialog->Show() == VARIANT_TRUE)
	{
                fileDialog->Execute(); // 执行存档
	}
	else
	{
		//Do something if Cancel
	}
}

2. 使用 XlBuiltInDialog,原有的 SaveAsDialog


 void CALLBACK CConnect::WorkbookBeforeSave(
	Excel::_Workbook* Wb,
	VARIANT_BOOL SaveAsUI,
	VARIANT_BOOL* Cancel)
{

	*Cancel = true;
	CComPtr App(Wb->Application);
	CComPtr dlg = App->Dialogs->GetItem(Excel::XlBuiltInDialog::xlDialogSaveAs);
    if(dlg->Show() == VARIANT_TRUE)
	{

		_bstr_t fileName = Wb->Name;
                _bstr_t fullName = Wb->FullName[0];
	}
	else
	{
		//Do something if Cancel
	}
}

Office::FileDialog 存成 PDF 或 XPS 时 需要另行处理

基本上以上两种都可以完成存档,但使用 Office::FileDialog 时发现如果另存为 PDF 或 XPS 两种格式文档时会有问题,文件是保存了没错,但是打开时两种都出现格式错误的问题,将他们的副文件名再改为.xlsx 时又可以用 EXCEL 开启,事实上根本就是假存档真改副文件名罢了。

要另存成 PDF 或 XPS 时需要调用 ExportAsFixedFormat,所以延伸第一种 Dialog 写法另做判断


 void CALLBACK CConnect::WorkbookBeforeSave(
	Excel::_Workbook* Wb,
	VARIANT_BOOL SaveAsUI,
	VARIANT_BOOL* Cancel)
{
	Office:: FileDialog* fileDialog;
	*Cancel = true;
	Wb->Application->get_FileDialog(Office::mosFileDialogSaveAs, &fileDialog);
	if(fileDialog->Show() == VARIANT_TRUE)
	{
		Office::FileDialogSelectedItemsPtr selectedItems = fileDialog->SelectedItems;
		_bstr_t path = selectedItems.Item(1);
		WCHAR ext[_MAX_FNAME]={0x00};
		_wsplitpath(path, NULL, NULL, NULL, ext);

		if(ext == L".pdf")
		{
			Wb->ExportAsFixedFormat(Excel::xlTypePDF, L"C:myExportPDF.pdf", vtMissing,
				vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);
		}
		else if(ext == L".xps)
		{
			Wb->ExportAsFixedFormat(Excel::xlTypeXPS, L"C:myExportXPS.xps", vtMissing,
				vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);
		}
		else
		{
			fileDialog->Execute(); // 执行一般格式存档
		}
	}
}

如何取得存档后的文件名

使用 Office::FileDialog,从 dialog 内取得参数


 bool isCustomSaveAs = false;
void CALLBACK CConnect::WorkbookBeforeSave(
			Excel::_Workbook* Wb,
			VARIANT_BOOL SaveAsUI,
			VARIANT_BOOL* Cancel)
{
	if(isCustomSaveAs)
		return;

	// 没有显示 UI 表示他为"存档"事件
	if(SaveAsUI != VARIANT_TRUE)
		return;

	isCustomSaveAs = true; 	//fileDialog.Show() 会再次触发此事件,需要滤掉
	*Cancel = true;			// 取消原本的另存新档行为

	// 自订另存新档流程
	CcomPtr App(Wb->Application);
	Office::FileDialog* fileDialog;
	App->get_FileDialog(Office::msoFileDialogSaveAs, &fileDialog);

	if(fileDialog->Show() != VARIANT_TRUE)
		return;

	// 取得存档后的文件名
	Office::FileDialogSelectedItemsPtr items = fileDialog->SelectedItems;
	_bstr_t fileName = selectedItems->Items(1);

	// 取得存档的类型
	int typeIndex = fileDialog->FilterIndex;
	Office::FileDialogFilterPtr flterPtr = fileDialog->GetFilters()->Item(typeIndex);
    _bstr_t ext = flterPtr->GetExtensions();
}

使用 XlBuiltInDialog,从 Workbook 取得文件名


void CALLBACK CConnect::WorkbookBeforeSave(
	Excel::_Workbook* Wb,
	VARIANT_BOOL SaveAsUI,
	VARIANT_BOOL* Cancel)
{

	*Cancel = true;
	CComPtr App(Wb->Application);
	CComPtr dlg = App->Dialogs->GetItem(Excel::XlBuiltInDialog::xlDialogSaveAs);
    if(dlg->Show() == VARIANT_TRUE)
	{
                // 存成 XPS、PDF 时取不到存档后的文件名,或许有方法,但我还没找到
		_bstr_t fileName = Wb->Name;
		_bstr_t fullName = Wb->FullName[0];

	}
	else
	{
		//Do something if Cancel
	}
}

原文:大专栏  [C++][Office] Excel 增益集自订另存新档及存成XPS、PDF问题

原文地址:https://www.cnblogs.com/chinatrump/p/11458430.html

时间: 2024-07-29 17:16:49

[C++][Office] Excel 增益集自订另存新档及存成XPS、PDF问题的相关文章

Libre Office,一个集美貌与才华于一身的软件

自从上次的勒索病毒之后,身边的大神们开始叨叨叨叨windows是如何的不安全,叨叨的把我弄的也想装个Linux尝试下.本宝贝选呀选呀选了个中兴新支点的操作系统.(之前一直以为中兴只弄手机来着没想到这么厉害还带弄操作系统的.) 中兴新支点的操作系统还是非常好用的,操作习惯和windows的操作习惯还是蛮接近的,没出现什么用不惯的地方,不同的就是开机时间快了好多,果然是因为我的windows太老了吗-.- ... 粗略看了下,系统包含的软件挺全的,办公软件啊,防火墙啊什么的,基础功能很全,啥也都不缺

Microsoft Office Excel 不能访问文件

Microsoft Office Excel 不能访问文件“QUOTE5.xls”. 可能的原因有: 1 文件名称或路径不存在.2 文件正被其他程序使用.3 您正要保存的工作簿与当前打开的工作簿同名. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Runtime.InteropServices.COMException: Microsoft Office Excel 不能访问文件“D:

金山WPS、微软Office EXCEL表格通用C++接口

金山WPS.微软Office EXCEL表格通用C++接口 之前有个小项目在win32框架下,有个导出报表的小需求excel,小小的整理了下几个接口.最近闲着了解了下VAB宏,扩展了几个实用接口,适用于金山wps办公软件,至于微软的excel版本是否能够忽略,这个还真没试过,理论上某些接口是可以的(只要VAB宏没变,这些信息是从一些专业的VAB群中得来,感谢群里的兄弟支持).源码往下拉,供学习交流之用.后边有时间再做word的. 描述: 对Excel常用操作封装类,适用于Microexcel.W

C# Office Excel

读取Excel文件 // 读取Excel返回DataTable (简略版 不能读取合并格) // 如果文件第一行是数据不是说明 // 请插入一行 内容随便填 不能为空 public DataTable GetTableFromExcell(string commandText) { // 连接字符串 (不明白的,请查找 App.config 配置数据库连接字符串) string connectionString = System.Configuration.ConfigurationSettin

Microsoft Office Excel 不能访问文件及COM无法访问

Microsoft Office Excel 不能访问文件及COM无法访问 Microsoft Office Excel 不能访问文件“*.xls”. 可能的原因有: 1 文件名称或路径不存在. 2 文件正被其他程序使用. 3 您正要保存的工作簿与当前打开的工作簿同名. 莫名的错误,在本机调试一切正常,可是一旦部署到服务器,就无法访问了…… 查了些资料,看到大家都碰到这个问题 解决方案 即在C:\Windows\System32\config\systemprofile和C:\Windows\S

Macbook 修复Office Excel 异常问题

manbook 版本的office excel 在一次崩溃后,每次打开excel 文件都会弹出以下烦人的错误告警,并且每次都会重新打开很多过去保存过的excel 文件. "在应用程序意外退出之前,Excel 已保存了对文件的更改." 修复方法 用户直接在平时使用的mac 用户下,使用shell 执行以下命令 cd ~/Library/Group Containers/UBF8T346G9.Office rm -f MicrosoftRegistrationDB.reg 参考: http

Excel 公式集

1.  Excel 公式集 1.查找重复内容公式:=IF(COUNTIF(A:A,A2)>1,"重复",""). 2.用出生年月来计算年龄公式:=TRUNC((DAYS360(H6,"2009/8/30",FALSE))/360,0). 3.从输入的18位身份证号的出生年月计算公式:=CONCATENATE(MID(E2,7,4),"/",MID(E2,11,2),"/",MID(E2,13,2)).

利用数学化学绘图工具增益集进行二次函数描点

有数学老师来信问到:如果要在直角座标上进行二次函数值描点应该怎么做? 将描点连线 操作步骤如下: ????? 欢迎引用,请注明来源出处! 作者:杨焕谋 原文:大专栏  利用数学化学绘图工具增益集进行二次函数描点 原文地址:https://www.cnblogs.com/chinatrump/p/11490968.html

读写Excel、WORD等微软OLE2组件文档的项目

NPOI 是?POI?项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写. ? Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: HSSF - 提供读写Microsoft Excel XLS格式档案的功能. XSSF - 提供读写Microsoft