如何在Word或LibreOffice Writer中自动将多页DOC/DOCX文档按页拆分保存为独立的DOC/DOCX文档?
如何在Word或LibreOffice Writer中自动将多页DOC/DOCX文档按页拆分保存为独立的DOC/DOCX文档?
我之前刚好处理过类似的需求,给你分享两种主流办公软件的解决方案,都是用软件内置功能实现,完全不用转PDF,直接生成独立的DOC/DOCX文件:
一、Microsoft Word 2019(及更高版本):用VBA宏实现原生拆分
Word本身没有自带一键拆分页面的按钮,但可以用内置的VBA宏来完成自动拆分,全程不用离开Word,步骤很清晰:
- 打开你要拆分的多页Word文档
- 按下快捷键
Alt + F11打开VBA编辑器 - 在左侧的「项目」面板里,右键点击当前文档的名称,选择「插入」→「模块」
- 将下面的代码粘贴到弹出的模块编辑窗口中
- 按下
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同样可以用自带的脚本工具实现自动拆分,步骤如下:
- 打开要拆分的Writer文档
- 点击顶部菜单「工具」→「宏」→「组织宏」→「LibreOffice Basic」
- 在弹出的窗口中,选择当前打开的文档,点击「新建」,给模块起个名字(比如
SplitPages) - 将下面的代码粘贴到编辑器中
- 点击编辑器顶部的绿色运行按钮执行脚本
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




