我正在使用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
Mydoc/word/embeddings/Excel_Sheet_1.xlsx
(或类似的东西)中。如果这是要走的路,那么问题将分为两部分:
Excel_Sheet_1.xlsx
转换为图像(如何知道图片和单元格区域是图像的一部分?)。document.xml
,使其显示"指向图像"而不是指向嵌入的文件。OOXML相当复杂,特别是当你尝试做一些事情时,基本的"正如我想要做的那样......有没有人从Unix平台走到那里并带回一些合理的东西?
答案 0 :(得分:2)
正如你在OP中提到的那样,我会去#"反汇编 - 装配" mydoc.docx
的方式,即:
从mydoc.docx
中提取Excel工作表。
我将假设它是一个嵌入式工作表,它可以很容易地适应工作表是链接外部xlsx
的情况。
就我而言,工作表位于word\embeddings\Microsoft_Excel_Worksheet1.xlsx
结构内的docx
。
如您所说,一种方法是将mydoc.docx
复制到mydoc.zip
,并从Microsoft_Excel_Worksheet1.xlsx
结构中提取mydoc.zip
。
将Microsoft_Excel_Worksheet1.xlsx
转换为图片。
由于缺少win API,这在Linux下似乎不是一项简单的任务。
例如,excel2img需要pywin32。
解决方法是使用unoconv
将xlsx
转换为合适的格式。
这里的选择很多。请注意:
您可能需要在python中将其作为外部命令运行。这不是问题,但是你的python脚本应该确定主机操作系统,然后决定是使用unoconv
(对于Linux)还是更多"标准"解决方案(适用于Windows,超出OP的范围)。
请注意unoconv
是用python编写的,所以也许你可以在脚本中以某种方式将它集成。
unoconv
时,png
的 Bugs were reported,例如。您可能需要分两步执行导出到目标格式,pdf
然后转换为png
/ jpg
,例如与convert
。
这可能因版本而异。在我的版本中,可以导出电子表格的唯一图形格式是pdf,因此两步转换成为必需的。
请注意,您可能必须使用-crop
的{{1}}选项,因为pdf导出会生成整页。
您必须在系统中安装convert
。
您可以选择要导出的页面范围,如
unoconv
据我所知,导出了整个非空单元格范围,并且不可能使用unoconv -f pdf -d spreadsheet -e PageRange=1-1 Microsoft_Excel_Worksheet1.xlsx
导出部分单元格。
一个可行的解决方法是using openpyxl
to fold cell ranges您不想显示,然后导出。
这是问题的本质("目标是使用python将那些嵌入的Excel对象转换为图像。")
unoconv
。注意:这是可以在Excel工作表上执行各种操作的pyhton模块列表。
pyExcelerator(显然不再维护了)
xlwt(Microsoft_Excel_Worksheet1.xlsx
的一个分支)