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框架

    private function replyMostPhoto($data,$arr){$this->logger("已经到达回复多图文!".$arr[0]['Title'] ...

  2. 转载:Struts2.3.15.1升级总结

    转载网址:http://blog.csdn.net/amosryan/article/details/10350481 由于大家都懂的原因,涉struts2的项目需要将struts2相关包升级至2.3 ...

  3. Symfony2源码分析——启动过程1

    本文通过阅读分析Symfony2的源码,了解Symfony2启动过程中完成哪些工作,从阅读源码了解Symfony2框架. Symfony2的核心本质是把Request转换成Response的一个过程. ...

  4. java include包含指令例子

    1.项目架构 2. 代码 (1)top.jsp 2.copyright.jsp 3.index.jsp 4.效果图: 5.总结 期间也碰到过很多问题,例如我刚开始不是创建的java动态项目而是java ...

  5. java-Mysql-SQLServer数据类型匹配速查表

    java-Mysql-SQLServer数据类型匹配速查表 Mysql ************************************ 当前列 ClassName ColumnType Di ...

  6. [翻译]localStorage性能的好坏

    原文地址:Is localStorage performance a problem? 如果说2012年对于web开发世界来说有什么值得记住的事的话,关于localStorage性能的争论一定高居榜首 ...

  7. .net performance

    http://msdn.microsoft.com/en-us/library/ms173196.aspx http://www.zhihu.com/question/20314377 http:// ...

  8. qt编写一个只能运行单个实例的程序,不用Windows API

    QtSingleApplicationhttp://code.qt.io/cgit/qt-solutions/qt-solutions.git/tree/qtsingleapplication 已打开 ...

  9. 什么是Ajax? (转载于疯狂客的BLOG)

    Ajax的定义 Ajax不是一个技术,它实际上是几种技术,每种技术都有其独特这处,合在一起就成了一个功能强大的新技术. Ajax包括: XHTML和CSS,使用文档对象模型(Document Obje ...

  10. USACO6.4-The Primes

    The Primes IOI'94 In the square below, each row, each column and the two diagonals can be read as a ...