c# - MS Word 办公自动化 - 填写文本表单域和复选框表单域以及邮件合并

标签 c# vb.net ms-word ms-office

有没有人对如何使用 C#(VB.NET 也可以)创建引擎有什么好的建议或经验,该引擎足够通用以处理大多数我需要填充数据的 MS Word 文本字段从数据库?简而言之,我即将开始这个小小的 Office 自动化之旅,我希望这里的一些反馈可以帮助我避免一些耗时的错误。

提前干杯并感谢您的任何建议;

戴夫

最佳答案

我将发送两个示例来解决您的自动化问题。第一个是使用 MailMerge,第二个是使用书签。

word 文件看起来是这样的:

使用 MailMerge(插入 -> 快速部件 -> 字段 -> 邮件合并 -> 合并字段) 名字:«firstName» 姓氏:«lastName»

=======

使用书签(插入 -> 书签) 名字:(<- 书签在这里,不可见) 姓氏:

代码如下:

  1. 使用书签

        Open("D:/Doc1.doc");
        if (oDoc.Bookmarks.Exists("bkmFirstName"))
        {
            object oBookMark = "bkmFirstName";
            oDoc.Bookmarks.get_Item(ref oBookMark).Range.Text = textBox1.Text;
        }
    
        if (oDoc.Bookmarks.Exists("bkmLastName"))
        {
            object oBookMark = "bkmLastName";
            oDoc.Bookmarks.get_Item(ref oBookMark).Range.Text = textBox2.Text;
        }
    
        SaveAs("D:/Test/Doc2.doc"); Quit();
        MessageBox.Show("The file is successfully saved!");
    
  2. 使用邮件合并

        Open("D:/Doc1.doc");
        foreach (Field myMergeField in oDoc.Fields)
        {
            //iTotalFields++;
            Range rngFieldCode = myMergeField.Code;
            String fieldText = rngFieldCode.Text;
    
            // GET only MAILMERGE fields
            if (fieldText.StartsWith(" MERGEFIELD"))
            {
                Int32 endMerge = fieldText.IndexOf("\\");
                Int32 fieldNameLength = fieldText.Length - endMerge;
                String fieldName = fieldText.Substring(11, endMerge - 11);
    
                fieldName = fieldName.Trim();
                if (fieldName == "firstName")
                {
                    myMergeField.Select();
                    oWordApplic.Selection.TypeText("This Text Replaces the Field in the Template");
                }
            }
        }
        SaveAs("D:/Test/Doc2.doc"); Quit();
        MessageBox.Show("The file is successfully saved!");
    

我还使用了一些辅助方法。

    ApplicationClass oWordApplic = new Microsoft.Office.Interop.Word.ApplicationClass();
    private Microsoft.Office.Interop.Word.Document oDoc = new Document();

    public void Open(string strFileName)
    {
        object fileName = strFileName;
        object readOnly = false;
        object isVisible = true;
        object missing = System.Reflection.Missing.Value;

        oDoc = oWordApplic.Documents.Open(ref fileName, ref missing, ref readOnly,
        ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
        ref missing, ref missing, ref isVisible, ref missing, ref missing, ref missing, ref missing);

        oDoc.Activate();
    }

    public void SaveAs(string strFileName)
    {
        object missing = System.Reflection.Missing.Value;
        object fileName = strFileName;

        oDoc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
        ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
    }

    public void Quit()
    {
        object missing = System.Reflection.Missing.Value;
        oWordApplic.Application.Quit(ref missing, ref missing, ref missing);
    }

我希望这个实现能为解决您的问题提供一些思路。

关于c# - MS Word 办公自动化 - 填写文本表单域和复选框表单域以及邮件合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1371093/

相关文章:

c# - Unity 的默认脚本图标的位置在哪里

使用 OAuth 的 C# Web API 请求/响应日志记录

.net - 无法为 SOAP 调用的 SSL/TLS 建立安全通道

C# 到 VB.net 项目转换

VBA:Word 2010 - 使用 VBA 关闭页眉和页脚工具

java - 在Java中将图像插入到word文档中

c# - WCF 与托管应用程序通信?

c# - 使用 WPF、MVVM 和 DP 的用户控制

asp.net - 正则表达式-将文本追加到youtube链接的 'src'字段

javascript - 从 javascript 自动化 Windows 2007 的 Word