方法一:使用Office的组件

使用该方法必须要安装Office

1、制作Word模板



在需要填充内容的地方增加标识符号,方便之后替换使用,例如 [项目名称],其中[]符号和中间的文字可根据个人情况进行修改。

到此模板已经制作完成,是不是很简单。

2、操作Word

2.1 引用Microsoft.Office.Interop.Word.dll

添加命名空间

  1. using Word = Microsoft.Office.Interop.Word;

2.2 编码开始

  1. string mubanFile = "模板.docx";
  2. string templatePath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, mubanFile);
  3. Dictionary<string, string> bookmarks = new Dictionary<string, string>();
  4. var item=xxx;//数据源
  5. //将数据与Word模板中的标签对应
  6. bookmarks.Add("[姓名]", item.UserName);
  7. bookmarks.Add("[性别]", item.Sex);
  8. bookmarks.Add("[出生年月]", item.BirthDay);
  9. bookmarks.Add("[民族]", item.Ethnic);
  10. bookmarks.Add("[文化程度]", item.EducationalLevel);
  11. bookmarks.Add("[详细地址]", item.Address);
  12. bookmarks.Add("[电话]", item.Phone);
  13. string wordpath = outputPath + "xx.docx";//导出word地址
  14. string pdfpath = outputPath + "xx.pdf";//导出pdf地址
  15. GenerateWord(templatePath, wordpath, pdfpath, bookmarks);
  1. /// <summary>
  2. /// 根据word模板文件导出word/pdf文件
  3. /// </summary>
  4. /// <param name="templateFile">模板路径</param>
  5. /// <param name="fileNameWord">导出文件名称</param>
  6. /// <param name="fileNamePdf">pdf文件名称</param>
  7. /// <param name="bookmarks">模板内书签集合</param>
  8. public static void GenerateWord(string templateFile, string fileNameWord, string fileNamePdf, Dictionary<string, string> bookmarks)
  9. {
  10. Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
  11. File.Copy(templateFile, fileNameWord, true);
  12. Microsoft.Office.Interop.Word.Document doc = new Microsoft.Office.Interop.Word.Document();
  13. object Obj_FileName = fileNameWord;
  14. object Visible = false;
  15. object ReadOnly = false;
  16. object missing = System.Reflection.Missing.Value;
  17. object IsSave = true;
  18. object FileName = fileNamePdf;
  19. object FileFormat = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF;
  20. object LockComments = false;
  21. object AddToRecentFiles = true;
  22. object ReadOnlyRecommended = false;
  23. object EmbedTrueTypeFonts = false;
  24. object SaveNativePictureFormat = true;
  25. object SaveFormsData = false;
  26. object SaveAsAOCELetter = false;
  27. object Encoding = Microsoft.Office.Core.MsoEncoding.msoEncodingSimplifiedChineseGB18030;
  28. object InsertLineBreaks = false;
  29. object AllowSubstitutions = false;
  30. object LineEnding = Microsoft.Office.Interop.Word.WdLineEndingType.wdCRLF;
  31. object AddBiDiMarks = false;
  32. try
  33. {
  34. doc = app.Documents.Open(ref Obj_FileName, ref missing, ref ReadOnly, ref missing, ref missing, ref missing, ref missing,
  35. ref missing, ref missing, ref missing, ref missing, ref Visible, ref missing, ref missing, ref missing, ref missing);
  36. doc.Activate();
  37. foreach (string bookmarkName in bookmarks.Keys)
  38. {
  39. string newstr;
  40. string newStrs;
  41. replace(doc, bookmarkName, bookmarks[bookmarkName]);//替换内容
  42. }
  43. //replace(doc, "hello", "shalv");
  44. //此处存储时,参数可选填,如需另外生成pdf,加入一个参数ref FileName,
  45. doc.SaveAs(ref FileName, ref FileFormat, ref LockComments,
  46. ref missing, ref AddToRecentFiles, ref missing,
  47. ref ReadOnlyRecommended, ref EmbedTrueTypeFonts,
  48. ref SaveNativePictureFormat, ref SaveFormsData,
  49. ref SaveAsAOCELetter, ref Encoding, ref InsertLineBreaks,
  50. ref AllowSubstitutions, ref LineEnding, ref AddBiDiMarks);
  51. doc.Close(ref IsSave, ref missing, ref missing);
  52. }
  53. catch (Exception ex)
  54. {
  55. LogHelper.WriteLog(ex.ToString());
  56. doc.Close(ref IsSave, ref missing, ref missing);
  57. }
  58. }
  59. ///<summary>
  60. /// 在word 中查找一个字符串直接替换所需要的文本
  61. /// </summary>
  62. /// <param name="strOldText">原文本</param>
  63. /// <param name="strNewText">新文本</param>
  64. /// <returns></returns>
  65. public static void replace(Microsoft.Office.Interop.Word.Document doc, string strOldText, string strNewText)
  66. {
  67. doc.Content.Find.Text = strOldText;
  68. object FindText, ReplaceWith, Replace;//
  69. object MissingValue = Type.Missing;
  70. FindText = strOldText;//要查找的文本
  71. ReplaceWith = strNewText;//替换文本
  72. Replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
  73. /*wdReplaceAll - 替换找到的所有项。
  74. * wdReplaceNone - 不替换找到的任何项。
  75. * wdReplaceOne - 替换找到的第一项。
  76. * */
  77. doc.Content.Find.ClearFormatting();//移除Find的搜索文本和段落格式设置
  78. doc.Content.Find.Execute(
  79. ref FindText, ref MissingValue,
  80. ref MissingValue, ref MissingValue,
  81. ref MissingValue, ref MissingValue,
  82. ref MissingValue, ref MissingValue, ref MissingValue,
  83. ref ReplaceWith, ref Replace,
  84. ref MissingValue, ref MissingValue,
  85. ref MissingValue, ref MissingValue);
  86. }

好了,到这就完成了。

不过有个小问题,这种替换的方式,当要替换的字符串超过一定的长度,就会提示“字符串参量过长”,搜索发现,替换的最大长度为255字符。

下面是解决方法

在替换前判断替换内容长度是否超过255,如果超长就分段替换,代码如下

  1. foreach (string bookmarkName in bookmarks.Keys)
  2. {
  3. int len = bookmarks[bookmarkName].Length;
  4. int cnt = len / 255;
  5. string newstr;
  6. string newStrs;
  7. if (bookmarks[bookmarkName].Length < 255)
  8. {
  9. replace(doc, bookmarkName, bookmarks[bookmarkName]);//替换内容
  10. }
  11. else
  12. {
  13. for (int i = 0; i <= cnt; i++)
  14. {
  15. if (i != cnt)
  16. newstr = bookmarks[bookmarkName].ToString().Substring(i * 255, 255) + bookmarkName; //新的替换字符串
  17. else
  18. newstr = bookmarks[bookmarkName].ToString().Substring(i * 255, len - i * 255); //最后一段需要替换的文字
  19. newStrs = newstr;
  20. replace(doc, bookmarkName, newStrs);//替换内容
  21. }
  22. }
  23. }

第一种方法搞定!!!

方法二:使用Aspose.Words

这种方法不用安装office。

1、制作模板

在需要替换的地方插入域,插入-》文档部件-》域-》选择MergeField,在域名处添加内容。

WPS的步骤为 插入-》选择文档部件-》选择域-》选择邮件合并



添加完成后的效果如下:

2、上代码

2.1 添加引用

  1. using Aspose.Words;

2.1 建立对应关系

  1. string[] fieldNames = new string[] { "姓名", "性别", "出生年月", "民族", "文化程度", "详细地址", "电话" };
  2. object[] fieldValues = new object[] { item.Name, item.Sex, item.BirthDay, item.Ethnic, item.EducationalLevel, item.Address, item.Phone};
  3. string mubanFile = "模板1.docx";
  4. string templatePath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, mubanFile);
  5. string wordpath = outputPath + "xx.docx";//导出word地址
  6. AsposeWordHelper helper = new AsposeWordHelper();
  7. helper.OpenTempelte(templatePath); //打开模板文件
  8. helper.Executefield(fieldNames, fieldValues);//域赋值
  9. helper.SaveDoc(wordpath); //文件保存

下面是word文档操作辅助类AsposeWordHelper.cs的内容

  1. /// <summary>
  2. /// word文档操作辅助类
  3. /// </summary>
  4. public class AsposeWordHelper
  5. {
  6. /// <summary>
  7. /// Word
  8. /// </summary>
  9. private Document wordDoc;
  10. /// <summary>
  11. /// 基于模版新建Word文件
  12. /// </summary>
  13. /// <param name="path">模板路径</param>
  14. public void OpenTempelte(string path)
  15. {
  16. wordDoc = new Document(path);
  17. }
  18. /// <summary>
  19. /// 书签赋值用法
  20. /// </summary>
  21. /// <param name="LabelId">书签名</param>
  22. /// <param name="Content">内容</param>
  23. public void WriteBookMark(string LabelId, string Content)
  24. {
  25. if (wordDoc.Range.Bookmarks[LabelId] != null)
  26. {
  27. wordDoc.Range.Bookmarks[LabelId].Text = Content;
  28. }
  29. }
  30. /// <summary>
  31. /// 列表赋值用法
  32. /// </summary>
  33. /// <param name="dt"></param>
  34. public void WriteTable(DataTable dt)
  35. {
  36. wordDoc.MailMerge.ExecuteWithRegions(dt);
  37. }
  38. /// <summary>
  39. /// 文本域赋值用法
  40. /// </summary>
  41. /// <param name="fieldNames">key</param>
  42. /// <param name="fieldValues">value</param>
  43. public void Executefield(string[] fieldNames, object[] fieldValues)
  44. {
  45. wordDoc.MailMerge.Execute(fieldNames, fieldValues);
  46. }
  47. /// <summary>
  48. /// Pdf文件保存
  49. /// </summary>
  50. /// <param name="filename">文件路径+文件名</param>
  51. public void SavePdf(string filename)
  52. {
  53. wordDoc.Save(filename, SaveFormat.Pdf);
  54. }
  55. /// <summary>
  56. /// Doc文件保存
  57. /// </summary>
  58. /// <param name="filename">文件路径+文件名</param>
  59. public void SaveDoc(string filename)
  60. {
  61. wordDoc.Save(filename, SaveFormat.Doc);
  62. }
  63. /// <summary>
  64. /// 不可编辑受保护,需输入密码
  65. /// </summary>
  66. /// <param name="pwd">密码</param>
  67. public void NoEdit(string pwd)
  68. {
  69. wordDoc.Protect(ProtectionType.ReadOnly, pwd);
  70. }
  71. /// <summary>
  72. /// 只读
  73. /// </summary>
  74. public void ReadOnly()
  75. {
  76. wordDoc.Protect(ProtectionType.ReadOnly);
  77. }
  78. /// <summary>
  79. /// 通过流导出word文件
  80. /// </summary>
  81. /// <param name="stream">流</param>
  82. /// <param name="fileName">文件名</param>
  83. public static HttpResponseMessage ExportWord(Stream stream, string fileName)
  84. {
  85. var file = stream;
  86. fileName += DateTime.Now.ToString("yyyyMMddHHmmss");
  87. HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
  88. result.Content = new StreamContent(file);
  89. result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/msword");
  90. result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
  91. result.Content.Headers.ContentDisposition.FileName = fileName + ".doc";
  92. return result;
  93. }
  94. /// <summary>
  95. /// 通过流导出pdf文件
  96. /// </summary>
  97. /// <param name="stream">流</param>
  98. /// <param name="fileName">文件名</param>
  99. public static HttpResponseMessage ExportPdf(Stream stream, string fileName)
  100. {
  101. var file = stream;
  102. fileName += DateTime.Now.ToString("yyyyMMddHHmmss");
  103. HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
  104. result.Content = new StreamContent(file);
  105. result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
  106. result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
  107. result.Content.Headers.ContentDisposition.FileName = fileName + ".pdf";
  108. return result;
  109. }

这种方法虽然不用安装office,但是导出的文档有AsposeWord的水印和页眉,不过可以手动去掉。

大家有没有其他的方法,欢迎讨论。

如有错误,还请批评指正!

C#通过模板导出Word的两种方法(超简单)的更多相关文章

  1. 【吉光片羽】MVC 导出Word的两种方式

    1.直接将Html转成Word.MVC自带FileResult很好用.Html中我们也可以嵌入自己的样式. html: <div id="target"> <st ...

  2. .net导出Word的一种方法

    由于ActiveX控件只支持IE(好像FF可以通过安装插件支持),所以js导出word的方式就比较局限 可是如果当页面经过js修改以后,.net是无法获取到的,所以要通过js获取到最新的html并传给 ...

  3. C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)

    第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT extern "c" _declspec(dllexport) #dlse # ...

  4. JavaScript模板引擎artTemplate.js——两种方法实现性别的判定

    template.helper(name, callback) name:必传,辅助事件的名称. callback:必传,辅助事件的回调函数. return:undefined 所谓的辅助事件,主要用 ...

  5. layui导出表格的两种方法

    一.不熟悉layui小白使用方法 1.引入如下js文件: 2.编写如下函数: 3.表格ID要与函数取值保持一致即可,再就是自定义一个按钮触发事件 二.引入插件使用方法 1.layui官网下载插件包: ...

  6. php导出表格两种方法 ——PhpExcel的列子

    php常用的导出表格有两种方法,第一种是输出表格,这种方法打开的时候有警告提示,一般导出表格会用phpexcel,这个导出比较灵活,而且还可以设置表格的样式. 第一种导出例子 /** * 执行导出 * ...

  7. C#通过模板导出Word(文字,表格,图片)

    C#通过模板导出Word(文字,表格,图片)   C#导出Word,Excel的方法有很多,这次因为公司的业务需求,需要导出内容丰富(文字,表格,图片)的报告,以前的方法不好使,所以寻找新的导出方法, ...

  8. 代码操作Word时,目录自动更新的两种方法

    最近的项目中有一个功能点为:根据分析数据库并生成报告.不过不是大数据.数据挖掘之类,报告的内容.组织方式都是事先固定下来的.实现的方式为,在普通word文档中插入书签制成模板,然后程序使用OpenXM ...

  9. AE 将地图导出为图片的两种方法

    在ArcGIS的开发中,我们经常需要将当前地图打印(或是转出)到图片文件中.将Map或Layout中的图象转出有两种方法,一种为通过IActiveView的OutPut函数,另外一种是通过IExpor ...

随机推荐

  1. nginx操作目录

    nginx配置文件/conf/nginx.conf 错误日志功能:los/error.log 访问日志功能:logs/access.log 站点服务请求功能配置:html/ 禁止访问功能配置 404页 ...

  2. Django视图函数函数之视图装饰器

    FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py from django.shortcuts import render def wrapper(f): def inner(*arg ...

  3. HTML5 Canvas绘图如何使用

    --------------复制而来--原地址http://jingyan.baidu.com/article/ed15cb1b2e642a1be369813e.html HTML5 Canvas绘图 ...

  4. .Net基础之1——学前入门

    1..Net平台 2.C#编程语言 3..Net都能做什么 Winform桌面应用程序.Internet应用程序——ASP.Net(京东.淘宝.携程网)(主推). WP8手机开发.Unity 3D游戏 ...

  5. CICD:Jenkins入门和使用

    最近,我们使用的开发服务器被回收了,换了一台新的服务器,CI/CD平台需要重新搭建. 我的运维能力一直薄弱,所以借此机会学习了一番如何使用Jenkins进行持续集成开发和部署,实践并踩了一些坑,在此记 ...

  6. SQL——SQL函数

    avg(col) -- 返回数值列的平均值,NULL值不包括在计算中.count(col) -- 返回指定列的值的数目,NULL不计入:count(*)返回表中记录数:count(distinct c ...

  7. [Wireshark]_002_玩转数据包

    通过前一篇文章,我们大概了解了Wireshark,现在可以准备好进行数据包的捕获和分析了.这一片我们将讲到如何使用捕获文件,分析数据包以及时间格式显示等. 1.使用捕获文件 进行数据包分析时,其实很大 ...

  8. [Objective-C] 007_Foundation框架之NSString与NSMutableString

    在Cocoa Foundation中的NSString和NSMutableString类,为我们提供了Unicode字符串的支持,NSString和NSMutableString类最大的区别是:NSS ...

  9. Java IO(五)字节流 FileInputStream 和 FileOutputStream

    Java IO(五)字节流 FileInputStream 和 FileOutputStream 一.介绍 字节流 InputStream 和 OutputStream 是字节输入流和字节输出流的超类 ...

  10. Java的四种权限修饰符

    private:仅对本类可见 缺省(不需修饰符):对本包可见 protected:对本包及所有子类可见 public:对所有类可见 修饰符: * 权限修饰符:private,默认的,protected ...