当前位置:首页 > 技术 > 正文内容

C#操作Word模板插入文本、图像与表格的完整指南

访客 技术 2026年7月3日 1

C#操作Word模板插入文本、图像与表格的完整指南

1. 创建Word模板文件

首先需要创建一个Word模板文件(例如:template.dot),并在其中使用书签标记需要填充数据的位置。这些书签将作为后续程序插入内容的定位点。

2. 添加必要的引用

在Web应用程序项目中,需要添加对Microsoft.Office.Interop.Word的引用。具体添加方法请参考Microsoft官方文档。

3. 实现代码示例

3.1 生成Word文档并填充数据


protected void GenerateReport_Click(object sender, EventArgs e)
{
    Microsoft.Office.Interop.Word.WordApplication wordApp = null; // Word应用程序对象
    Microsoft.Office.Interop.Word.Document wordDoc = null; // 文档对象
    
    try
    {
        // 初始化Word应用程序
        wordApp = new Microsoft.Office.Interop.Word.WordApplication();
        wordApp.Visible = false;
        
        // 定义必要对象
        object isVisible = true;
        object notVisible = false;
        object templatePath = Server.MapPath("template.dot"); // 模板文件路径
        documentType = WdDocumentType.wdTypeDocument;
        
        // 基于模板创建新文档
        wordDoc = (Document)wordApp.Documents.Add(ref templatePath, ref notVisible, ref documentType, ref isVisible);
        
        // 定义书签名称
        object nameBookmark = "bm_Name"; // 姓名书签
        object genderBookmark = "bm_Gender"; // 性别书签
        object birthBookmark = "bm_Birthdate"; // 出生日期书签
        object imageBookmark = "bm_Image"; // 图片书签
        object tableBookmark = "bm_Table"; // 表格书签
        object missing = System.Reflection.Missing.Value;
        
        // 准备测试数据
        System.Data.DataTable dataTable = new DataTable();
        dataTable.Columns.Add("personName");
        dataTable.Columns.Add("personGender");
        dataTable.Columns.Add("personBirthdate");
        
        DataRow dataRow = dataTable.NewRow();
        dataRow["personName"] = "李四";
        dataRow["personGender"] = "女";
        dataRow["personBirthdate"] = "1990-05-15";
        dataTable.Rows.Add(dataRow);
        
        // 向书签位置填充文本数据
        wordDoc.Bookmarks.get_Item(ref nameBookmark).Range.Text = dataTable.Rows[0]["personName"].ToString();
        wordDoc.Bookmarks.get_Item(ref genderBookmark).Range.Text = dataTable.Rows[0]["personGender"].ToString();
        wordDoc.Bookmarks.get_Item(ref birthBookmark).Range.Text = dataTable.Rows[0]["personBirthdate"].ToString();
        
        // 向书签位置插入图片
        wordDoc.Bookmarks.get_Item(ref imageBookmark).Range.InlineShapes.AddPicture(@"D:\Images\photo.jpg", ref missing, ref missing, ref missing);
        
        // 在书签位置创建表格
        Microsoft.Office.Interop.Word.Table newTable = wordDoc.Tables.Add(wordDoc.Bookmarks.get_Item(ref tableBookmark).Range, 12, 3, ref missing, ref missing);
        newTable.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle;
        newTable.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle;
        
        // 在文档末尾添加内容
        wordDoc.Paragraphs.Last.Range.Text = "";
        
        // 保存Word文档
        object outputFileName = Server.MapPath("~") + "\\Reports\\" + dataTable.Rows[0]["personName"].ToString() + ".doc";
        object noParam = System.Reflection.Missing.Value;
        wordDoc.SaveAs(ref outputFileName, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam, ref noParam);
        
        // 关闭文档和应用程序
        object doNotSave = WdSaveOptions.wdDoNotSaveChanges;
        wordDoc.Close(ref doNotSave, ref missing, ref missing);
        wordApp.Application.Quit(ref missing, ref missing, ref missing);
        
        // 释放资源
        wordDoc = null;
        wordApp = null;
    }
    catch (System.Exception ex)
    {
        // 异常处理,确保释放资源
        string errorInfo = ex.ToString();
        object miss = System.Reflection.Missing.Value;
        object noSave = WdSaveOptions.wdDoNotSaveChanges;
        
        if (wordDoc != null)
        {
            wordDoc.Close(ref noSave, ref miss, ref miss);
        }
        
        if (wordApp != null)
        {
            wordApp.Application.Quit(ref miss, ref miss, ref miss);
        }
        
        wordDoc = null;
        wordApp = null;
    }
}

3.2 常见问题解决

如果运行时遇到80070005错误,可以尝试以下解决方案:

解决方案一:修改DCOM配置

  1. 打开控制面板 → 管理工具 → 组件服务 → 计算机 → 我的电脑 → DCOM配置
  2. 找到"Microsoft Word文档",右键单击选择"属性"
  3. 在"标识"选项卡中,选择"交互式用户"
  4. 在"安全"选项卡中,分别在"启动和激活权限"和"访问权限"组中选中"自定义"
  5. 点击"自定义"→"编辑"→添加ASP.NET账户和IUSER_计算机名
  6. 确保允许每个用户访问,然后确定
  7. 关闭DCOMCNFG

解决方案二:使用身份模拟

在web.config文件的节中添加以下配置:


<identity impersonate="true" userName="你的用户名" password="密码"/>

3.3 图片操作详细说明


// 定义文件路径
object docPath = @"C:\\WebRoot\\Project\\output.doc";
Word.Application wordApp = new Word.ApplicationClass();
object nothingValue = System.Reflection.Missing.Value;

// 打开Word文档
Word.Document wordDoc = wordApp.Documents.Open(ref docPath, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue, ref nothingValue);

// 添加图片
InlineShape imageShape = wordApp.Selection.InlineShapes.AddPicture(@"C:\\Images\\photo.jpg", ref nothingValue, ref nothingValue, ref nothingValue);

// 设置图片尺寸
imageShape.Height = InchesToPoints(0.5);
imageShape.Width = InchesToPoints(0.5);

// 保存并关闭文档
wordDoc.Save();
wordDoc.Close(ref nothingValue, ref nothingValue, ref nothingValue);
wordApp.Quit(ref nothingValue, ref nothingValue, ref nothingValue);

3.4 向Word书签写入数据的专用类


using System;
using System.Data;
using System.Web;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Word;

namespace DocumentUtilities
{
    public class WordDataWriter
    {
        private ApplicationClass wordApp = null; // Word应用程序对象
        private Document wordDoc = null; // 文档对象
        private object missing = System.Reflection.Missing.Value; // 空值对象
        private object readOnly = false;
        
        /// <summary>
        /// 打开Word文档
        /// </summary>
        /// <param name="filePath">文档路径</param>
        public void OpenDocument(string filePath)
        {
            object path = filePath;
            
            wordApp = new ApplicationClass();
            
            // 打开文档
            wordDoc = wordApp.Documents.Open(ref path, 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);
            
            wordDoc.Activate(); // 激活文档
        }
        
        /// <summary>
        /// 向Word文档中的书签写入数据
        /// </summary>
        /// <param name="bookmarkName">书签名称</param>
        /// <param name="content">要写入的内容</param>
        public void WriteToBookmark(string bookmarkName, string content)
        {
            object name = bookmarkName;
            Bookmark bookmark = wordDoc.Bookmarks.get_Item(ref name);
            bookmark.Range.Text = content;
        }
        
        /// <summary>
        /// 保存文档并关闭
        /// </summary>
        /// <param name="savePath">保存路径</param>
        public void SaveAndClose(string savePath)
        {
            object path = savePath;
            Object saveOption = wordApp.Options.BackgroundSave;
            
            // 保存文档
            wordDoc.SaveAs(ref path, 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);
            
            // 关闭文档和应用程序
            wordDoc.Close(ref saveOption, ref missing, ref missing);
            wordApp.Quit(ref missing, ref missing, ref missing);
        }
    }
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。