C#读取Word模板替换相应的字符串(标签)生成新的Word

在平常工作中,生成word的方式主要是C#读取html的模板文件处理之后保存为.doc文件,这样的好处是方便,快捷,能满足大部分的需求。不过有些特殊的需求并不能满足,如要生成的Word为一个表格,只是一部分字符串需要变化,用上面的方法生成Word表格容易变形。如果我们能读取一个word模板,把模板里定义的固定字符串如{标记1}替换为想要的文字,然后生成新的word。这样生成的Word非常整洁。

查找了网上许多方法,虽然都是调用office的接口,并没有一个好的方案。通过自己的实验,比较,使用Microsoft.Office.Interop.Word.dll调用相应的查找全部命令,将相应的标签替换为相应的字符串比较好用。下面是实现方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Microsoft.Office.Interop.Word;

namespace Renfb.Word
{
    public class Word
    {
        private object _outputname = "";
        private object _inputname = "";

        // 输出文件名,将word另存为的文件名,绝对地址
        public object OutPutName
        {
            get { return _outputname; }
            set { _outputname = value; }
        }

        //输入文件名,Word的模板文件(还有相应的标记{biaoji1}或者任意字符串).
绝对地址
        public object InPutName
        {
            get { return _inputname; }
            set { _inputname = value; }
        }

        public Word() { }

        public Word(object inputname,object outputname)
        {
            this._inputname = inputname;
            this._outputname = outputname;
        }

        private Dictionary _put = new Dictionary();

       //param key标记{biaoji1}或者要替换的任意字符串
       // param value替换后的字符串
     public void Put(string key, string value)
        {
            _put.Add(key, value);
        }

        #region 内部变量
        private object missValue = Missing.Value;
        private object trueValue = true;
        private object falseValue = false;
        private object oStory=WdUnits.wdStory;
        private object oMove=WdMovementType.wdMove;
        private ApplicationClass app = null;
        private Document doc=null;
        #endregion

        //打开文档。
        private void openDocument()
        {
            app = new ApplicationClass();
            app.Visible = false;
            app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            doc = app.Documents.Open(
                    ref _inputname,
                    ref missValue,
                    ref trueValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue,
                    ref missValue
                    );
        }

        // 文档另存为新Word文件。
        private void saveAsDocument()
        {
            doc.SaveAs(
                   ref _outputname,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue,
                   ref missValue
                  );
        }

        // 将相应的标签替换然后保存
        public void Save()
        {
            if (string.IsNullOrEmpty(_inputname.ToString()))
            {
                throw new Exception("InPutName 不能为空,请输入模板文件的地址。
InPutName为模板文件的绝对地址");
            }
            if (string.IsNullOrEmpty(_outputname.ToString()))
            {
                throw new Exception("OutPutName 不能为空,请输入保存模板文件的地址,
OutPutName为模板文件的绝对地址");
            }

            try
            {
                //打开Word文档。
                this.openDocument();
                app.Selection.HomeKey(ref oStory,ref oMove);
                Find find = app.Selection.Find;
                find.ClearFormatting();
                find.Replacement.ClearFormatting();
                foreach (string key in _put.Keys)
                {
                    find.Text = key;
                    find.Replacement.Text = _put[key];
                    this.ExecuteReplace(find);
                }
                //将文档另存为新文档。
                this.saveAsDocument();
            }
            catch (Exception ex)
            {
                throw new Exception("错误:" + ex.Message);
            }
            finally
            {
                app.Quit(ref missValue, ref missValue, ref missValue);
            }
        }

        private bool ExecuteReplace(Find find)
        {
            return this.ExecuteReplace(find, WdReplace.wdReplaceAll);
        }

        private bool ExecuteReplace(Find find, object objReplaceOption)
        {
             return find.Execute(
                ref missValue,
                ref missValue,
                ref missValue,
                ref missValue,
                ref missValue,
                ref missValue,
                ref missValue,
                ref missValue,
                ref missValue,
                ref missValue,
                ref objReplaceOption,
                ref missValue,
                ref missValue,
                ref missValue,
                ref missValue
                );
        }
    }
}
       

使用方法很简单。相信大家都明白。代码如下:

string inputname = Server.MapPath("1.doc");
string outputname = Server.MapPath("3.doc");
Word word = new Word(inputname, outputname);
word.Put("{documentVersion}", "2.6");
word.Put("{ProjectName}", "Renfb.Word");
word.Put("{author}", "Renfb");
word.Put("{CreateRiqi}", "2011.07.04");
word.Put("{Lianxiren}", "任锋宾");
word.Put("{num}", "1");
word.Save();

调用前记得先引用程序集Renfb.Word.dll和Microsoft.Office.Interop.Word.dll,在使用的页面上记得添加using Renfb.Word;这篇文章只是起到了抛砖引玉的作用。希望能给大家一些启发。

时间: 2024-11-11 12:57:24

C#读取Word模板替换相应的字符串(标签)生成新的Word的相关文章

php根据word模板生成新的word文件

原文地址:http://www.niu12.com/article/16 php使用phpword将word内容变量替换 a.安装phpword composer require phpoffice/phpword b.当前目录下a.docx,假设word内容需要替换的变量为 说明人:${user} 电话:${email} c.php改写word内容 参考地址 <?php // 根据模板生成用户信息word $templateProcessor = new TemplateProcessor(&qu

C实现改动可运行文件里的字符串,生成新的可运行文件

这样的技术经常使用在远程控制软件中.我们已有远程控制软件的server端.我们利用远程控制软件的client配置生成我们自己的服务端软件,实现server端的port及IP地址更新的功能. 下边看源码 #include <stdio.h> #include <Windows.h> int FindStr(char *destStr, char *srcStr, int destStrLen, int srcStrLen); void ReplaceStr(char *destStr

C实现修改可执行文件中的字符串,生成新的可执行文件

这种技术常用在远程控制软件中,我们已有远程控制软件的服务器端.我们利用远程控制软件的客户端配置生成我们自己的服务端软件,实现服务器端的端口及IP地址更新的功能. 下边看源代码 #include <stdio.h> #include <Windows.h> int FindStr(char *destStr, char *srcStr, int destStrLen, int srcStrLen); void ReplaceStr(char *destStr, char * srcS

[转]C#操作word模板插入文字、图片及表格详细步骤

c#操作word模板插入文字.图片及表格 1.建立word模板文件 person.dot用书签 标示相关字段的填充位置 2.建立web应用程序 加入Microsoft.Office.Interop.Word引用具体添加引用请参看http://www.microsoft.com/china/msdn/library/office/office/OfficePrIntopAssFAQ.mspx?mfr=true 3.相关示例代码 protected void CreateReport_Click(o

poi根据模版生成多页word,并压缩下载

前端时间公司有个项目,需求大致是这样的——根据word模版,生成带学生照片的信息表格.如果是批量打印,则生成一个word文档,每个学生占用一页. 在实现时,参考了两位老哥的代码: 使用poi根据模版生成word文档,支持插入数据和图片: poi替换word模板内容 并且合并生成多页的word 实现分页. 先上工具类的代码: import org.apache.poi.xwpf.usermodel.*; import javax.servlet.http.HttpServletResponse;

Java中用Apache POI生成excel和word文档

概述: 最近在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能,最后决定用Apache POI来完成该项功能.本文就项目实现过程中的一些思路与代码与大家共享,同时,也作为自己的一个总结,以备后用. 功能: 1.从数据库查询数据导出为excel: 2.导出word的包括,内容有文字,图片,表格等. 效果: 导出excel 导出word 实现代码: 1.导出excel package beans.excel; import java.io.FileOutputStream;

通过freemarker出word的技术解决方案_通过点击一个按钮临时实现生成一个word,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表

 通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名改成ftl文件 详细步骤如下: 模板制作(将要动态显示的数据打上标记,这个标记是freemarker中的EL标记,要注意的是,要控制值为空的情况,下面${(site.wzmc)?default("")}标识当网站名称为空的时候显示空值,如果这里如果不做控制,在实际项目中会显示错误!) 另外

c#读取Word模板,利用书签替换内容包括表格

//生成WORD程序对象和WORD文档对象 Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application(); Microsoft.Office.Interop.Word.Document doc = new Document(); object miss = System.Reflection.Missing.Value; try { //打开模板文档,并指定d

java读取WORD/EXCEL模板转换生成新WORD/EXCEL文档

原文:java读取WORD/EXCEL模板转换生成新WORD/EXCEL文档 代码下载地址:http://www.zuidaima.com/share/1550463239670784.htm 可以通过预先设置指定的excel和word模板,通过替换文档里面指定的标志来生成新的excel和word文档.excel的部分只是实现了简单的方法.word部分可以支持word2003和word2007格式.建议word使用07及其以上. 其实excel部分标签和jstl很像,而且支持循环等.word就支