将Word文档拆分为单独文件的最快方法

时间:2019-11-14 07:24:32

标签: vba ms-word

我正在寻找将一个大文件拆分为多个小文件的最有效方法。每个小文件都是大文件的一小段。 如果大文件有大约100个段落,这不是问题,但是如果超过12k则花费很长时间。

现在,我为每个段落设置书签,然后在新文件中插入每个书签(我设置书签的原因是有时我必须插入多个段落,但是现在我不想使示例复杂化,所以我用段落来描述我的问题。

这是我的代码(它是一个简单的示例,没有额外的逻辑和错误处理)。 创建新文件,然后保存并关闭将花费最多时间。

Private Sub InsertBookmarks()
    Dim p As Paragraph
    Dim counter As Long
    For Each p In ActiveDocument.Paragraphs
        counter = counter + 1
        ActiveDocument.Bookmarks.Add "File" & Format(counter, "00000#"), p.Range
    Next p
    ActiveDocument.Save
    Set p = Nothing
End Sub

Private Sub SplitToSeparateFiles()

    Dim path As String
    Dim doc As Document
    Dim b As Bookmark

    path = ActiveDocument.path & "\"

    WordBasic.DisableAutoMacros
    For Each b In ActiveDocument.Bookmarks
        Set doc = Documents.Add(Visible:=False)
        doc.Range.FormattedText = b.Range
        doc.SaveAs2 FileName:=path & b.Name
        doc.Close wdDoNotSaveChanges
    Next b

    Set b = Nothing
    Set doc = Nothing

End Sub

我考虑过更改代码以在后台使用WordOpenXml处理拆分,但没有找到任何解决方案。 如果有人在.net环境中有任何想法,我可以使用VSTO加载项。

有更有效的方法吗?

1 个答案:

答案 0 :(得分:0)

这是我使用的C#程序的摘录,该程序使用FreeSpire.Doc nuget包读取Word文档。我知道您的问题是VBA,但您最后提到了.NET,所以我认为您不反对在C#或VB中创建内容(vsual Studio应该免费供小时间使用)

        using (Document document = new Document())
        {
            document.LoadFromFileInReadMode(@"C:\temp\word.docx", FileFormat.Docx);

            foreach (Section s in document.Sections)
            {
                int pCount = 0;
                foreach (Paragraph p in s.Paragraphs)
                {
                    File.WriteAllText(@"c:\temp\p"+pCount+".txt", p.Text);
                    pCount++;
                }
            }
        }

我不希望花费数小时来编写12,000个文件,但是我没有一个包含12,000个段落的word文档来进行测试;让我知道你的结果吗?

编辑:

以下程序在41秒内在配备SSD的Core i7上创建了12000个文件:

using System;
using System.IO;

namespace ConsoleApp4
{
    class Program
    {

        static void Main()
        {
            for(int i = 0; i < 12000; i++){
                File.WriteAllText(@"c:\temp\x\" + i + ".txt", Guid.NewGuid().ToString());
            }
        }

    }
}

使用它作为基准,并假设最多可能需要一分钟来加载大量文档,我希望一个进行拆分的.NET应用程序在使用成千上万个单词的Word文档上花费几分钟段落

Edit2:

创建Word文件。如果您要从源中读取每个段落并使用相同的段落制作一个新文档(尝试将旧段落分配给新文档),则实际过程可能是这样的:

        using (Document document = new Document())
        {
            document.LoadFromFileInReadMode(@"C:\temp\word.docx", FileFormat.Docx);

            foreach (Section s in document.Sections)
            {
                int pCount = 0;
                foreach (Paragraph p in s.Paragraphs)
                {
                    Document document = new Document();
                    Section s = document.AddSection();
                    s.Paragraphs.Add(p);
                    document.SaveToFile(@"c:\temp\x\" + pCount + ".docx", FileFormat.Docx);
                }
            }
        }

我在15秒内创建了1200个word文档:

    static void Main()
    {
        for(int i = 0; i < 1200; i++){
            Document document = new Document();
            Section s = document.AddSection();
            Paragraph p = s.AddParagraph();
            TextRange textRange1 = p.AppendText(Guid.NewGuid().ToString());
            textRange1.CharacterFormat.TextColor = Color.Blue;
            textRange1.CharacterFormat.FontSize = 15;
            textRange1.CharacterFormat.Bold = true;

            TextRange textRange2 = p.AppendText(Guid.NewGuid().ToString());
            textRange2.CharacterFormat.TextColor = Color.Black;
            textRange2.CharacterFormat.FontSize = 10;

            TextRange textRange3 = p.AppendText(Guid.NewGuid().ToString());
            textRange3.CharacterFormat.TextColor = Color.Red;
            textRange3.CharacterFormat.FontSize = 8;
            textRange3.CharacterFormat.Italic = true;

            document.SaveToFile(@"c:\temp\x\" + i + ".docx", FileFormat.Docx);

            Console.Out.Write("\r" + i);
        }
    }

我确实注意到,正在进行大量的垃圾收集。如果您可以找出减少方法,则减少该速度可能会加快速度