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

fra*_*lau 7 python excel openxml pandoc python-docx

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

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

只要可以使用python API包装,就可以使用以其他语言编写的组件(例如bash脚本).

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

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

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

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

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

在此页面上可能会找到一些线索.

笔记

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

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

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

  1. 转换Excel_Sheet_1.xlsx为图像(如何知道图像和单元格区域是图像的一部分?).
  2. 调整document.xml以使其显示"指向图像"而不是指向嵌入文件.

OOXML相当复杂,特别是当你尝试做一些像我想做的那样"基本"的事情时......有没有人从Unix平台走到那里并带回一些明智的东西?

san*_*ica 2

正如您在OP中提到的,我会采用“反汇编-汇编”方式mydoc.docx,即:

  1. 从 中提取 Excel 工作表mydoc.docx。我假设它是一个嵌入式工作表,它肯定可以轻松适应工作表是链接的外部xlsx. 就我而言,工作表位于结构word\embeddings\Microsoft_Excel_Worksheet1.xlsx内部docx。正如您所说,一种方法是复制到结构mydoc.docx中,然后从结构中mydoc.zip提取。Microsoft_Excel_Worksheet1.xlsxmydoc.zip

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

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

    2. unoconv导出到时报告了错误png,例如。您可能需要分两步导出到目标格式,pdf然后转换为png/ jpg,例如使用convert. 这可能因版本而异。在我的版本中,电子表格可以导出的唯一图形格式是pdf,因此两步转换成为强制性的。请注意,您可能必须使用-crop选项convert,因为 pdf 导出会生成整页。

    3. 您必须unoconv在您的系统中安装。

    4. 您可以选择要导出的页面范围,据
      unoconv -f pdf -d spreadsheet -e PageRange=1-1 Microsoft_Excel_Worksheet1.xlsx
      我尝试,导出整个非空单元格范围,并且不可能使用 导出部分内容unoconv。一个可能的解决方法是折叠openpyxl您不想显示的单元格范围,然后导出。

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

  1. 替换Microsoft_Excel_Worksheet1.xlsx为创建的图像

注意:这是可以在 Excel 工作表上执行各种操作的 pyhton 模块列表。

pyExcelerator(显然不再维护)

xlwt(的一个分支pyExcelerator

开放式pyxl