aspose.word主要是通过把读取出来的数据放到datatable里,在datable里做相应的格式的调整,再导出到word文档里。mvc和webform最后导出的语句略有不同,在mvc的controller,用的是base.File,对应的是FileContentResult,在webform里用的是Response。写法分别为:

         //在WebForm中,保存文档到流中,使用Response. BinaryWrite输出该文件
         var docStream = new MemoryStream();
         doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
         Response.ContentType = "application/msword";
         Response.AddHeader("content-disposition", "attachment;  filename=Template.doc");
         Response.BinaryWrite(docStream.ToArray());
         Response.End();
        //在MVC中采用,保存文档到流中,使用base.File输出该文件
        var docStream = new MemoryStream();
        doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
        return base.File(docStream.ToArray(), "application/msword","Template.doc");
       本人的项目是基于mvc的,所以采用后者。
      首先项目需要对 aspose.word.dll进行添加引用, aspose.word.dll下载破解版的,版本过低会无法使用某些,如Aspose.Words.Saving等的相关属性,就没有SaveOptions.CreateSaveOptions方法,这个可以直接删掉,对基本的导出功能没有影响。之后将贴核心代码,代码都已经封装好,只需调用,传相关参数即可,后面解析代码的功能。
      本人创建了一个WordHelper类,定义了公共属性,因为只是当前类调用,所以设为了私有,调用首先需实例化模板,模板就是之前已经写好的word模板,同时还写了相应的方法转化为可以接受中文值,比如性别是数据表里是bool类型,用false or true来代表男女,导出时则需转化为对应的中文值:

 /// <summary>
/// 模板
/// </summary>
private string templateFile { get; set; }
private Document doc { get; set; }
private DocumentBuilder builder { get; set; }
#region 实例化模板
public WordHelper(string templateFile)
{
string templatePath = "Content/templates";
if (Path.GetExtension(templateFile) != ".doc") //如果传的模板参数没有扩展名,则加上扩展名
templateFile = templateFile + ".doc";
templateFile = WordFilePath.GetFilePath(templatePath, templateFile); //获取模板路径
doc = new Document(templateFile); //载入模板
builder = new DocumentBuilder(doc);
}
#endregion
#region 输出文件流
public MemoryStream DocStream
{
get
{
var docStream = new MemoryStream();
doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
return docStream;
}
}
#endregion
#region 转化为对应的中文值
/// <summary>
/// 转化为对应的中文值
/// </summary>
/// <param name="objName">值名称</param>
/// <param name="objValue">对应的值类型</param>
/// <returns></returns>
public static string SetChinaValue(object objName, object objValue)
{
object value = "";
if (!string.IsNullOrEmpty(objValue.ToString()))
{
if (Common.lstDictionaryCodes.Contains(objName)) //字典值
{
value = Common.GetDicName(Convert.ToInt32(objValue));
}
else if (Common.lstUserIDs.Contains(objName)) //人员档案
{
string[] strValue = objValue.ToString().Split(',');
for (int i = ; i < strValue.Length; i++)
{
value += Common.GetPersonName(strValue[i]) + ",";
}
value = !string.IsNullOrEmpty(value.ToString()) ? value.ToString().Substring(, value.ToString().Length - ) : "";
}
else if (objValue.GetType() == typeof(string))
{
value = objValue;
}
else if (objValue.GetType() == typeof(int) || objValue.GetType() == typeof(int?))
{
value = objValue;
}
else if (objValue.GetType() == typeof(DateTime) || objValue.GetType() == typeof(DateTime?))
{
value = Convert.ToDateTime(objValue).ToString("yyyy-MM-dd");
}
else if (objValue.GetType() == typeof(decimal) || objValue.GetType() == typeof(decimal?))
{
value = objValue;
}
else if (objValue.GetType() == typeof(bool) || objValue.GetType() == typeof(bool?))
{
if (objName.Equals("Sex"))
{
if (objValue.Equals(false))
value = "男";
else
value = "女";
}
else
{
if (objValue.Equals(true))
value = "☑是 □否";
else
value = "□是 ☑否";
}
}
}
return value.ToString();
}
#endregion
#region 保存文件名
/// <summary>
/// 保存文件名
/// </summary>
/// <param name="name">姓名</param>
/// <param name="value">编号</param>
/// <returns></returns>
public static string SaveDocName(string name, string value)
{
string oDoc = "";
if (!string.IsNullOrEmpty(name))
{
oDoc = name + "_" + value + ".doc";
}
else
{
oDoc = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".doc";
}
return oDoc;
}
#endregion
#region 保存合并后的文档
public MemoryStream ExportDoc()
{
//保存合并后的文档
var docStream = new MemoryStream();
doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
return docStream;
}
#endregion #region 通过DataTable导出基本信息
/// <summary>
/// 获取导出文件的基本信息
/// </summary>
/// <param name="bllType">bll类</param>
/// <param name="dicWhere">查询条件</param>
/// <returns></returns>
public void GetBasicInfo(Type bllType, Dictionary<string, string> dicWhere)
{
try
{
NameValueCollection nvc = new NameValueCollection();
foreach (var item in dicWhere)
{
if (!string.IsNullOrEmpty(item.Key))
{
nvc.Add(item.Key, item.Value);
}
}
Assembly asmBLL = Assembly.Load(typeof(BLL.BLLBase).Namespace);
BLL.IBLLBase ibllBase = (BLL.IBLLBase)asmBLL.CreateInstance(bllType.FullName);
DataSet ds = ibllBase.GetData(nvc); //数据源
DataTable dt = CreateNewTable(bllType, ds.Tables[]); doc.MailMerge.FieldMergingCallback = new HandleMergeFieldInsertDocument(); //图片处理
doc.MailMerge.Execute(dt); //合并模版,相当于页面的渲染
}
catch (Exception)
{
throw;
}
}
#endregion #region 通过二维数组获取基本信息
/// <summary>
/// 通过二维数组获取基本信息
/// </summary>
/// <param name="bllType">bll类</param>
/// <param name="templateFile">导出模板</param>
/// <param name="dicWhere">查询条件</param>
/// <param name="lsField">导出的字段</param>
/// <returns></returns>
public void GetBasicInfo(Type bllType, Dictionary<string, string> dicWhere, List<string> lsField)
{
try
{
decimal count = ;
NameValueCollection nvc = new NameValueCollection();
foreach (var item in dicWhere)
{
if (!string.IsNullOrEmpty(item.Key))
{
nvc.Add(item.Key, item.Value);
}
}
Assembly asmBLL = Assembly.Load(typeof(BLL.BLLBase).Namespace);
BLL.IBLLBase ibllBase = (BLL.IBLLBase)asmBLL.CreateInstance(bllType.FullName);
DataSet ds = ibllBase.GetData(nvc); //数据源 String[] arrNames = lsField.ToArray();
Object[] objValues = new Object[arrNames.Length]; for (int j = ; j < arrNames.Length; j++)
{
if (ds.Tables[].Rows.Count > )
objValues[j] = SetChinaValue(arrNames[j], ds.Tables[].Rows[][arrNames[j]]);
else
objValues[j] = "";
}
doc.MailMerge.Execute(arrNames, objValues); //合并模版,相当于页面的渲染
}
catch (Exception)
{
throw;
}
}
#endregion #region 通过域循环导出table列表
/// <summary>
/// 通过域循环导出table列表
/// </summary>
/// <param name="bllType">bll类</param>
/// <param name="dicWhere">查询条件</param>
/// <param name="bookmark">模板书签</param>
public void GetTableList(Type bllType, Dictionary<string, string> dicWhere, string bookmark)
{
NameValueCollection nvc = new NameValueCollection();
foreach (var item in dicWhere)
{
if (!string.IsNullOrEmpty(item.Key))
{
nvc.Add(item.Key, item.Value);
}
}
Assembly asmBLL = Assembly.Load(typeof(BLL.BLLBase).Namespace);
BLL.IBLLBase ibllBase = (BLL.IBLLBase)asmBLL.CreateInstance(bllType.FullName);
DataSet ds = ibllBase.GetData(nvc); //数据源
DataTable dt = CreateNewTable(bllType, ds.Tables[], bookmark); //合并模版,相当于页面的渲染
doc.MailMerge.ExecuteWithRegions(dt);
}
#endregion
#region 通过书签来循环导出数据列表
/// <summary>
/// 通过书签来循环导出数据列表
/// </summary>
/// <param name="bllType">bll类</param>
/// <param name="dicWhere">查询条件</param>
/// <param name="dicOrderby">排序条件</param>
/// <param name="bookmark">模板循环列表书签</param>
public void GetListByMark(Type bllType, Dictionary<string, string> dicWhere, Dictionary<string, string> dicOrderby, string bookmark)
{
NameValueCollection nvc = new NameValueCollection();
foreach (var item in dicWhere)
{
if (!string.IsNullOrEmpty(item.Key))
{
nvc.Add(item.Key, item.Value);
}
}
NameValueCollection orderby = new NameValueCollection();
foreach (var item in dicOrderby) //查询条件
{
if (!string.IsNullOrEmpty(item.Key))
{
orderby.Add(item.Key, item.Value);
}
} Assembly asmBLL = Assembly.Load(typeof(BLL.BLLBase).Namespace);
BLL.IBLLBase ibllBase = (BLL.IBLLBase)asmBLL.CreateInstance(bllType.FullName);
DataTable dt = ibllBase.GetData(nvc, orderby).Tables[]; //数据源 int count = ;
//记录要显示多少列
for (var i = ; i < dt.Columns.Count; i++)
{
string strMark = dt.Columns[i].ColumnName.Trim();
if (doc.Range.Bookmarks[strMark] != null)
{
Bookmark mark = doc.Range.Bookmarks[strMark];
mark.Text = "";
count++;
}
}
List<string> listcolumn = new List<string>(count);
for (var i = ; i < count; i++)
{
builder.MoveToCell(, , i, ); //移动单元格
if (builder.CurrentNode.NodeType == NodeType.BookmarkStart)
{
listcolumn.Add((builder.CurrentNode as BookmarkStart).Name);
}
}
double width = builder.CellFormat.Width;//获取单元格宽度
if (doc.Range.Bookmarks[bookmark] != null)
{
builder.MoveToBookmark(bookmark); //开始添加值
for (var m = ; m < dt.Rows.Count; m++)
{
for (var i = ; i < listcolumn.Count; i++)
{
builder.InsertCell(); // 添加一个单元格
builder.CellFormat.Borders.LineStyle = LineStyle.Single;
builder.CellFormat.Borders.Color = System.Drawing.Color.Black;
builder.CellFormat.Width = width;
builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;
builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//垂直居中对齐
builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//水平居中对齐
builder.Write(dt.Rows[m][listcolumn[i]].ToString());
}
builder.EndRow();
}
doc.Range.Bookmarks[bookmark].Text = "";
}
}
#endregion #region 创建DataTable,存放处理后的值进新的DataTable里
/// <summary>
/// 创建datatable
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="bookmark">模板列表书签</param>
/// <returns></returns>
private DataTable CreateNewTable(Type t, DataTable dt, string bookmark = null)
{
DataTable TableList = new DataTable();
if (!string.IsNullOrEmpty(bookmark))
{
TableList.TableName = bookmark;
}
string strMark = "";
List<string> lsMark = new List<string>();
for (var i = ; i < dt.Columns.Count; i++)
{
strMark = dt.Columns[i].ColumnName.Trim();
TableList.Columns.Add(strMark);
//if (doc.Range.Bookmarks[strMark] != null) //按书签添加到新表
//{
// Bookmark mark = doc.Range.Bookmarks[strMark];
// mark.Remove();
// TableList.Columns.Add(strMark);
// lsMark.Add(strMark);
//}
} if (dt.Rows.Count > )
{
for (int i = ; i < dt.Rows.Count; i++)
{
DataRow dr = TableList.NewRow();
for (int j = ; j < dt.Columns.Count; j++)
{
dr[j] = SetChinaValue(dt.Columns[j].ColumnName, dt.Rows[i][j]);
}
TableList.Rows.Add(dr);
}
}
else //没有值时,直接赋值为"",去掉文档里的域值
{
DataRow dr = TableList.NewRow();
for (int j = ; j < dt.Columns.Count; j++)
{
if (t.Name == "PrejobTraining") //岗前培训为空时
{
dr[j] = "□是 □否";
}
else
{
dr[j] = "";
}
}
TableList.Rows.Add(dr);
}
return TableList;
}
#endregion
}
#endregion

WordHelper

其它相关辅助类:
   HandleMergeFieldInsertDocument 类

 #region 导出Word处理图片
/// <summary>
/// 导出Word处理图片
/// </summary>
public class HandleMergeFieldInsertDocument : IFieldMergingCallback
{
//文本处理在这里,如果写在这一块,则不起作用
void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
{
}
//图片处理在这里
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
{
if (args.DocumentFieldName.Equals("Photo"))
{
// 使用DocumentBuilder处理图片的大小
DocumentBuilder builder = new DocumentBuilder(args.Document);
builder.MoveToMergeField(args.FieldName);
if (!string.IsNullOrEmpty((string)args.FieldValue))
{
string argsPath = HttpContext.Current.Server.MapPath(args.FieldValue.ToString());
if (System.IO.File.Exists(argsPath)) //找到文件才添加
{
Shape shape = builder.InsertImage(argsPath);
// 设置x,y坐标和高宽.
shape.Left = ;
shape.Top = ;
shape.Width = ;
shape.Height = ;
}
}
}
}
}
#endregion

HandleMergeFieldInsertDocument

C# 导出word文档及批量导出word文档(2)的更多相关文章

  1. C# 导出word文档及批量导出word文档(4)

          接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用 ...

  2. C# 导出word文档及批量导出word文档(3)

    在初始化WordHelper时,要获取模板的相对路径.获取文档的相对路径多个地方要用到,比如批量导出时要先保存文件到指定路径下,再压缩打包下载,所以专门写了个关于获取文档的相对路径的类. #regio ...

  3. C# 导出word文档及批量导出word文档(1)

         这里用到了两个dll,一个是aspose.word.dll,另外一个是ICSharpCode.SharpZipLib.dll,ICSharpCode.SharpZipLib.dll是用于批量 ...

  4. 吴裕雄--天生自然python学习笔记:python文档操作批量替换 Word 文件中的文字

    我们经常会遇到在不同的 Word 文件中的需要做相同的文字替换,若是一个一个 文件操作,会花费大量时间 . 本节案例可以找出指定目录中的所有 Word 文件(包含 子目录),并对每一个文件进行指定的文 ...

  5. ATF批量导出工具

    ATF批量导出工具 08 / 31, 2013 批量导出Atf的工具,使用是adobe atf 编码核心 先说一下关于atf的bug 当atf导出时候启用了mips选项会导致:如果纹理问长方形时上传会 ...

  6. C#操作Word的+ CKEditor 輸出成Word文件(包含圖案上傳)

    C#操作Word 参考博文: C#操作word类文件 https://www.cnblogs.com/walking/p/3571068.html C#中的Office操作专栏(21) http:// ...

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

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

  8. c#操作word文档之简历导出

    前言 1.写这个功能之前,我得说说微软的这个类库,用着真苦逼!是他让我有程序猿,攻城尸的感觉了.首先这个类库,从没接触过,方法与属性都不懂,还没有提示.神啊,我做这功能真是一步一卡,很潇洒啊. 2.这 ...

  9. java使用freemarker模板导出word(带有合并单元格)文档

    来自:https://blog.csdn.net/qq_33195578/article/details/73790283 前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并 ...

随机推荐

  1. php curl 基本用法

    <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com"); curl_se ...

  2. mysql 索引管理原则

    最近在学习mysql的索引优化,结合着我们网盟系统的一些业务,翻阅一些资料,整理出如下的一些想法: 1.索引建立的原则一:最左前缀匹配原则 ,非常重要的原则,mysql会一直向右匹配直到遇到范围查询( ...

  3. ios对SQLite3的使用

    ios对SQLite3的使用 一.在Firefox中打开sqlite3(如果没有,选择工具->附加组件,添加即可)新建sqlite3数据库,Contacts, 建立一个members表,字段 i ...

  4. 解读 《2014 最流行编程语言》 by Code Eval

    此文已转至http://cn.abnerchou.me/2014/02/23/fa87ae80/ 原文:点我 原文翻译:点我 首先了解下CodeEval是做什么的: A tool for auto e ...

  5. ssh公钥自动登陆

    第一步,在服务器上安装ssh服务 sudo apt-get install ssh 通过ssh -v查看是否安装成功 第二步创建本地公钥秘钥对 ssh-keygen -t rsa  //创建ssh公钥 ...

  6. c#使用spy进行模拟操作

    很无奈,写了很长时间,最后保存时网页失去响应,真是要命呢.本来想就此放弃了,但是想还是粗略的重写一次吧,希望日后可以对朋友有一定的帮助. Microsoft.Spy工具是一个基础工具,我们简要介绍一下 ...

  7. AdHoc发布时出现重复Provisioning Profile的解决方案

    当在developer.apple.com更新Provisioning Profile(添加新机器)后,下载到本地,双击载入xcode,运行时没问题.但如果用adhoc发布,可能会发现重复的provi ...

  8. JAVA接口示例

    总感觉有点虚,但慢慢找到感觉了.将对象放进数组里,这就比较深入了. interface drawTest{ public void draw(); public void doAnyThing(); ...

  9. Windows打印体系结构之Print Spooler概念与架构

    Windows打印体系结构之Print Spooler概念与架构Windows 思杰之路(陶菘) · 2016-09-06 22:07 房子好不好,对我而言始终都是肉体的栖居.对于灵魂,我从来不知道该 ...

  10. Android 自定义属性(attrs.xml,TypedArray)

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组 件不够用,自定义组件就不可避免了.那么如何才能做到像官 ...