从 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 文档中复制文本,该文档应该处于打开状态并且处于活动状态,您就可以开始了。还有其他方法可以做到这一点。
我有要传输到 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 文档中复制文本,该文档应该处于打开状态并且处于活动状态,您就可以开始了。还有其他方法可以做到这一点。