将docx文件中的嵌入式Excel对象转换为图像

时间:2017-12-15 09:52:27

标签: python excel openxml pandoc python-docx

我正在使用pandoc(通过pypandoc)将docx文件转换为非Windows机器上的markdown。这些文件可以包含图像,也可以包含其他嵌入对象。

pandoc实际上能够将嵌入式Powerpoint演示文稿(转换为EMF文件)转换,但它无法处理Excel对象(它忽略它们)。目标是使用python将那些嵌入的Excel对象转换为图像,以便它们可以作为例如的一部分显示。 HTML输出。

使用用其他语言编写的组件(例如bash脚本)是可以的,只要它们可以用python API包装即可。

我意识到这可能是非Windows平台上的高级订单(即没有Microsoft库,例如win32com)。有没有人对此有任何成功,或有任何有根据的猜测如何进行?

要显示的单元格区域是什么?

所有嵌入对象的核心问题是确定应该显示哪些部分,因为这是核心功能。

必须有一种方法可以确定要显示哪些单元格,因为在读取docx文件的内容时,Word可以使用该信息。

这是问题的症结所在。如果实际算法不能考虑到这一点,那么答案仍然会被接受,只要它提供了一种提取信息的方法。

Some clues might be found on this page

注释

根据建议探索文件本身的结构,这是我观察到的:如果您创建一个带有嵌入式Excel文件的简单docx文档(Mydoc.docx),您可以通过创建一个来检查其内容docx文件的副本(使用.zip扩展名重命名)并解压缩。

  • 文本本身包含在Mydoc/word/document.xml
  • Excel文件包含在Mydoc/word/embeddings/Excel_Sheet_1.xlsx(或类似的东西)中。

如果这是要走的路,那么问题将分为两部分:

  1. Excel_Sheet_1.xlsx转换为图像(如何知道图片和单元格区域是图像的一部分?)。
  2. 调整document.xml,使其显示"指向图像"而不是指向嵌入的文件。
  3. OOXML相当复杂,特别是当你尝试做一些事情时,基本的"正如我想要做的那样......有没有人从Unix平台走到那里并带回一些合理的东西?

1 个答案:

答案 0 :(得分:2)

正如你在OP中提到的那样,我会去#"反汇编 - 装配" mydoc.docx的方式,即:

  1. mydoc.docx 中提取Excel工作表。 我将假设它是一个嵌入式工作表,它可以很容易地适应工作表是链接外部xlsx的情况。 就我而言,工作表位于word\embeddings\Microsoft_Excel_Worksheet1.xlsx结构内的docx。 如您所说,一种方法是将mydoc.docx复制到mydoc.zip,并从Microsoft_Excel_Worksheet1.xlsx结构中提取mydoc.zip

  2. Microsoft_Excel_Worksheet1.xlsx转换为图片。 由于缺少win API,这在Linux下似乎不是一项简单的任务。 例如,excel2img需要pywin32。 解决方法是使用unoconvxlsx转换为合适的格式。 这里的选择很多。请注意:

    1. 您可能需要在python中将其作为外部命令运行。这不是问题,但是你的python脚本应该确定主机操作系统,然后决定是使用unoconv(对于Linux)还是更多"标准"解决方案(适用于Windows,超出OP的范围)。 请注意unoconv是用python编写的,所以也许你可以在脚本中以某种方式将它集成。

    2. 导出到unoconv时,png
    3. Bugs were reported,例如。您可能需要分两步执行导出到目标格式,pdf然后转换为png / jpg,例如与convert。 这可能因版本而异。在我的版本中,可以导出电子表格的唯一图形格式是pdf,因此两步转换成为必需的。 请注意,您可能必须使用-crop的{​​{1}}选项,因为pdf导出会生成整页。

    4. 您必须在系统中安装convert

    5. 您可以选择要导出的页面范围,如
      unoconv
      据我所知,导出了整个非空单元格范围,并且不可能使用unoconv -f pdf -d spreadsheet -e PageRange=1-1 Microsoft_Excel_Worksheet1.xlsx导出部分单元格。 一个可行的解决方法是using openpyxl to fold cell ranges您不想显示,然后导出。

  3. 这是问题的本质("目标是使用python将那些嵌入的Excel对象转换为图像。")

    1. 用创建的图片替换unoconv
    2. 注意:这是可以在Excel工作表上执行各种操作的pyhton模块列表。

      pyExcelerator(显然不再维护了)

      xlwtMicrosoft_Excel_Worksheet1.xlsx的一个分支)

      openpyxl