我正在寻找将一个大文件拆分为多个小文件的最有效方法。每个小文件都是大文件的一小段。 如果大文件有大约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加载项。
有更有效的方法吗?
答案 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);
}
}
我确实注意到,正在进行大量的垃圾收集。如果您可以找出减少方法,则减少该速度可能会加快速度