妈的在写这篇文章前,先自己感慨一下,觉得自己写代码有的时候挺特么撒比的。
也有的时候脑袋挺会随机应对的。
今天下班前老板提了一个EXCEL导出PDF的需求给我,让我明天做,他让我用VBA做,VBA实现起来比较简单。
但是我不会VBA,不想再去学。但是 用我一贯的VC++做,我又不会COM组件代码里怎么写EXCEL当前sheet导出PDF。
其他第三方操作EXCEL的库我也不想考虑,因为之前所有的代码都是拿熟悉的COM组件写的。
虽然不会,但是我还是觉得VC++是可以实现的。于是下班回到家就开始百度,到处搜,也到处翻以前买的VC++书籍。
书上没找到相关的代码,网上也没有搜到现成的代码,拿来抄抄。
但是也搜到一些蛛丝马迹,我总觉得写代码就跟刑警破案一样了,接到一桩凶杀案(一个项目需求),开始查看现场并四处走访调查搜集资料(到处百度翻书问别人),
找到各种蛛丝马迹(百度到的零碎代码),汇总起来思考加上灵感(代码整合加逻辑梳理),最后破了案(项目做出来了)。
我感觉我比喻的还是比较形象的。
- 下面说说我今天找到的蛛丝马迹
首先百度上,能百度到的相关内容真的不多。你们可以试试。
现成的代码感觉就没有,都是COM组件读写EXCEL的,也没什么人写EXCEL导出PDF的。
是有那么一两个,但是我照着做又没做出来。
https://www.cnblogs.com/MakeView660/p/6929982.html
https://blog.csdn.net/qq_35216087/article/details/107345271
我感觉应该是他们这个EXCEL版本太老了,所以我做不出来,我是EXCEL2016
- 我找到的有用的资料
1.微软官网关于EXCEL VBA相关的类可以参考下
https://docs.microsoft.com/zh-cn/office/vba/api/excel.workbook.exportasfixedformat
2.自己去录制个VBA在EXCEL里参考下
找到这两个蛛丝马迹后,我又研究了半个小时才想出来。
- 研究思路
1.由上知道了肯定是用Workbook.ExportAsFixedFormat方法了
2.用VC++去调方法看一下
void ExportAsFixedFormat(long Type, VARIANT& Filename, VARIANT& Quality, VARIANT& IncludeDocProperties, VARIANT& IgnorePrintAreas, VARIANT& From, VARIANT& To, VARIANT& OpenAfterPublish, VARIANT& FixedFormatExtClassPtr) { static BYTE parms[] = VTS_I4 VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT; InvokeHelper(0x9bd, DISPATCH_METHOD, VT_EMPTY, NULL, parms, Type, &Filename, &Quality, &IncludeDocProperties, &IgnorePrintAreas, &From, &To, &OpenAfterPublish, &FixedFormatExtClassPtr); }
确实调出来这个方法。
3.里面的参数输入什么,到这里其实看上面的微软帮助就可以猜到输入什么了。
第一个必选参数Type要给一个long类型,0(PDF)和1(XPS)
第二个参数给个导出路径
剩下的参数都是可选的,不设置,用covOptional就行了,至于为什么用covOptional,对不起,我不知道,我在猜的。因为在我之前
写OPEN的时候也是用了这个,从别人博客上抄的
lpDisp = ExcelBooks.Open(filePath, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional); if (lpDisp == NULL)
4.最后EXCEL导出PDF的完整代码(就一段)
//EXCEL->PDF int ExcelApi::Excel2Pdf(const char* ExcalPath) { ExcelBook.ExportAsFixedFormat(0, COleVariant(ExcalPath), covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional); return 0; }
- 演示
这里是我封装好的所有VC++ COM组件操作EXCEL的代码,基本上常用的功能都有了,后续我会不断补充更新进去的。
https://www.cnblogs.com/nxopen2018/p/11055161.html
Caesar卢尚宇
2021年2月19日