博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 导出word文档及批量导出word文档(2)
阅读量:5969 次
发布时间:2019-06-19

本文共 14934 字,大约阅读时间需要 49 分钟。

     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来代表男女,导出时则需转化为对应的中文值:
      
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, Dictionary
dicWhere, 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, Dictionary
dicWhere, 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
WordHelper

   其它相关辅助类:

   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
HandleMergeFieldInsertDocument

     

转载于:https://www.cnblogs.com/jingshuisihan/p/4604278.html

你可能感兴趣的文章
Spring Task配置
查看>>
Linux查看某个端口是否被占用
查看>>
IPSEC ××× 互通性测试结果(二)
查看>>
玩转智能路由器-WRTnode开发板[接上网线]
查看>>
mysql Decimal(M,D)解释
查看>>
lduan Exchange 2013 公共文件夹(十)
查看>>
Create a Drag and Drop Puzzle in ActionScript 3.0
查看>>
Java在eclipse下开发的常用快捷键集锦
查看>>
springMVC--(讲解5)文件上传与传参测试
查看>>
可心耳语-属于网络工程师的人声电台(第一期)
查看>>
Windows上安装Apache
查看>>
ARP数据报格式
查看>>
vim、g++、gdb及makefile的学习
查看>>
【重大更新】DevExpress v17.1新版亮点(ASP.NET篇)
查看>>
【版本更新】完整UI库Kendo UI发布R3 2017|附下载
查看>>
辛东方:科技的发展将导致更多人失业?
查看>>
find的命令的使用和文件名的后缀
查看>>
Nginx的rewrite应用
查看>>
OSPF 基本配置
查看>>
Linux文件系统上的特殊权限 SUID, SGID, Sticky(粘之位)
查看>>