昨天接到一个任务要将pdf中的表格转成excel,打开一看pdf有一百多页,看来手打是不可能了,只能想办法处理。

由于我拿到的PDF是这样的,第一步先把PDF转成word形式,我这里使用的是Adobe Acrobat,也可以使用wps等软件,转换完后效果如下:

发现还有个小问题,就是每页都有个大水印,这个水印由于是从pdf中转换来的,不是word里添加的,所以在word中关闭水印并不能处理这个问题。

双击水印发现其实是艺术字,学习网上方法采用VBA编写宏批量删除艺术字,代码如下:

Sub 删除艺术字()
    Dim sh As Shape
    For Each sh In ActiveDocument.Shapes
        If sh.Type = msoTextEffect Then
        sh.Delete
    End If
End Sub

具体使用方法是点击视图-宏,然后在弹出的窗口中点创建,点完就会弹出VBA的编辑器,将代码粘进去即可,使用宏的时候在刚才点创建的窗口点执行即可。

艺术字就顺利删除了(ps:可能会有个别骨骼惊奇的艺术字没被删掉,多执行几遍还没被删掉的智只能手动删除)

下一步是将word中的表格转换成Excel,我们先将word保存成mht格式,点击文件-另存为,在弹出的窗口保存类型选择单一文件网页。

之后在保存的位置就有这个文件了,下一步打开Excel,点击文件-打开,打开刚才我们保存的mht文件,将表格选中复制,粘贴到新的Excel文件中,效果如下:

发现效果非常不好啊,一个格子里面由很多小格,格子里的一段话还分布在不同小格里,直接合并单元格会只保留最左上单元格的内容,同一个格子里的一段话势必会缺失很多,如果人工操作不知道要搞到猴年马月。

因此我把目光转向了宏,之前从没用过宏,经过网上学习,写出了第一个宏,可以将选中区域合并单元格的同时内容全部保留拼接起来

Sub 合并()
	Application.DisplayAlerts = False  '关闭提醒
    SelectionSum = ""
    For Each cell In Selection  '遍历选取区域的单元格
        SelectionSum = SelectionSum & cell.Value  '将单元格内容拼接起来
    Next cell
    Selection(1, 1).Value = SelectionSum  '将拼接后内容赋值给单元格
    Selection.Merge '合并
    Application.DisplayAlerts = True  '开启提醒
End Sub

在Excel中使用宏比Word复杂些,第一次使用首先要点击文件-选项-自定义功能区,然后在右边勾选开发工具

之后关掉窗口,点击开发工具-录制宏,在弹出的窗口随便起名,然后点击停止录制,再点击旁边的宏,弹出的窗口就能看见刚才录制的宏,点击编辑即可进入VBA代码编辑器,将上述代码粘进去即可,再点击宏,选中你的宏后点击执行就可以。

但随后我发现用这个宏手动合并还是太低效了,观察发现每个要合并的格子周围都有黑色框线,于是想到通过识别框线来实现全局的自动化合并,经过半小时的网上学习,写出如下代码:

Sub 全局合并()
' 全局合并 宏
    Application.DisplayAlerts = False
    Dim k%, rng As Range, x%, first%, last%, col%
    For col = 4 To ActiveSheet.UsedRange.Columns.Count Step 1
        For k = ActiveSheet.UsedRange.Rows.Count To 1 Step -1
            x = 0
            If Cells(k, col).Borders(xlEdgeLeft).LineStyle = 1 And Cells(k, col).Borders(xlEdgeRight).LineStyle = 1 Then
                If Cells(k, col).Borders(xlEdgeTop).LineStyle = 1 And Cells(k, col).Borders(xlEdgeBottom).LineStyle = xlNone Then
                    first = k
                    x = x + 1
                    SelectionSum = ""
                    For Each cell In Cells(k, col).Resize(last - first + 1, 1)
                        SelectionSum = SelectionSum & cell.Value
                    Next cell
                    Cells(k, col).Value = SelectionSum
                    Cells(k, col).Resize(last - first + 1, 1).Merge
                End If
                If Cells(k, col).Borders(xlEdgeTop).LineStyle = xlNone And Cells(k, col).Borders(xlEdgeBottom).LineStyle = xlNone Then
                    x = x + 1
                End If
                If Cells(k, col).Borders(xlEdgeTop).LineStyle = xlNone And Cells(k, col).Borders(xlEdgeBottom).LineStyle = 1 Then
                    x = x + 1
                    last = k
                End If
            End If
        Next k
    Next col
    Application.DisplayAlerts = True
End Sub

代码好长我懒得写注释了,说下大致思路,我这个表格所有要合并的项都是n行1列,所以双层循环,外层遍历每一列,内层遍历每一行。细节是行遍历从下往上方便些,因为每次合并操作会导致操作单元格下方内容变化,自上而下会影响遍历。分支条件为判定单元格有左右下框线且没上框线时记录为底端位置(last),只有左右框线时不操作,有左右上框线且没有下框线时记录为顶端位置(first),并且在底端位置和顶端位置之间进行内容拼接和合并操作。

最终结果效果成功实现,就截一部分吧,打码太累了

第一次尝试使用宏,体验很好,下次还来

发现网上有专门做文档格式 换的网站,不过是要充会员才可以。今天来做一篇 PDF 换成 Excel 文档的代码实战,希望大佬喜欢,哈哈,话不多说,马上进入实战环节。 【阅读全文】 首先,我们一如既往的介绍一下需要用到的第三方库。 import pdf plumber # 专门 处理 PDF 文档格式的文件对象 import pandas as pd # 数据 处理 库,常见的DtaFrame、Series数据对象 处理 然后,再把相应的 PDF 数据提取出来并且保存在DataFrame数据对象中。 # 打开 PDF 文件、得到PD
VBA 是Visual Basic for Applications的缩写,用于微软Office项目的编程语言。 VBA 开发人员可以编写 VBA 代码来自动完成复杂任务,可以大大提高工作效率。在日常工作中,我们常常需要将 Excel 文件 换为 PDF 格式,以便在不同平台上共享和传递。手动将每个 Excel 文件 换为 PDF 格式是非常繁琐的,因此 使用 VBA Excel 文件批量 换为 PDF 格式是非常有用的。 使用 VBA 批量 Excel 文件为 PDF 的主要步骤如下: 1.打开需要 换的 Excel 文件所在的目录。 2.遍历目录中的每个 Excel 文件, 使用 VBA 代码将其 换为 PDF 格式。 3.保存 换后的 PDF 文件。 在这个过程中,需要 使用 VBA 的文件操作和打印功能。文件操作需要 使用 FileSystemObject或Dir函数。打印功能可以 使用 PrintOut方法或 Pdf Creator等第三方库。 以下是一个简单的 VBA 代码示例,演示如何批量将 Excel 文件 换为 PDF 。代码中假设所有的 Excel 文件都保存在同一个文件夹中。 Sub ConvertTo PDF () Dim myPath As String Dim myFile As String Dim Wb As Workbook '指定文件夹的路径 myPath = "C:\Users\MyFolder\" '获取文件夹中的第一个文件名 myFile = Dir(myPath & "*.xlsx") '遍历所有文件 Do While myFile <> "" '打开工作簿 Set Wb = Workbooks.Open(myPath & myFile) '将工作簿另存为 PDF 文件 Wb.ExportAsFixedFormat Type:=xlType PDF , Filename:= _ myPath & Replace(myFile, ".xlsx", ". pdf "), Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False '关闭工作簿 Wb.Close SaveChanges:=False '获取文件夹中的下一个文件名 myFile = Dir End Sub 这个 VBA 代码示例非常简单,只是将 Excel 文件 换为 PDF 格式并保存在同一个文件夹中。但是,根据具体需求,可以进一步优化代码以满足不同的 换需求。