C#将内容导出Word到指定模板

昨天做了下导入导出Excel文件,今天研究了下导出Word文件。 从网上找了半天才找到了一个能导出到指定模板的,在这里总结下。

导出模板原理就是利用的替换占位符。

我这里先建立好了一个模板,

接下来写代码进行导出,

前端就一段AJAX调用,这里我就不写了,直接上后端代码,看下面:

     /// <summary>
        /// 导出Word文件
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public ActionResult LeadWord()
        {
            #region 动态创建DataTable数据
            DataTable tblDatas = new DataTable("Datas");
            DataColumn dc = null;
            //赋值给dc,是便于对每一个datacolumn的操作
            dc = tblDatas.Columns.Add("ID", Type.GetType("System.Int32"));
            dc.AutoIncrement = true;//自动增加
            dc.AutoIncrementSeed = 1;//起始为1
            dc.AutoIncrementStep = 1;//步长为1
            dc.AllowDBNull = false;//
            dc = tblDatas.Columns.Add("name", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("sex", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("age", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("str1", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("str2", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("str3", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("str4", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("str5", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("str6", Type.GetType("System.String"));
            dc = tblDatas.Columns.Add("remark", Type.GetType("System.String"));
            DataRow newRow;
            newRow = tblDatas.NewRow();
            newRow["name"] = "张三";
            newRow["sex"] = "男";
            newRow["age"] = "11";
            newRow["str1"] = "字符串1";
            newRow["str2"] = "字符串2";
            newRow["str3"] = "字符串3";
            newRow["str4"] = "字符串4";
            newRow["str5"] = "字符串5";
            newRow["str6"] = "字符串6";
            newRow["remark"] = "备注一下";
            tblDatas.Rows.Add(newRow);
            #endregion
            #region word要替换的表达式和表格字段的对应关系
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("$name$", "name");
            dic.Add("$sex$", "sex");
            dic.Add("$age$", "age");
            dic.Add("$str1$", "str1");
            dic.Add("$str2$", "str2");
            dic.Add("$str3$", "str3");
            dic.Add("$str4$", "str4");
            dic.Add("$str5$", "str5");
            dic.Add("$str6$", "str6");
            dic.Add("$remark$", "remark");
            #endregion
            string tempFile = "~/Content/Word/temp.doc";
            string saveFile = "~/Content/Word/1.doc";
            WordUtility w = new WordUtility(tempFile, saveFile);
            w.GenerateWord(tblDatas, dic, null);
            return Content("ok");
        }

Helper Class(WordUtility.cs)

using System;
using System.Collections.Generic;
using System.Data;
using Word = Microsoft.Office.Interop.Word;
using System.IO;
using System.Windows.Forms;
using System.Runtime.Remoting.Contexts;

namespace Headfree.DefUI
{
    /// <summary>
    /// 使用替换模板进行到处word文件
    /// </summary>
    public class WordUtility
    {
        private object tempFile = null;
        private object saveFile = null;
        private static Word._Document wDoc = null; //word文档
        private static Word._Application wApp = null; //word进程
        private object missing = System.Reflection.Missing.Value;

        public WordUtility(string tempFile, string saveFile)
        {
            tempFile=System.Web.HttpContext.Current.Server.MapPath(tempFile);
            saveFile = System.Web.HttpContext.Current.Server.MapPath(saveFile);
            this.tempFile = Path.Combine(Application.StartupPath, @tempFile);
            this.saveFile = Path.Combine(Application.StartupPath, @saveFile);
        }

        /// <summary>
        /// 模版包含头部信息和表格,表格重复使用
        /// </summary>
        /// <param name="dt">重复表格的数据</param>
        /// <param name="expPairColumn">word中要替换的表达式和表格字段的对应关系</param>
        /// <param name="simpleExpPairValue">简单的非重复型数据</param>
        public bool GenerateWord(DataTable dt, Dictionary<string, string> expPairColumn, Dictionary<string, string> simpleExpPairValue)
        {
            if (!File.Exists(tempFile.ToString()))
            {

                return false;
            }
            try
            {
                wApp = new Word.Application();

                wApp.Visible = false;

                wDoc = wApp.Documents.Add(ref tempFile, ref missing, ref missing, ref missing);

                wDoc.Activate();// 当前文档置前

                bool isGenerate = false;

                if (simpleExpPairValue != null && simpleExpPairValue.Count > 0)
                    isGenerate = ReplaceAllRang(simpleExpPairValue);

                // 表格有重复
                if (dt != null && dt.Rows.Count > 0 && expPairColumn != null && expPairColumn.Count > 0)
                    isGenerate = GenerateTable(dt, expPairColumn);

                if (isGenerate)
                    wDoc.SaveAs(ref saveFile, 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);

                DisposeWord();

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// 单个替换 模版没有重复使用的表格
        /// </summary>
        /// <param name="dc">要替换的</param>
        public bool GenerateWord(Dictionary<string, string> dc)
        {
            return GenerateWord(null, null, dc);
        }

        private bool GenerateTable(DataTable dt, Dictionary<string, string> expPairColumn)
        {
            try
            {
                int tableNums = dt.Rows.Count;

                Word.Table tb = wDoc.Tables[1];

                tb.Range.Copy();

                Dictionary<string, object> dc = new Dictionary<string, object>();
                for (int i = 0; i < tableNums; i++)
                {
                    dc.Clear();

                    if (i == 0)
                    {
                        foreach (string key in expPairColumn.Keys)
                        {
                            string column = expPairColumn[key];
                            object value = null;
                            value = dt.Rows[i][column];
                            dc.Add(key, value);
                        }

                        ReplaceTableRang(wDoc.Tables[1], dc);
                        continue;
                    }

                    wDoc.Paragraphs.Last.Range.Paste();

                    foreach (string key in expPairColumn.Keys)
                    {
                        string column = expPairColumn[key];
                        object value = null;
                        value = dt.Rows[i][column];
                        dc.Add(key, value);
                    }

                    ReplaceTableRang(wDoc.Tables[1], dc);
                }

                return true;
            }
            catch (Exception ex)
            {
                DisposeWord();
                return false;
            }
        }

        private bool ReplaceTableRang(Word.Table table, Dictionary<string, object> dc)
        {
            try
            {
                object replaceArea = Word.WdReplace.wdReplaceAll;

                foreach (string item in dc.Keys)
                {
                    object replaceKey = item;
                    object replaceValue = dc[item];
                    table.Range.Find.Execute(ref replaceKey, ref missing, ref missing, ref missing,
                      ref  missing, ref missing, ref missing, ref missing, ref missing,
                      ref  replaceValue, ref replaceArea, ref missing, ref missing, ref missing,
                      ref  missing);
                }
                return true;
            }
            catch (Exception ex)
            {
                DisposeWord();

                return false;
            }
        }

        private bool ReplaceAllRang(Dictionary<string, string> dc)
        {
            try
            {
                object replaceArea = Word.WdReplace.wdReplaceAll;

                foreach (string item in dc.Keys)
                {
                    object replaceKey = item;
                    object replaceValue = dc[item];
                    wApp.Selection.Find.Execute(ref replaceKey, ref missing, ref missing, ref missing,
                      ref  missing, ref missing, ref missing, ref missing, ref missing,
                      ref  replaceValue, ref replaceArea, ref missing, ref missing, ref missing,
                      ref  missing);
                }
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        private void DisposeWord()
        {
            object saveOption = Word.WdSaveOptions.wdSaveChanges;

            wDoc.Close(ref saveOption, ref missing, ref missing);

            saveOption = Word.WdSaveOptions.wdDoNotSaveChanges;

            wApp.Quit(ref saveOption, ref missing, ref missing); //关闭Word进程
        }
    }
}

好了,代码就这么多,来看下导出效果吧:

ZJ。。。

时间: 2024-10-25 10:37:40

C#将内容导出Word到指定模板的相关文章

C#第三方Aspose.Words.dll导出Word(书签模板)方式说明

项目有遇到需要导出Word,在别人写好的基础上去修改样式,导出后发现样式不正确不整齐,于是采用模板的方式重新导出 1.模板word文件的制作,本人用office2013,在设计好需要的整个表格之后,在你需要替换的位置"插入"--书签 并命名,此命名需要在程序中进行替换 将做好的模板word文件放在程序目录下 2.引用Aspose.Words.dll 3.新建类WordOpAp.cs 1 public class WordOpAp 2 { 3 4 static public object

KindEditor的内容以Word的形式导出

//导出按钮 protected void btn_Export_Click(object sender, EventArgs e)        {            Model.article art = new BLL.Common().GetModel(this.id); WriteHtml(art.content);//art.content这个是显示的内容,我存在数据库中,是html 标签,从编辑器存到数据库中        } //参数内容都是从数据库读出来的文章信息,其中co

按照word/Excel模板导出word/excel

最近项目要实现下载打印的功能,想了想,用水晶报表实在是大材小用, 用office组件直接就可以实现这一功能. 引用类 using Microsoft.Office.Interop.Word; 建立两个实体类 一个是导出word需要替换内容的配置,一个是替换内容的实体 public class AgentInfoEntity     {                 private string comname; public string ComName         {          

利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

先下载jacob.jar包. 解压后将jacob.dll放到windows/system32以下或\jre\bin以下. 将jacob.jar增加项目. 这样项目的环境基本上搭建完毕,接下来就是书写相关的代码: /** * 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段.Value代表用来替换的值. * word模板中全部要替换的字段(即HashMap中的Key)以特殊字符开头和结尾. * 如:$code$.$date$--.以免执行错误的替换. * 全部要替换为图片

批量导出access某表内容到word文档

一.需求: 需要将表中每一条记录中的某些内容导出在一个word文档中,并将这些文档保存在指定文件夹目录下 二.界面,简单设计如下: 三.添加office相关引用 添加后可在解决方案资源管理器中看到: 四.添加form1中的引用 using System.Data.OleDb;using System.Data.SqlClient;using System.IO;using Microsoft.Office.Core;using Word=Microsoft.Office.Interop.Word

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

poi导出word模板项目实例(一个文件)

在页面上填写值,然后导出到word模板中,并把页面上的值带到模板中,也就是导出word文档,提前有word 的模板形式, 1.jsp 页面   <table class="formTable"> <TR> <TD class="label">会议地点</TD> <TD class="content"> <INPUT id="meetingSite" type=&

word文档的导出(用freemarker模板导出)

1.将要导出的word文档另存为xml格式的 2.用文档编辑器打开(如:notepad++),将要展示的数据用${name}的形式替换,“name”对应数据库中的字段 3.根据模板生成 package com.idcsol.apps.common.utils; import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;

Asp.net通过模板(.dot)导出Word

需要引用Office的DLL,在附件中 贴上核心代码(转载): Microsoft.Office.Interop.Word._Application appWord = new Microsoft.Office.Interop.Word.ApplicationClass(); Microsoft.Office.Interop.Word._Document docFile = null; try { appWord.Visible = false; object objTrue = true; o