C#通过模板导出Word的两种方法(超简单)
方法一:使用Office的组件
使用该方法必须要安装Office
1、制作Word模板
在需要填充内容的地方增加标识符号,方便之后替换使用,例如 [项目名称],其中[]符号和中间的文字可根据个人情况进行修改。
到此模板已经制作完成,是不是很简单。
2、操作Word
2.1 引用Microsoft.Office.Interop.Word.dll
添加命名空间
using Word = Microsoft.Office.Interop.Word;
2.2 编码开始
string mubanFile = "模板.docx";
string templatePath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, mubanFile);
Dictionary<string, string> bookmarks = new Dictionary<string, string>();
var item=xxx;//数据源
//将数据与Word模板中的标签对应
bookmarks.Add("[姓名]", item.UserName);
bookmarks.Add("[性别]", item.Sex);
bookmarks.Add("[出生年月]", item.BirthDay);
bookmarks.Add("[民族]", item.Ethnic);
bookmarks.Add("[文化程度]", item.EducationalLevel);
bookmarks.Add("[详细地址]", item.Address);
bookmarks.Add("[电话]", item.Phone);
string wordpath = outputPath + "xx.docx";//导出word地址
string pdfpath = outputPath + "xx.pdf";//导出pdf地址
GenerateWord(templatePath, wordpath, pdfpath, bookmarks);
/// <summary>
/// 根据word模板文件导出word/pdf文件
/// </summary>
/// <param name="templateFile">模板路径</param>
/// <param name="fileNameWord">导出文件名称</param>
/// <param name="fileNamePdf">pdf文件名称</param>
/// <param name="bookmarks">模板内书签集合</param>
public static void GenerateWord(string templateFile, string fileNameWord, string fileNamePdf, Dictionary<string, string> bookmarks)
{
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
File.Copy(templateFile, fileNameWord, true);
Microsoft.Office.Interop.Word.Document doc = new Microsoft.Office.Interop.Word.Document();
object Obj_FileName = fileNameWord;
object Visible = false;
object ReadOnly = false;
object missing = System.Reflection.Missing.Value;
object IsSave = true;
object FileName = fileNamePdf;
object FileFormat = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF;
object LockComments = false;
object AddToRecentFiles = true;
object ReadOnlyRecommended = false;
object EmbedTrueTypeFonts = false;
object SaveNativePictureFormat = true;
object SaveFormsData = false;
object SaveAsAOCELetter = false;
object Encoding = Microsoft.Office.Core.MsoEncoding.msoEncodingSimplifiedChineseGB18030;
object InsertLineBreaks = false;
object AllowSubstitutions = false;
object LineEnding = Microsoft.Office.Interop.Word.WdLineEndingType.wdCRLF;
object AddBiDiMarks = false;
try
{
doc = app.Documents.Open(ref Obj_FileName, ref missing, ref ReadOnly, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref Visible, ref missing, ref missing, ref missing, ref missing);
doc.Activate();
foreach (string bookmarkName in bookmarks.Keys)
{
string newstr;
string newStrs;
replace(doc, bookmarkName, bookmarks[bookmarkName]);//替换内容
}
//replace(doc, "hello", "shalv");
//此处存储时,参数可选填,如需另外生成pdf,加入一个参数ref FileName,
doc.SaveAs(ref FileName, ref FileFormat, ref LockComments,
ref missing, ref AddToRecentFiles, ref missing,
ref ReadOnlyRecommended, ref EmbedTrueTypeFonts,
ref SaveNativePictureFormat, ref SaveFormsData,
ref SaveAsAOCELetter, ref Encoding, ref InsertLineBreaks,
ref AllowSubstitutions, ref LineEnding, ref AddBiDiMarks);
doc.Close(ref IsSave, ref missing, ref missing);
}
catch (Exception ex)
{
LogHelper.WriteLog(ex.ToString());
doc.Close(ref IsSave, ref missing, ref missing);
}
}
///<summary>
/// 在word 中查找一个字符串直接替换所需要的文本
/// </summary>
/// <param name="strOldText">原文本</param>
/// <param name="strNewText">新文本</param>
/// <returns></returns>
public static void replace(Microsoft.Office.Interop.Word.Document doc, string strOldText, string strNewText)
{
doc.Content.Find.Text = strOldText;
object FindText, ReplaceWith, Replace;//
object MissingValue = Type.Missing;
FindText = strOldText;//要查找的文本
ReplaceWith = strNewText;//替换文本
Replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;
/*wdReplaceAll - 替换找到的所有项。
* wdReplaceNone - 不替换找到的任何项。
* wdReplaceOne - 替换找到的第一项。
* */
doc.Content.Find.ClearFormatting();//移除Find的搜索文本和段落格式设置
doc.Content.Find.Execute(
ref FindText, ref MissingValue,
ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue, ref MissingValue,
ref ReplaceWith, ref Replace,
ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue);
}
好了,到这就完成了。
不过有个小问题,这种替换的方式,当要替换的字符串超过一定的长度,就会提示“字符串参量过长”,搜索发现,替换的最大长度为255字符。
下面是解决方法
在替换前判断替换内容长度是否超过255,如果超长就分段替换,代码如下
foreach (string bookmarkName in bookmarks.Keys)
{
int len = bookmarks[bookmarkName].Length;
int cnt = len / 255;
string newstr;
string newStrs;
if (bookmarks[bookmarkName].Length < 255)
{
replace(doc, bookmarkName, bookmarks[bookmarkName]);//替换内容
}
else
{
for (int i = 0; i <= cnt; i++)
{
if (i != cnt)
newstr = bookmarks[bookmarkName].ToString().Substring(i * 255, 255) + bookmarkName; //新的替换字符串
else
newstr = bookmarks[bookmarkName].ToString().Substring(i * 255, len - i * 255); //最后一段需要替换的文字
newStrs = newstr;
replace(doc, bookmarkName, newStrs);//替换内容
}
}
}
第一种方法搞定!!!
方法二:使用Aspose.Words
这种方法不用安装office。
1、制作模板
在需要替换的地方插入域,插入-》文档部件-》域-》选择MergeField,在域名处添加内容。
WPS的步骤为 插入-》选择文档部件-》选择域-》选择邮件合并
添加完成后的效果如下:
2、上代码
2.1 添加引用
using Aspose.Words;
2.1 建立对应关系
string[] fieldNames = new string[] { "姓名", "性别", "出生年月", "民族", "文化程度", "详细地址", "电话" };
object[] fieldValues = new object[] { item.Name, item.Sex, item.BirthDay, item.Ethnic, item.EducationalLevel, item.Address, item.Phone};
string mubanFile = "模板1.docx";
string templatePath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, mubanFile);
string wordpath = outputPath + "xx.docx";//导出word地址
AsposeWordHelper helper = new AsposeWordHelper();
helper.OpenTempelte(templatePath); //打开模板文件
helper.Executefield(fieldNames, fieldValues);//域赋值
helper.SaveDoc(wordpath); //文件保存
下面是word文档操作辅助类AsposeWordHelper.cs的内容
/// <summary>
/// word文档操作辅助类
/// </summary>
public class AsposeWordHelper
{
/// <summary>
/// Word
/// </summary>
private Document wordDoc;
/// <summary>
/// 基于模版新建Word文件
/// </summary>
/// <param name="path">模板路径</param>
public void OpenTempelte(string path)
{
wordDoc = new Document(path);
}
/// <summary>
/// 书签赋值用法
/// </summary>
/// <param name="LabelId">书签名</param>
/// <param name="Content">内容</param>
public void WriteBookMark(string LabelId, string Content)
{
if (wordDoc.Range.Bookmarks[LabelId] != null)
{
wordDoc.Range.Bookmarks[LabelId].Text = Content;
}
}
/// <summary>
/// 列表赋值用法
/// </summary>
/// <param name="dt"></param>
public void WriteTable(DataTable dt)
{
wordDoc.MailMerge.ExecuteWithRegions(dt);
}
/// <summary>
/// 文本域赋值用法
/// </summary>
/// <param name="fieldNames">key</param>
/// <param name="fieldValues">value</param>
public void Executefield(string[] fieldNames, object[] fieldValues)
{
wordDoc.MailMerge.Execute(fieldNames, fieldValues);
}
/// <summary>
/// Pdf文件保存
/// </summary>
/// <param name="filename">文件路径+文件名</param>
public void SavePdf(string filename)
{
wordDoc.Save(filename, SaveFormat.Pdf);
}
/// <summary>
/// Doc文件保存
/// </summary>
/// <param name="filename">文件路径+文件名</param>
public void SaveDoc(string filename)
{
wordDoc.Save(filename, SaveFormat.Doc);
}
/// <summary>
/// 不可编辑受保护,需输入密码
/// </summary>
/// <param name="pwd">密码</param>
public void NoEdit(string pwd)
{
wordDoc.Protect(ProtectionType.ReadOnly, pwd);
}
/// <summary>
/// 只读
/// </summary>
public void ReadOnly()
{
wordDoc.Protect(ProtectionType.ReadOnly);
}
/// <summary>
/// 通过流导出word文件
/// </summary>
/// <param name="stream">流</param>
/// <param name="fileName">文件名</param>
public static HttpResponseMessage ExportWord(Stream stream, string fileName)
{
var file = stream;
fileName += DateTime.Now.ToString("yyyyMMddHHmmss");
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(file);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/msword");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = fileName + ".doc";
return result;
}
/// <summary>
/// 通过流导出pdf文件
/// </summary>
/// <param name="stream">流</param>
/// <param name="fileName">文件名</param>
public static HttpResponseMessage ExportPdf(Stream stream, string fileName)
{
var file = stream;
fileName += DateTime.Now.ToString("yyyyMMddHHmmss");
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(file);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = fileName + ".pdf";
return result;
}
这种方法虽然不用安装office,但是导出的文档有AsposeWord的水印和页眉,不过可以手动去掉。
大家有没有其他的方法,欢迎讨论。
如有错误,还请批评指正!
C#通过模板导出Word的两种方法(超简单)的更多相关文章
- 【吉光片羽】MVC 导出Word的两种方式
1.直接将Html转成Word.MVC自带FileResult很好用.Html中我们也可以嵌入自己的样式. html: <div id="target"> <st ...
- .net导出Word的一种方法
由于ActiveX控件只支持IE(好像FF可以通过安装插件支持),所以js导出word的方式就比较局限 可是如果当页面经过js修改以后,.net是无法获取到的,所以要通过js获取到最新的html并传给 ...
- C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)
第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT extern "c" _declspec(dllexport) #dlse # ...
- JavaScript模板引擎artTemplate.js——两种方法实现性别的判定
template.helper(name, callback) name:必传,辅助事件的名称. callback:必传,辅助事件的回调函数. return:undefined 所谓的辅助事件,主要用 ...
- layui导出表格的两种方法
一.不熟悉layui小白使用方法 1.引入如下js文件: 2.编写如下函数: 3.表格ID要与函数取值保持一致即可,再就是自定义一个按钮触发事件 二.引入插件使用方法 1.layui官网下载插件包: ...
- php导出表格两种方法 ——PhpExcel的列子
php常用的导出表格有两种方法,第一种是输出表格,这种方法打开的时候有警告提示,一般导出表格会用phpexcel,这个导出比较灵活,而且还可以设置表格的样式. 第一种导出例子 /** * 执行导出 * ...
- C#通过模板导出Word(文字,表格,图片)
C#通过模板导出Word(文字,表格,图片) C#导出Word,Excel的方法有很多,这次因为公司的业务需求,需要导出内容丰富(文字,表格,图片)的报告,以前的方法不好使,所以寻找新的导出方法, ...
- 代码操作Word时,目录自动更新的两种方法
最近的项目中有一个功能点为:根据分析数据库并生成报告.不过不是大数据.数据挖掘之类,报告的内容.组织方式都是事先固定下来的.实现的方式为,在普通word文档中插入书签制成模板,然后程序使用OpenXM ...
- AE 将地图导出为图片的两种方法
在ArcGIS的开发中,我们经常需要将当前地图打印(或是转出)到图片文件中.将Map或Layout中的图象转出有两种方法,一种为通过IActiveView的OutPut函数,另外一种是通过IExpor ...
随机推荐
- babel转码时generator的regeneratorRuntime
今天写generator函数时发现出错:regeneratorRuntime. 在stackoverflow网友说需是本地babel软件包没有安装完全. package.json: "dev ...
- 迟早要知道的JS系列之常用数组方法
常用数组方法 一.不会改变原始数组的方法: 即访问方法,下面的这些方法绝对不会改变调用它们的对象的值,只会返回一个新的数组或者返回一个其它的期望值. 1. concat() ** 语法:** Java ...
- Linux——vim操作
查看文件:vim 文件名 进入vim命令后: Shift+g:到达文件底部 /搜索内容:搜索文件中字符串:点击“N”键,查看下一个搜索内容位置
- Linux文件列表查询ll和ls区别
ll ll查询文件列表,查询结果为当前目录下文件和文件夹的详细信息,包括权限.根目录.用户.创建时间等. ls ls查询出的查询结果只显示当前目录下文件夹和文件名称
- ubuntu 基本操作
一 :下载文件操作 wge 下载地址 解压命令: tar
- Xftp远程连接出现“无法显示文件夹”的问题补充
网上有很多朋友出现相同的问题,各位热心网友都给出了自己的解决方案,其中大多数网友给出的解决方案都是:将Xftp更换成“被动连接模式”.但是很不幸的是,本人通过这种方式并没有得到有效的解决,网上的各大方 ...
- C# 7.0 新增功能&结合微软简化理解
C# 7.0更新时间为2019.2左右 C# 7.0 ~ 7.3 分别需要VS2017 与 .NET Core 1.0. .NET Core 2.0 SDK..NET Core 2.1 SDK,需要在 ...
- MySQL死锁系列-常见加锁场景分析
在上一篇文章<锁的类型以及加锁原理>主要总结了 MySQL 锁的类型和模式以及基本的加锁原理,今天我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能 ...
- Java中的集合(七)双列集合顶层接口------Map接口架构
Java中的集合(七)双列集合顶层接口------Map接口 一.Map接口的简介 通过List接口,我们知道List接口下的集合是单列集合,数据存储是单列的结构.Map接口下是一个键值对(key-v ...
- Alpha冲刺 —— 5.7
这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...