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来代表男女,导出时则需转化为对应的中文值: WordHelper
1 ///2 /// 模板 3 /// 4 private string templateFile { get; set; } 5 private Document doc { get; set; } 6 private DocumentBuilder builder { get; set; } 7 #region 实例化模板 8 public WordHelper(string templateFile) 9 { 10 string templatePath = "Content/templates"; 11 if (Path.GetExtension(templateFile) != ".doc") //如果传的模板参数没有扩展名,则加上扩展名 12 templateFile = templateFile + ".doc"; 13 templateFile = WordFilePath.GetFilePath(templatePath, templateFile); //获取模板路径 14 doc = new Document(templateFile); //载入模板 15 builder = new DocumentBuilder(doc); 16 } 17 #endregion 18 #region 输出文件流 19 public MemoryStream DocStream 20 { 21 get 22 { 23 var docStream = new MemoryStream(); 24 doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc)); 25 return docStream; 26 } 27 } 28 #endregion 29 #region 转化为对应的中文值 30 ///31 /// 转化为对应的中文值 32 /// 33 /// 值名称 34 /// 对应的值类型 35 ///36 public static string SetChinaValue(object objName, object objValue) 37 { 38 object value = ""; 39 if (!string.IsNullOrEmpty(objValue.ToString())) 40 { 41 if (Common.lstDictionaryCodes.Contains(objName)) //字典值 42 { 43 value = Common.GetDicName(Convert.ToInt32(objValue)); 44 } 45 else if (Common.lstUserIDs.Contains(objName)) //人员档案 46 { 47 string[] strValue = objValue.ToString().Split(','); 48 for (int i = 0; i < strValue.Length; i++) 49 { 50 value += Common.GetPersonName(strValue[i]) + ","; 51 } 52 value = !string.IsNullOrEmpty(value.ToString()) ? value.ToString().Substring(0, value.ToString().Length - 1) : ""; 53 } 54 else if (objValue.GetType() == typeof(string)) 55 { 56 value = objValue; 57 } 58 else if (objValue.GetType() == typeof(int) || objValue.GetType() == typeof(int?)) 59 { 60 value = objValue; 61 } 62 else if (objValue.GetType() == typeof(DateTime) || objValue.GetType() == typeof(DateTime?)) 63 { 64 value = Convert.ToDateTime(objValue).ToString("yyyy-MM-dd"); 65 } 66 else if (objValue.GetType() == typeof(decimal) || objValue.GetType() == typeof(decimal?)) 67 { 68 value = objValue; 69 } 70 else if (objValue.GetType() == typeof(bool) || objValue.GetType() == typeof(bool?)) 71 { 72 if (objName.Equals("Sex")) 73 { 74 if (objValue.Equals(false)) 75 value = "男"; 76 else 77 value = "女"; 78 } 79 else 80 { 81 if (objValue.Equals(true)) 82 value = "☑是 □否"; 83 else 84 value = "□是 ☑否"; 85 } 86 } 87 } 88 return value.ToString(); 89 } 90 #endregion 91 #region 保存文件名 92 /// 93 /// 保存文件名 94 /// 95 /// 姓名 96 /// 编号 97 ///98 public static string SaveDocName(string name, string value) 99 {100 string oDoc = "";101 if (!string.IsNullOrEmpty(name))102 {103 oDoc = name + "_" + value + ".doc";104 }105 else106 {107 oDoc = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".doc";108 }109 return oDoc;110 }111 #endregion112 #region 保存合并后的文档113 public MemoryStream ExportDoc()114 {115 //保存合并后的文档116 var docStream = new MemoryStream();117 doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));118 return docStream;119 }120 #endregion121 122 #region 通过DataTable导出基本信息123 /// 124 /// 获取导出文件的基本信息125 /// 126 /// bll类127 /// 查询条件128 ///129 public void GetBasicInfo(Type bllType, Dictionary dicWhere)130 {131 try132 {133 NameValueCollection nvc = new NameValueCollection();134 foreach (var item in dicWhere)135 {136 if (!string.IsNullOrEmpty(item.Key))137 {138 nvc.Add(item.Key, item.Value);139 }140 }141 Assembly asmBLL = Assembly.Load(typeof(BLL.BLLBase).Namespace);142 BLL.IBLLBase ibllBase = (BLL.IBLLBase)asmBLL.CreateInstance(bllType.FullName);143 DataSet ds = ibllBase.GetData(nvc); //数据源144 DataTable dt = CreateNewTable(bllType, ds.Tables[0]);145 146 doc.MailMerge.FieldMergingCallback = new HandleMergeFieldInsertDocument(); //图片处理147 doc.MailMerge.Execute(dt); //合并模版,相当于页面的渲染148 }149 catch (Exception)150 {151 throw;152 }153 }154 #endregion155 156 #region 通过二维数组获取基本信息157 /// 158 /// 通过二维数组获取基本信息159 /// 160 /// bll类161 /// 导出模板162 /// 查询条件163 /// 导出的字段164 ///165 public void GetBasicInfo(Type bllType, Dictionary dicWhere, List lsField)166 {167 try168 {169 decimal count = 0;170 NameValueCollection nvc = new NameValueCollection();171 foreach (var item in dicWhere)172 {173 if (!string.IsNullOrEmpty(item.Key))174 {175 nvc.Add(item.Key, item.Value);176 }177 }178 Assembly asmBLL = Assembly.Load(typeof(BLL.BLLBase).Namespace);179 BLL.IBLLBase ibllBase = (BLL.IBLLBase)asmBLL.CreateInstance(bllType.FullName);180 DataSet ds = ibllBase.GetData(nvc); //数据源181 182 String[] arrNames = lsField.ToArray();183 Object[] objValues = new Object[arrNames.Length];184 185 for (int j = 0; j < arrNames.Length; j++)186 {187 if (ds.Tables[0].Rows.Count > 0) 188 objValues[j] = SetChinaValue(arrNames[j], ds.Tables[0].Rows[0][arrNames[j]]); 189 else 190 objValues[j] = "";191 }192 doc.MailMerge.Execute(arrNames, objValues); //合并模版,相当于页面的渲染193 }194 catch (Exception)195 {196 throw;197 }198 }199 #endregion 200 201 #region 通过域循环导出table列表202 /// 203 /// 通过域循环导出table列表204 /// 205 /// bll类206 /// 查询条件207 /// 模板书签208 public void GetTableList(Type bllType, DictionarydicWhere, string bookmark)209 {210 NameValueCollection nvc = new NameValueCollection();211 foreach (var item in dicWhere)212 {213 if (!string.IsNullOrEmpty(item.Key))214 {215 nvc.Add(item.Key, item.Value);216 }217 }218 Assembly asmBLL = Assembly.Load(typeof(BLL.BLLBase).Namespace);219 BLL.IBLLBase ibllBase = (BLL.IBLLBase)asmBLL.CreateInstance(bllType.FullName);220 DataSet ds = ibllBase.GetData(nvc); //数据源221 DataTable dt = CreateNewTable(bllType, ds.Tables[0], bookmark);222 223 //合并模版,相当于页面的渲染224 doc.MailMerge.ExecuteWithRegions(dt);225 }226 #endregion 227 #region 通过书签来循环导出数据列表228 /// 229 /// 通过书签来循环导出数据列表230 /// 231 /// bll类232 /// 查询条件233 /// 排序条件234 /// 模板循环列表书签235 public void GetListByMark(Type bllType, DictionarydicWhere, Dictionary dicOrderby, string bookmark)236 {237 NameValueCollection nvc = new NameValueCollection();238 foreach (var item in dicWhere)239 {240 if (!string.IsNullOrEmpty(item.Key))241 {242 nvc.Add(item.Key, item.Value);243 }244 }245 NameValueCollection orderby = new NameValueCollection();246 foreach (var item in dicOrderby) //查询条件247 {248 if (!string.IsNullOrEmpty(item.Key))249 {250 orderby.Add(item.Key, item.Value);251 }252 }253 254 Assembly asmBLL = Assembly.Load(typeof(BLL.BLLBase).Namespace);255 BLL.IBLLBase ibllBase = (BLL.IBLLBase)asmBLL.CreateInstance(bllType.FullName);256 DataTable dt = ibllBase.GetData(nvc, orderby).Tables[0]; //数据源257 258 int count = 0;259 //记录要显示多少列 260 for (var i = 0; i < dt.Columns.Count; i++)261 {262 string strMark = dt.Columns[i].ColumnName.Trim();263 if (doc.Range.Bookmarks[strMark] != null)264 {265 Bookmark mark = doc.Range.Bookmarks[strMark];266 mark.Text = "";267 count++;268 }269 }270 List listcolumn = new List (count);271 for (var i = 0; i < count; i++)272 {273 builder.MoveToCell(0, 0, i, 0); //移动单元格274 if (builder.CurrentNode.NodeType == NodeType.BookmarkStart)275 {276 listcolumn.Add((builder.CurrentNode as BookmarkStart).Name);277 }278 }279 double width = builder.CellFormat.Width;//获取单元格宽度280 if (doc.Range.Bookmarks[bookmark] != null)281 {282 builder.MoveToBookmark(bookmark); //开始添加值283 for (var m = 0; m < dt.Rows.Count; m++)284 {285 for (var i = 0; i < listcolumn.Count; i++)286 {287 builder.InsertCell(); // 添加一个单元格 288 builder.CellFormat.Borders.LineStyle = LineStyle.Single;289 builder.CellFormat.Borders.Color = System.Drawing.Color.Black;290 builder.CellFormat.Width = width;291 builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;292 builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//垂直居中对齐293 builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//水平居中对齐294 builder.Write(dt.Rows[m][listcolumn[i]].ToString());295 }296 builder.EndRow();297 }298 doc.Range.Bookmarks[bookmark].Text = "";299 }300 }301 #endregion302 303 #region 创建DataTable,存放处理后的值进新的DataTable里304 /// 305 /// 创建datatable306 /// 307 /// 数据源308 /// 模板列表书签309 ///310 private DataTable CreateNewTable(Type t, DataTable dt, string bookmark = null)311 {312 DataTable TableList = new DataTable();313 if (!string.IsNullOrEmpty(bookmark))314 {315 TableList.TableName = bookmark;316 }317 string strMark = "";318 List lsMark = new List ();319 for (var i = 0; i < dt.Columns.Count; i++)320 {321 strMark = dt.Columns[i].ColumnName.Trim();322 TableList.Columns.Add(strMark);323 //if (doc.Range.Bookmarks[strMark] != null) //按书签添加到新表324 //{325 // Bookmark mark = doc.Range.Bookmarks[strMark];326 // mark.Remove();327 // TableList.Columns.Add(strMark);328 // lsMark.Add(strMark);329 //}330 }331 332 if (dt.Rows.Count > 0)333 {334 for (int i = 0; i < dt.Rows.Count; i++)335 {336 DataRow dr = TableList.NewRow();337 for (int j = 0; j < dt.Columns.Count; j++)338 {339 dr[j] = SetChinaValue(dt.Columns[j].ColumnName, dt.Rows[i][j]);340 }341 TableList.Rows.Add(dr);342 }343 }344 else //没有值时,直接赋值为"",去掉文档里的域值345 {346 DataRow dr = TableList.NewRow();347 for (int j = 0; j < dt.Columns.Count; j++)348 {349 if (t.Name == "PrejobTraining") //岗前培训为空时350 {351 dr[j] = "□是 □否";352 }353 else354 {355 dr[j] = "";356 }357 }358 TableList.Rows.Add(dr);359 }360 return TableList;361 }362 #endregion363 }364 #endregion
其它相关辅助类:
HandleMergeFieldInsertDocument 类1 #region 导出Word处理图片 2 ///3 /// 导出Word处理图片 4 /// 5 public class HandleMergeFieldInsertDocument : IFieldMergingCallback 6 { 7 //文本处理在这里,如果写在这一块,则不起作用 8 void IFieldMergingCallback.FieldMerging(FieldMergingArgs e) 9 {10 }11 //图片处理在这里12 void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)13 {14 if (args.DocumentFieldName.Equals("Photo"))15 {16 // 使用DocumentBuilder处理图片的大小17 DocumentBuilder builder = new DocumentBuilder(args.Document);18 builder.MoveToMergeField(args.FieldName);19 if (!string.IsNullOrEmpty((string)args.FieldValue))20 {21 string argsPath = HttpContext.Current.Server.MapPath(args.FieldValue.ToString());22 if (System.IO.File.Exists(argsPath)) //找到文件才添加23 {24 Shape shape = builder.InsertImage(argsPath);25 // 设置x,y坐标和高宽.26 shape.Left = 0;27 shape.Top = 0;28 shape.Width = 80;29 shape.Height = 120;30 }31 }32 }33 }34 }35 #endregion