从 Word 文档生成有组织的 excel 电子表格

Generating organized excel spreadsheet from a word document

我有要传输到 excel 的 Microsoft 文档。每个句子都需要分开,然后粘贴到 excel 中的下一个适当的单元格中。这些句子还需要作为标题、要求或信息进行分析。 我将重新创建典型的 word 格式的样子

2.3.4     Lightening Transient Response 
          The device shall meet spec 24532. Voltage must resemble figure.
          Figure 1.

转换为

<numbering>      <Heading>
                 <Requirements/information>

在 excel 中,这几乎就是我希望文档看起来的样子,除了第二个要求句子应该在前一个要求句子的正下方。

2.3.4   | Lightening Transient Response     | Heading
        | The device shall meet spec 24532. | Requirement
        |Voltage must resemble figure       | Requirement
        |figure  1                          | Informational

我尝试使用 openxl 和 docx 模块 python 这个项目。我有可以进入单词并获取句子的代码,然后是可以分析 sentence.I' 从段落中检索运行的代码。我遇到了问题,因为由于 word 文档的格式化方式,并非所有句子都会返回。我通常只会返回标题。标题编号不存储在运行中。标题下的要求存储在表中。我已经编写了一些代码来进入表格并从单元格中提取文本,这是获得要求的一种方法,但是该代码片段会产生问题(连续三次给我相同的句子)。

我正在寻找其他可能的方法来做到这一点。我在考虑格式转换。 XML 已被提及,然后 pdf 和 pythons pdf 模块也是可能的。

如有任何想法或建议,我们将不胜感激。

-克里斯

XML 会更难,而不是更容易。你比你想象的更近。我建议分别解决每个问题,直到你破解它。

table中的句子三次问题是因为合并单元格。 python-docx 在 table 上的工作方式,有一个 x 行和 y 列的基础 table 布局。如果合并两个 side-by-side 单元格,则这两个单元格的结果相同。您可以通过比较两个单元格的相等性来检测到这一点。大致像 "if this_cell == last_cell skip this cell".

无法解决标题问题。标题编号仅存在于 Word 的 运行 实例中;它们是在显示(或打印)时生成的。要获得这些,您需要使用相同的规则来生成您自己的号码。因此,您需要跟踪已通过的标题数量等,并形成您自己的 dot-separated 编号。

为什么要为此使用 Python?只需使用 VBA,因为您使用的是 Excel 和 Word。

这样的事情应该会让你离你想去的地方很近。它可能需要一些调整...

Sub Demo()
Dim wdApp As Word.Application
Set wdApp = Word.Application
Dim wdDoc As Word.Document
Set wdDoc = wdApp.ActiveDocument
wdDoc.Range.Copy

ActiveSheet.Paste Destination:=ActiveSheet.Range("A1")
With ActiveSheet
.Paste Destination:=Range("A" & .Cells.SpecialCells(xlCellTypeLastCell).Row + 1)
End With

Set myRange = Range("A1:A100")
For i = 1 To myRange.Rows.Count

    If InStr(myRange.Cells(i, "A").Value, "Voltage") > 0 Then
        myRange.Cells(i, "A").Offset(1, 0).Select
        ActiveCell.EntireRow.Insert
        ActiveCell.Offset(-1, 0).Select
        If InStr(myRange.Cells(i, "A").Value, "Voltage") > 0 Then
            position1 = InStr(1, ActiveCell.Value, "Voltage")
            myRange.Cells(i + 1, "A").Value = Mid(ActiveCell.Value, position1, 99)
            ActiveCell.Value = Left(ActiveCell.Value, position1 - 2)
            i = i + 2
        End If
    End If

Next i


End Sub

因此,从您的 Word 文档中复制文本,该文档应该处于打开状态并且处于活动状态,您就可以开始了。还有其他方法可以做到这一点。