You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Word或LibreOffice Writer中自动将多页DOC/DOCX文档按页拆分保存为独立的DOC/DOCX文档?

如何在Word或LibreOffice Writer中自动将多页DOC/DOCX文档按页拆分保存为独立的DOC/DOCX文档?

我之前刚好处理过类似的需求,给你分享两种主流办公软件的解决方案,都是用软件内置功能实现,完全不用转PDF,直接生成独立的DOC/DOCX文件:

一、Microsoft Word 2019(及更高版本):用VBA宏实现原生拆分

Word本身没有自带一键拆分页面的按钮,但可以用内置的VBA宏来完成自动拆分,全程不用离开Word,步骤很清晰:

  1. 打开你要拆分的多页Word文档
  2. 按下快捷键 Alt + F11 打开VBA编辑器
  3. 在左侧的「项目」面板里,右键点击当前文档的名称,选择「插入」→「模块」
  4. 将下面的代码粘贴到弹出的模块编辑窗口中
  5. 按下 F5 或者点击编辑器工具栏的绿色运行按钮,执行宏
Sub SplitDocumentByPages()
    Dim docOriginal As Document
    Dim docNew As Document
    Dim pageNum As Integer
    Dim totalPages As Integer
    Dim savePath As String
    
    Set docOriginal = ActiveDocument
    totalPages = docOriginal.ComputeStatistics(wdStatisticPages)
    savePath = docOriginal.Path & "\" ' 拆分后的文件会保存在原文档所在文件夹
    
    For pageNum = 1 To totalPages
        ' 创建新的空白文档
        Set docNew = Documents.Add
        ' 定位并复制原文档当前页面的内容
        docOriginal.Range( _
            Start:=docOriginal.GoTo(What:=wdGoToPage, Name:=pageNum).Start, _
            End:=docOriginal.GoTo(What:=wdGoToPage, Name:=pageNum + 1).Start - 1 _
        ).Copy
        
        ' 粘贴内容并保留原格式
        docNew.Content.Paste
        docNew.Content.PasteAndFormat wdFormatOriginalFormatting
        
        ' 保存新文档,文件名可自定义,这里是「页面_数字.docx」
        docNew.SaveAs2 Filename:=savePath & "页面_" & pageNum & ".docx", FileFormat:=wdFormatXMLDocument
        docNew.Close SaveChanges:=wdDoNotSaveChanges
    Next pageNum
    
    MsgBox "拆分完成!所有文档已保存到:" & savePath
End Sub

小提示:

  • 如果需要保存为DOC格式,把代码里的 wdFormatXMLDocument 改成 wdFormatDocument 即可
  • 首次运行宏可能会被Word的安全机制拦截,你可以在「文件」→「选项」→「信任中心」→「信任中心设置」→「宏设置」里临时选择「启用所有宏」,运行完成后记得改回默认设置更安全
  • 文件名格式可以自己修改,比如改成 客户文档_ & pageNum & .docx 这样的自定义名称

二、LibreOffice Writer:用内置Basic脚本拆分

LibreOffice Writer同样可以用自带的脚本工具实现自动拆分,步骤如下:

  1. 打开要拆分的Writer文档
  2. 点击顶部菜单「工具」→「宏」→「组织宏」→「LibreOffice Basic」
  3. 在弹出的窗口中,选择当前打开的文档,点击「新建」,给模块起个名字(比如SplitPages
  4. 将下面的代码粘贴到编辑器中
  5. 点击编辑器顶部的绿色运行按钮执行脚本
Sub SplitWriterDocumentByPages()
    Dim oDoc As Object
    Dim oPageCursor As Object
    Dim oNewDoc As Object
    Dim oTextRange As Object
    Dim totalPages As Integer
    Dim i As Integer
    Dim savePath As String
    
    oDoc = ThisComponent
    totalPages = oDoc.CurrentController.PageCount
    ' 获取原文档所在路径,拆分后的文件保存在这里
    savePath = oDoc.getURL().Left(oDoc.getURL().LastIndexOf("/") + 1)
    
    For i = 1 To totalPages
        ' 创建新的空白Writer文档
        oNewDoc = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Array())
        ' 定位到当前页面的起始和结束位置
        oPageCursor = oDoc.CurrentController.PageCursor
        oPageCursor.jumpToPage(i)
        oPageCursor.jumpToEndOfPage()
        Dim endPos As Long
        endPos = oPageCursor.getPosition()
        oPageCursor.jumpToStartOfPage()
        Dim startPos As Long
        startPos = oPageCursor.getPosition()
        
        ' 提取当前页面的文本范围并复制到新文档
        oTextRange = oDoc.Text.createTextRangeByStartEnd(startPos, endPos)
        oNewDoc.Text.insertTextContent(oNewDoc.Text.End, oTextRange, False)
        
        ' 保存为DOCX格式,文件名自定义为「页面_数字.docx」
        Dim fileName As String
        fileName = savePath & "页面_" & i & ".docx"
        Dim args(1) As New com.sun.star.beans.PropertyValue
        args(0).Name = "FilterName"
        args(0).Value = "Office Open XML Text" ' 指定保存为DOCX格式
        oNewDoc.storeAsURL(fileName, args())
        oNewDoc.close(True)
    Next i
    
    MsgBox "拆分完成!所有文档已保存到:" & savePath
End Sub

小提示:

  • 如果需要保存为DOC格式,把代码里的 "Office Open XML Text" 改成 "MS Word 97" 即可
  • 脚本默认把文件保存在原文档所在的文件夹,你也可以手动修改savePath变量的值来指定其他路径

这两种方法都是完全依托软件自身功能,不需要额外安装工具,也不用转PDF,能最大程度保留原文档的格式和编辑属性,比你之前的PDF拆分流程高效很多。

备注:内容来源于stack exchange,提问作者BsAxUbx5KoQDEpCAqSffwGy554PSah

火山引擎 最新活动