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


         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 /// <summary>
      2         /// 模板
      3         /// </summary>
      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         /// <summary>
     31         /// 转化为对应的中文值
     32         /// </summary>
     33         /// <param name="objName">值名称</param>
     34         /// <param name="objValue">对应的值类型</param>
     35         /// <returns></returns>
     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         /// <summary>
     93         /// 保存文件名
     94         /// </summary>
     95         /// <param name="name">姓名</param>
     96         /// <param name="value">编号</param>
     97         /// <returns></returns>
     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             else
    106             {
    107                 oDoc = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".doc";
    108             }
    109             return oDoc;
    110         }
    111         #endregion
    112         #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         #endregion
    121 
    122         #region 通过DataTable导出基本信息
    123         /// <summary>
    124         /// 获取导出文件的基本信息
    125         /// </summary>
    126         /// <param name="bllType">bll类</param>
    127         /// <param name="dicWhere">查询条件</param>
    128         /// <returns></returns>
    129         public void GetBasicInfo(Type bllType, Dictionary<string, string> dicWhere)
    130         {
    131             try
    132             {
    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         #endregion
    155 
    156         #region 通过二维数组获取基本信息
    157         /// <summary>
    158         /// 通过二维数组获取基本信息
    159         /// </summary>
    160         /// <param name="bllType">bll类</param>
    161         /// <param name="templateFile">导出模板</param>
    162         /// <param name="dicWhere">查询条件</param>
    163         /// <param name="lsField">导出的字段</param>
    164         /// <returns></returns>
    165         public void GetBasicInfo(Type bllType, Dictionary<string, string> dicWhere, List<string> lsField)
    166         {
    167             try
    168             {
    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         /// <summary>
    203         /// 通过域循环导出table列表
    204         /// </summary>
    205         /// <param name="bllType">bll类</param>
    206         /// <param name="dicWhere">查询条件</param>
    207         /// <param name="bookmark">模板书签</param>
    208         public void GetTableList(Type bllType, Dictionary<string, string> 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         /// <summary>
    229         /// 通过书签来循环导出数据列表
    230         /// </summary>
    231         /// <param name="bllType">bll类</param>
    232         /// <param name="dicWhere">查询条件</param>
    233         /// <param name="dicOrderby">排序条件</param>
    234         /// <param name="bookmark">模板循环列表书签</param>
    235         public void GetListByMark(Type bllType, Dictionary<string, string> dicWhere, Dictionary<string, string> 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<string> listcolumn = new List<string>(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         #endregion
    302 
    303         #region 创建DataTable,存放处理后的值进新的DataTable里
    304         /// <summary>
    305         /// 创建datatable
    306         /// </summary>
    307         /// <param name="dt">数据源</param>
    308         /// <param name="bookmark">模板列表书签</param>
    309         /// <returns></returns>
    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<string> lsMark = new List<string>();
    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                     else
    354                     {
    355                         dr[j] = "";
    356                     }
    357                 }
    358                 TableList.Rows.Add(dr);
    359             }
    360             return TableList;
    361         }
    362         #endregion
    363     }
    364     #endregion 
    WordHelper

       其它相关辅助类:
       HandleMergeFieldInsertDocument 类   

     1 #region 导出Word处理图片
     2     /// <summary>
     3     /// 导出Word处理图片
     4     /// </summary>
     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

         

  • 相关阅读:
    正则入门小随
    用栈求简单算术表达式的值
    数据结构复习
    数据结构笔记(第九章)
    数据结构笔记(第八章)
    Java第三阶段学习(十四、JSP动态页面、EL表达式、JSTL标签库)
    Java第三阶段学习(十三、会话技术、Cookie技术与Session技术)
    Java第三阶段学习(十二、HttpServletRequest与HttpServletResponse)
    Java第三阶段学习(十一、Servlet基础、servlet中的方法、servlet的配置、ServletContext对象)
    Java第三阶段学习(十、XML学习)
  • 原文地址:https://www.cnblogs.com/jingshuisihan/p/4604278.html
Copyright © 2020-2023  润新知