C# 将Word文档拆分为较小的文档

C# 将Word文档拆分为较小的文档,c#,.net,ms-word,C#,.net,Ms Word,我希望用户能够上传word文档,然后我的程序将文档解析为单独的word文档。问题是拆分需要手动进行,因为所有word文档的格式都不相同。我最初的想法是,在用户上传之前,用户用一个开始和结束标记(某种形式可能是注释)来标记这些部分,然后我的程序可以解析这些部分并将其拆分为单独的文档。(这也需要适用于.doc和.docx,因此需要一个通用的解决方案) 例如输入: Doc1 第一章 废话废话 第二章 废话 /end Doc1 例如:产出: Doc1 第一章 废话废话 /end Doc1 文件2 第二章

我希望用户能够上传word文档,然后我的程序将文档解析为单独的word文档。问题是拆分需要手动进行,因为所有word文档的格式都不相同。我最初的想法是,在用户上传之前,用户用一个开始和结束标记(某种形式可能是注释)来标记这些部分,然后我的程序可以解析这些部分并将其拆分为单独的文档。(这也需要适用于.doc和.docx,因此需要一个通用的解决方案)

例如输入:

Doc1

第一章

废话废话

第二章

废话

/end Doc1

例如:产出:

Doc1

第一章

废话废话

/end Doc1

文件2

第二章

废话

/end Doc2


有什么想法吗?我已经为此奋斗了一段时间

我认为最好的办法是研究VSTO或VBA宏来实现这一点。无论文档的版本是什么,这两种方法都可以让您完全访问对象模型。

您想做的是非常重要的!我已经做了相当多的文档操作,也就是说,如果您现在使用的是DOCX,那么由于支持库的缘故,这还不算太糟糕,请参见:

旧版本变得更加困难,您需要为此提供一个库,或者按照建议使用宏


“计划”是一个网站吗?如果是这样,请确保不要使用COM互操作

HTML传输可能会有所帮助。这是一个非常旧的软件,非常昂贵,从最初的搜索来看,它可能不再受支持。但是,它确实有能力将一个Word文档分割成更小的部分(当然,它也将其转换为HTML)。也许是要调查一下。谷歌“HTML传输”进行更多研究和免费演示。

我在文档操作和生成方面取得了巨大成功。

VBA宏将文件拆分为子文档

子更新文档()

Application.ScreenUpdate=False
Dim STRFOLD作为字符串,strFile作为字符串,wdDoc作为文档
strFolder=GetFolder
如果strFolder=“”,则退出Sub
strFile=Dir(strFolder&“\*.doc”,vbNormal)
而strFile“”
设置wdDoc=Documents.Open(文件名:=strFolder&“\”&strFile,AddToRecentFiles:=False,可见:=False)
使用wdDoc
'调用其他宏或在此处插入其代码
"突破",
wdDoc.Activate
ActiveDocument.ActiveWindow.View.Type=wdOutlineView
健康的选择
选择,复制
ActiveDocument.Subdocuments.AddFromRange范围:=Selection.Range
ActiveDocument.SaveAs“C:\Data\Split\”&ActiveDocument.Name
ActiveDocument.Close SaveChanges:=True
以
strFile=Dir()
温德
设置wdDoc=Nothing
Application.ScreenUpdating=True
端接头
函数GetFolder()作为字符串
作为对象的文件夹的尺寸
GetFolder=“”
文件夹集=CreateObject(“Shell.Application”).BrowseForFolder(0,
“选择文件夹”,0)
如果(非oFolder为Nothing),则GetFolder=oFolder.Items.Item.Path
文件夹集=无
端函数

我的雇主需要对.doc和.docx进行大量修改。问题是,解决这两个问题都非常困难。在docx中,最好的办法是像解压文件一样解压文档,然后可以在其中处理XML文件。您可以使用样式或自定义样式来了解何时拆分文档或让用户添加一些自定义标记。不幸的是,一个优雅的解决方案是非常困难的。对,我绝对不认为一个自动化的解决方案是可行的。如果用户可以标记卷,那么我会根据他们在上传前标记的内容进行拆分。
    Application.ScreenUpdating = False
    Dim strFolder As String, strFile As String, wdDoc As Document
    strFolder = GetFolder
    If strFolder = "" Then Exit Sub
    strFile = Dir(strFolder & "\*.doc", vbNormal)
    While strFile <> ""
        Set wdDoc = Documents.Open(FileName:=strFolder & "\" & strFile,      AddToRecentFiles:=False, Visible:=False)
        With wdDoc
            'Call your other macro or insert its code here
            'BreakOnSection
            wdDoc.Activate

        ActiveDocument.ActiveWindow.View.Type = wdOutlineView
            Selection.WholeStory
        Selection.Copy
            ActiveDocument.Subdocuments.AddFromRange Range:=Selection.Range
            ActiveDocument.SaveAs "C:\Data\Split\" & ActiveDocument.Name

            ActiveDocument.Close SaveChanges:=True
    End With
    strFile = Dir()
    Wend
    Set wdDoc = Nothing
    Application.ScreenUpdating = True
End Sub

Function GetFolder() As String
    Dim oFolder As Object
    GetFolder = ""
    Set oFolder = CreateObject("Shell.Application").BrowseForFolder(0,     

"Choose a folder", 0)
    If (Not oFolder Is Nothing) Then GetFolder = oFolder.Items.Item.Path
    Set oFolder = Nothing
End Function