将Word中的文本替换为C#form中的文本
我想用C语言写一个应用程序。当按下单选按钮时,我想打开一个Microsoft Word文档(发票),并用表单中的文本替换一些文本。Word文档还包含一些带有文本的文本框 我试图实现这个链接中编写的代码,但当我按下单选按钮时,会出现一个窗口,询问“使文档可读的编码”,然后打开Word文档,其中充满了黑色三角形和其他内容,而不是发票的初始模板 我的发票如何处理: 以下是我尝试过的:将Word中的文本替换为C#form中的文本,c#,ms-word,office-interop,C#,Ms Word,Office Interop,我想用C语言写一个应用程序。当按下单选按钮时,我想打开一个Microsoft Word文档(发票),并用表单中的文本替换一些文本。Word文档还包含一些带有文本的文本框 我试图实现这个链接中编写的代码,但当我按下单选按钮时,会出现一个窗口,询问“使文档可读的编码”,然后打开Word文档,其中充满了黑色三角形和其他内容,而不是发票的初始模板 我的发票如何处理: 以下是我尝试过的: string documentLocation = @"C:\\Documents\\Visual Stud
string documentLocation = @"C:\\Documents\\Visual Studio 2015\\Project\\Invoice.doc";
private void yes_radioBtn_CheckedChanged(object sender, EventArgs e)
{
FindReplace(documentLocation, "HotelName", "MyHotelName");
Process process = new Process();
process.StartInfo.FileName = documentLocation;
process.Start();
}
private void FindReplace(string documentLocation, string findText, string replaceText)
{
var app = new Microsoft.Office.Interop.Word.Application();
var doc = app.Documents.Open(documentLocation);
var range = doc.Range();
range.Find.Execute(FindText: findText, Replace: WdReplace.wdReplaceAll, ReplaceWith: replaceText);
var shapes = doc.Shapes;
foreach (Shape shape in shapes)
{
var initialText = shape.TextFrame.TextRange.Text;
var resultingText = initialText.Replace(findText, replaceText);
shape.TextFrame.TextRange.Text = resultingText;
}
doc.Save();
doc.Close();
Marshal.ReleaseComObject(app);
}
因此,如果每次使用相同的word模板
- 复制模板
- 在模板上工作
- 以所需格式保存
- 删除模板副本
Application app = new Application();
Document doc = app.Documents.Open("sDocumentCopyPath.docx");
if (doc.Bookmarks.Exists("bookmark_1"))
{
object oBookMark = "bookmark_1";
doc.Bookmarks.get_Item(ref oBookMark).Range.Text = My Text To Replace bookmark_1;
}
if (doc.Bookmarks.Exists("bookmark_2"))
{
object oBookMark = "bookmark_2";
doc.Bookmarks.get_Item(ref oBookMark).Range.Text = My Text To Replace bookmark_2;
}
doc.ExportAsFixedFormat("myNewPdf.pdf", WdExportFormat.wdExportFormatPDF);
((_Document)doc).Close();
((_Application)app).Quit();
除非您希望将所有值传递到函数中,否则此代码应该可以启动并运行
编辑:如果你需要更多的例子,我也在写一篇博客文章,如果你的用例不够清楚,我会有更多的细节。我不得不停止阅读第一行。@prefix的目的是避免转义,所以如果我没有,应该有一个反斜杠mistaken@dlatikay在某些情况下,double的效果也一样好——尽管我以前遇到过它导致问题。结果文件已损坏,但没有理由责怪您的代码,到目前为止它看起来还不错。你能改用.docx格式吗?有一个功能问题可能成为问题。如果替换文本碰巧包含一个将在后续调用中被替换的文本,会怎么样?这将导致混乱。考虑使用书签,而不是RePASTALL。@埃琳娜-请标记我的答案是正确的,如果它符合您的需求-我很高兴它帮助了!)