V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
metorm
V2EX  ›  分享创造

HTD:另辟蹊径,一劳永逸解决各种花式 Word 报表需求

  •  
  •   metorm · 2018-06-15 18:39:34 +08:00 · 2758 次点击
    这是一个创建于 2113 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先放链接

    介绍博文

    Github 仓库地址

    背景

    众(猿)所周知,机关单位们定制软件时,十分钟情于使用软件直接生成Word报表,并且最好还是*.doc格式的,连*.docx都十分排斥,至于什么*.odt*.html甚至Markdown,最好提都别跟他们提。

    然而*.doc又是十分难搞的一个东西,格式不开放所以很难直接生成。不买商业解决方案的前提下,唯一靠谱的直接思路就是通过COM接口去调用本机安装的Word来生成,具体过程有多麻烦,去搜下有多少相关的提问就知道了。

    最近又有类似需求,苦恼两天后,突然想到,调用COM接口向Word中写入各种富文本很难,但调用它打开个*.html再另存为一下能有多复杂?同时,既然允许用HTML了,什么花式报表格式调不出来呢?也许交叉引用、样式一类的做不出来,但这类需求不是*.doc党们轻易能想到的。

    一番搜索之后,很快利用QTActiveX模块做成了一个小工具,作用就是打开一个Word兼容的文件,再将其另存为任意Word所支持的格式,包括但不限于*.doc,*.rtf等。默认没支持*.docx,因为觉得*.docx更好更专业的办法去生成。

    一个特色:由于某些报表很宽,必须将纸张设置为横向才能正常显示。此软件加入了一个专门的选项应对该种情况。这一功能是投机取巧地将输出的*.html文件改名为*.doc所不能实现的。

    软件发布

    软件开源发布在 Github 上,点此查看

    代码量很小,加上各种错误检测也仅仅是两个源码文件。懒得自己编译的话也可以直接下载预编译的版本([支持 WinXP]( http://www.tiger2doudou.com/blog/post/metorm/Windows-XP 下编译 C-14 程序手记),静态链接了QT,仅仅待了三个MinGW的动态库,相当的绿色)。

    HTD

    HTD 是一个绿色小工具,用于将 Html 文档转换到 Microsoft Word 兼容格式。

    理论上也应该适用于其它 Word 软件可接受的格式,例如* rft,* .txt 等。

    使用

    帮助信息:

    INFO: For latest version or other information, visit https://github.com/metorm/HTD
    Usage: HTD.exe [options] input output
    Html to Microsoft Word converter
    
    Options:
      -?, -h, --help   Displays this help.
      -l, --landscape  Set the paper orientation to landscape
    
    Arguments:
      input            Full path to the HTML file (or any other parsable formats of
                       MS Word). Only ASCII characters are allowed.
      output           Full path to the output file. Only ASCII characters are
                       allowed.
    
    

    注意: 路径必须是全路径。不能有中文或其它非 ASCII 字符.

    *.html 转换到 *.doc

    操作十分简单:

    C:\Documents\dev\build-HTD-Static-Release\release>HTD.exe C:\Documents\webpage\111.html C:\Documents\webpage\111_.doc
    input: C:\Documents\webpage\111.html
    output: C:\Documents\webpage\111_.doc
    FINISHED
    

    注意: 输入 /输出路径不能仅有后缀名不同. 例如: HTD.exe C:\Documents\webpage\111.html C:\Documents\webpage\111.doc 将使得 Word 引擎抛出异常, 而HTD.exe C:\Documents\webpage\111.html C:\Documents\webpage\_111.doc则可以正常工作.

    转换其他格式

    直接在输入输出路径中传递你想要的后缀名即可,例如:

    HTD.exe C:\Documents\webpage\111.doc C:\Documents\webpage\_111.rtf

    设置输出文件的纸张方向

    有时候你可能在你的 html 文件中有很宽的内容。 如果普通 A4 纸张的宽度不足以容纳您的页面,请附加-l,--landscape选项,以将纸张方向设置为横向。

    编译

    本程序很小,编译十分简单。 只需下载 /克隆源代码并使用Qt Creator打开、编译即可。 除了QT本身之外,没有任何依赖。 但是在安装或自行编译QT时,必须选择qtactiveqt模块。

    如果没有开发需求,建议直接使用预编译的二进制文件。所发布的文件兼容于 Windows XP 或以上版本,并静态链接了 QT 运行库。

    第 1 条附言  ·  2018-06-15 19:33:20 +08:00

    同志们,不带光收藏不Star的啦

    5 条回复    2018-07-04 22:24:48 +08:00
    loading
        1
    loading  
       2018-06-15 19:09:55 +08:00 via iPhone
    不错,我以前使用 python 直接调用 word,替换我自定的模板标签,毕竟 word 的格式不能改动。
    mikac
        2
    mikac  
       2018-06-15 20:48:25 +08:00
    Mark
    geelaw
        3
    geelaw  
       2018-06-15 20:59:56 +08:00
    COM 怎么会很麻烦? VBA 和 VBS 都没用过吗?

    我看了一下您的代码,就是用 Qt 帮你做的 IDispatch 包装接口去调用,使用 VBS、JScript 和 VBA 明显更简单。而且怎么也算不上 portable,毕竟你需要 host 有 Word 才行,如果你有 Word,不如直接 VBA、VBS、JScript 或者 PowerShell。

    通常来说企业内的 solution 会直接从数据源( Excel )使用 VBA 生成可打印结果,可以参考何明科先生的知乎回答。
    metorm
        4
    metorm  
    OP
       2018-06-15 21:19:40 +08:00
    @geelaw 我这边搞的是基于 QT/C++的工程计算软件,并且追求尽可能跨平台,用这个方法做到了主程序与 Word 模块的解耦。

    此外,带脚本就得考虑运行环境。研究所的运行环境由于不可描述的原因,带 VBS 这一类有可能因为安全问题无法运行。VBA 一是我确实不会(现在也不清楚从 QT 调用 VBA 是个什么操作),二是也不想在现有的 CMake 编译系统中引入 VB。
    metorm
        5
    metorm  
    OP
       2018-07-04 22:24:48 +08:00
    今天更新了一个版本。主要是兼容性问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3254 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 11:48 · PVG 19:48 · LAX 04:48 · JFK 07:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.