【问题标题】:How to convert pdf table to excel without messed up columns?如何将pdf表格转换为excel而不会弄乱列?
【发布时间】:2017-07-21 21:07:23
【问题描述】:

我有一个带有表格的 pdf 文件,我正在尝试将其转换为 Excel 表格。我首先将 pdf 保存为 html 并在 Excel 中使用 import html 来导入表格。但是有些列没有对齐。例如,“FROM”应该在“1”之上,“TO”应该在“2”之上,“FIELD”应该在“S0CCO”之上。但是您可以看到它们在 Excel 中有些混乱。

这只是一个示例,我有包含大量此类表格的 pdf,因此我无法手动调整所有内容。所以我有几个问题:

  1. 有什么方法可以调整它,让所有的列都自动放在正确的位置?
  2. 有没有其他方法可以将包含大量表格(如此表)的 pdf 文件转换为具有右列的 Excel?
  3. 这无关紧要,但我尝试使用 Excel 公式 =importhtml(url,"table",index) 来转换此表。谁能向我解释这个公式的含义?如何判断公式的第二部分是表格还是列表?索引是什么意思?

非常感谢!

【问题讨论】:

  • 可以将pdf文件另存为文本吗?

标签: vba excel pdf


【解决方案1】:

如果PDF文件肯定是表格而不是表格的图像,那么我会使用Word打开文件并将Word文件中的数据提取到excel中。您还应该能够检查表中的值是否正确排列 - 如果不是,则错误在于原始 PDF 创建,而不是您提取的内容。

我现在只有 Office XP 可用,因此未测试此代码,但类似的内容应该可以在较新的版本中使用。
基本上它会:
询问您希望从哪个 Word 或 PDF 文件中提取表格
- 您选择文件
它会将文档内容粘贴到 sheet1(您可以将其删除)
它将创建一个新工作表并逐个单元格提取表格内容
对文档中的每个表重复
(因此,文档中的每个表格都将位于单独的工作表中)

Sub ImportPDFTable()
Dim wdDoc As Object
Dim wdFileName As Variant
Dim wrd As Object
Dim ApplicationIsRunning As Object
Dim IsWordRunning As Boolean
Dim TableNo As Integer
Dim iRow As Long, iCol As Integer, iCount As Integer

    wdFileName = Application.GetOpenFilename("PDF files,*.pdf,Word files,*.doc*", , _
    "Browse for file containing table to be imported")

    If wdFileName = False Then Exit Sub '(user cancelled import file browser)
    Set wrd = CreateObject("Word.Application")
    Set wdDoc = wrd.Documents.Open(wdFileName) 'open PDF file in Word
    wrd.Visible = False

    wrd.Selection.WholeStory
    wrd.Selection.Copy
    ActiveSheet.PasteSpecial Format:="Text" 'optional - pastes whole document for easy checking
    Range("A1").Select

    With wdDoc
        TableNo = wdDoc.tables.Count
        If TableNo = 0 Then MsgBox "This document contains no tables", vbExclamation, "Import Word Table"

        For iCount = 1 To TableNo
            Worksheets.Add
            'Range("A:M").NumberFormat = "@"
            TableNo = iCount
            With .tables(TableNo)
            'copy cell contents from Word table cells to Excel cells
                For iRow = 1 To .Rows.Count
                    For iCol = 1 To .Columns.Count
                        On Error Resume Next
                        Cells(iRow, iCol) = WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
                    Next iCol
                Next iRow
            End With
        Next iCount
    End With

    Set wdDoc = Nothing
    wrd.Quit
    Set wrd = Nothing

End Sub

希望这个有用。

编辑:几乎忘记了查询的最后一部分。 importhtml 不是我熟悉的 Excel 公式/函数。可能您看到了某人创建的自定义函数?我相信 Google 表格确实有一个公式名称 importhtml,但我很少使用该软件。

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2013-10-05
    • 2020-07-05
    • 2017-10-18
    • 2019-11-03
    • 2017-02-13
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多