【问题标题】:Replace text in Word with text from C# form用 C# 表单中的文本替换 Word 中的文本
【发布时间】:2017-03-17 19:18:25
【问题描述】:

我正在尝试用 C# 制作一个应用程序。当按下单选按钮时,我想打开一个 Microsoft Word 文档(发票)并用我的表单中的文本替换一些文本。 Word 文档还包含一些带有文本的文本框。

我尝试实现此链接Word Automation Find and Replace not including Text Boxes 中编写的代码,但是当我按下单选按钮时,会出现一个窗口,询问“使文档可读的编码”,然后 Word 文档打开,里面充满了黑色三角形和其他东西,而不是我最初的发票模板。

我的发票如何处理:

这是我尝试过的:

    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);
    }

【问题讨论】:

  • 我不得不在第一行停止阅读。 @ 前缀的目的是避免转义,所以应该有一个反斜杠,如果我没记错的话
  • @dlatikay 在某些情况下双重工作同样出色 - 尽管我之前遇到过导致问题的情况。
  • 生成的文件已损坏,但没有理由责怪您的代码,到目前为止看起来还不错。您可以改用 .docx 格式吗?有一个功能问题可能成为问题。如果替换文本偶然包含要在后续调用中替换的文本怎么办 - 那会搞砸。考虑使用书签而不是全部替换。

标签: c# ms-word office-interop


【解决方案1】:

所以如果你的单词模板每次你基本上都是一样的

  • 复制模板
  • 处理模板
  • 以所需格式保存
  • 删除模板副本

您要在 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();

除非您想将所有值传递到函数中,否则这段代码应该能让您启动并运行。

编辑:如果您需要更多示例,我也在撰写一篇博文,所以如果这对您的用例不够清楚,我会提供更多详细信息。

【讨论】:

  • @Elena - 如果我的回答符合您的需要,请将其标记为正确 - 我很高兴它有所帮助! :)
猜你喜欢
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2021-04-27
  • 2019-12-12
  • 1970-01-01
  • 2011-08-24
  • 2013-08-21
  • 2016-12-26
相关资源
最近更新 更多