zoukankan      html  css  js  c++  java
  • VC++-OLE/COM将EXCEL导出PDF,ExcelBook.ExportAsFixedFormat

    妈的在写这篇文章前,先自己感慨一下,觉得自己写代码有的时候挺特么撒比的。

    也有的时候脑袋挺会随机应对的。

    今天下班前老板提了一个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日

    作者: 阿飞

    出处: https://www.cnblogs.com/nxopen2018/>

    关于作者:......

    如有问题, 可在底部(留言)咨询.

  • 相关阅读:
    C# List<T>中Select List Distinct()去重复
    Spring.Net 简单入门学习
    [ASP.NET MVC]:
    打车题
    Vue------发布订阅模式实现
    Vue----数据响应原理
    小程序自定义导航栏_navigationStyle
    CleanWebpackPlugin最新版本使用问题
    js-事件函数调用简化
    用XHR简单封装一个axios
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/14417834.html
Copyright © 2011-2022 走看看