一点背景
我有一个软件规范,我需要以表格的形式解析需求。它们并不总是采用相同的格式。我继承了一个python脚本,它使用win32com来解析word文档,然后使用openpyxl将需求导出到excel文件,然后将其上传到HP ALM。
问题
使用python(或其他一些可以与python通信的语言),我正在寻找一种相对简单易用的方法来区分合并的单元格和空单元格(两者都出现在Microsoft Word文档中)(2010。 DOCX)。
解释
到目前为止,我一直在寻找解决方案,但我还没有找到一个满意的答案。
我已经在stackoverflow上查看了here和here的问题。第二个问题是,有一个字段会告诉你表中是否有合并的单元格,这是一个起点,但还不够,因为表格可能是一个跨越多页的超长表。 / p>
尝试解决方案
尝试1。)我的第一个想法是,win32com肯定支持检测表中的合并单元格。所以我搜索并搜索了可以为我做这个的方法。我发现唯一可行的方法是检查合并的单元格是否为空,而前一个单元格是否为空。但是,我无法判断该单元格是真的空白还是合并。
尝试2。)我的下一个想法是使用COM和win32 API将功能添加到win32com。但是,我发现COM非常笨拙,现在已经过时了,并且超级无证且难以使用。 win32 API也是如此。基本上,我发现这比付出更多的努力。
尝试3。)然后我开始为win32com寻找替代库,例如docx for python。这里的问题是我在非管理员计算机上工作,严重限制了我下载第三方库的能力。因此,我还没有尝试这个选项,因为在获得win32com和openpyxl时我走了这条路。
尝试4。)我最近也可能最终尝试解决这个问题的方法是将docx文档转换成一个我可以轻松解析的XML文件。但是,我不了解XML,也不知道XML使用的标准格式字。
在这里,我现在正在寻找最快,最干净的方法,无需重写库,或从头开始我的1000行脚本。 (顺便说一句,它的显示GUI位于其顶部,这就是为什么它如此之久)
答案 0 :(得分:1)
根据the doc,合并后的单元格在合并后成为一个单元格(unlike excel)。因此,合并单元格的概念在Word中并不存在。检测它们的唯一方法是使用您在问题中链接的帖子中找到的算法分析所有表格。其中包括找到缺少的单元格,这些单元格不存在,因为另一个单元格取代它们(这是合并的结果)。
答案 1 :(得分:0)
如果您决定使用 docx
中的 python-docx
模块(这将是我的建议),合并的单元格在内存中是同一个对象 - 因此,如果您有一排 3 个单元格并且第一个2 合并,row.cells[0] == row.cells[1]
为 True
。鉴于此,我做了两个简单的函数来返回合并单元格的索引。
import docx
def get_indicies_of_uniques(items):
unique_indicies = {}
for index, item in enumerate(items):
if item not in unique_indicies:
unique_indicies[item] = []
unique_indicies[item].append(index)
return unique_indicies
def get_merged_indicies(row):
unique_indicies = get_indicies_of_uniques(row.cells)
return [indicies for indicies in list(unique_indicies.values())
if len(indicies) > 1]
对于行包含3个单元格的情况,前2个被合并,结果如下:
get_merged_indicies(row)
# returns [[0, 1]]
如果您有 2 个合并的单元格、1 个未合并的单元格,然后还有 2 个合并的单元格(一行中总共有 5 个单元格):
get_merged_indicies(row_with_5_cells):
# returns [[0, 1], [3, 4]]
我不确定这样一个函数的结果需要什么格式,但这可能会让你朝着正确的方向开始。