我正在尝试打开Word文档,更改一些文本,然后将更改保存到新文档中。我可以使用下面的代码完成第一项,但我无法弄清楚如何将更改保存到新文档(指定路径和文件名)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using DocumentFormat.OpenXml.Packaging;
using System.IO;
namespace WordTest
{
class Program
{
static void Main(string[] args)
{
string template = @"c:\data\hello.docx";
string documentText;
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(template, true))
{
using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
{
documentText = reader.ReadToEnd();
}
documentText = documentText.Replace("##Name##", "Paul");
documentText = documentText.Replace("##Make##", "Samsung");
using (StreamWriter writer = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
writer.Write(documentText);
}
}
}
}
}
我是一个完全的初学者,请原谅基本问题!
答案 0 :(得分:33)
如果您使用MemoryStream
,则可以将更改保存到新文件中,如下所示:
byte[] byteArray = File.ReadAllBytes("c:\\data\\hello.docx");
using (MemoryStream stream = new MemoryStream())
{
stream.Write(byteArray, 0, (int)byteArray.Length);
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true))
{
// Do work here
}
// Save the file with the new name
File.WriteAllBytes("C:\\data\\newFileName.docx", stream.ToArray());
}
答案 1 :(得分:7)
在Open XML SDK 2.5中:
File.Copy(originalFilePath, modifiedFilePath);
using (var wordprocessingDocument = WordprocessingDocument.Open(modifiedFilePath, isEditable: true))
{
// Do changes here...
}
wordprocessingDocument.AutoSave
默认为true,因此Close和Dispose将保存更改。
<{1}}不需要显式,因为using块会调用它。
此方法不需要像接受的答案那样将整个文件内容加载到内存中。对于小文件来说这不是问题,但在我的情况下,我必须同时处理更多带有嵌入式xlsx和pdf内容的docx文件,因此内存使用率会非常高。
答案 2 :(得分:3)
只需将源文件复制到目标并从那里进行更改。
File.copy(source,destination);
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(destination, true))
{
\\Make changes to the document and save it.
WordDoc.MainDocumentPart.Document.Save();
WordDoc.Close();
}
希望这有效。
答案 3 :(得分:1)
这种方法允许您缓冲“模板”文件,而无需将整个内容批量放入byte[]
中,这也许可以减少资源消耗。
var templatePath = @"c:\data\hello.docx";
var documentPath = @"c:\data\newFilename.docx";
using (var template = File.OpenRead(templatePath))
using (var documentStream = File.Open(documentPath, FileMode.OpenOrCreate))
{
template.CopyTo(documentStream);
using (var document = WordprocessingDocument.Open(documentStream, true))
{
//do your work here
document.MainDocumentPart.Document.Save();
}
}
答案 4 :(得分:-1)
对我来说this工作正常:
// To search and replace content in a document part.
public static void SearchAndReplace(string document)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
string docText = null;
using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
{
docText = sr.ReadToEnd();
}
Regex regexText = new Regex("Hello world!");
docText = regexText.Replace(docText, "Hi Everyone!");
using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
sw.Write(docText);
}
}
}