AsposeHelper.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using Aspose.Cells;
  2. using Aspose.Words;
  3. using Aspose.Words.Tables;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.IO;
  8. using System.Web;
  9. using Ubiety.Dns.Core;
  10. namespace OASystem.API.OAMethodLib.File
  11. {
  12. /// <summary>
  13. /// asponse 文档操作
  14. /// </summary>
  15. public class AsposeHelper
  16. {
  17. #region DownWordToModel
  18. /// <summary>
  19. /// 根据Word模板进行数据的导出Word操作
  20. /// </summary>
  21. /// <param name="tempFileName">模板文件名称</param>
  22. /// <param name="saveFolderName">保存文件夹名称</param>
  23. /// <param name="dic">数据源 key 对应 value</param>
  24. /// <param name="listDt">需要循环的数据DataTable 多个注意DataTableName </param>
  25. /// <returns>返回的文档路径</returns>
  26. public static string ExpertWordToModel(string tempFileName, string saveFolderName, string saveFilName, Dictionary<string, object> dic,
  27. List<DataTable>? listDt)
  28. {
  29. try
  30. {
  31. removeWatermark();//加载监听,用于去除水印
  32. List<string> fieldNames = new List<string>(); //字段名字符串数组
  33. List<object> fieldValues = new List<object>(); //字段值数组
  34. foreach (string key in dic.Keys)
  35. {
  36. fieldNames.Add(key);
  37. fieldValues.Add(dic[key]);
  38. }
  39. string tempPath = string.Format("{0}/Word/Template/{1}", AppSettingsHelper.Get("OfficeTempBasePath"), tempFileName);
  40. //// 将文本编码为字节序列
  41. //byte[] encodedBytes = Encoding.UTF8.GetBytes(tempPath);
  42. //// 解码字节序列为文本
  43. //tempPath = Encoding.UTF8.GetString(encodedBytes);
  44. //载入模板
  45. Document doc = new Document(tempPath);
  46. doc.MailMerge.Execute(fieldNames.ToArray(), fieldValues.ToArray());
  47. //将我们获得的DataTable类型的数据:EduDataTable放入doc方法中做处理
  48. if (listDt != null && listDt.Count > 0)
  49. {
  50. foreach (DataTable dt in listDt)
  51. {
  52. if (dt != null && dt.Rows.Count > 0)
  53. {
  54. doc.MailMerge.ExecuteWithRegions(dt);
  55. }
  56. }
  57. }
  58. //合并模版,相当于页面的渲染
  59. doc.MailMerge.Execute(new[] { "PageCount" }, new object[] { doc.PageCount });
  60. //"OfficeTempBasePath": "C:/Server/File/OA2023/Office/"
  61. //saveFolderName:TencentOCR
  62. string path = string.Format("{0}/Word/{1}", AppSettingsHelper.Get("OfficeTempBasePath"), saveFolderName);
  63. if (!System.IO.Directory.Exists(path))
  64. {
  65. System.IO.Directory.CreateDirectory(path);//不存在就创建文件夹
  66. }
  67. string saveFilePath = string.Format("{0}/{1}", path, saveFilName);
  68. //保存合并后的文档
  69. doc.Save(saveFilePath);
  70. saveFilePath = saveFilePath.Replace("C:/Server/File/OA2023/", AppSettingsHelper.Get("OfficeBaseUrl")); //返回下载地址
  71. return saveFilePath; //返回下载地址
  72. }
  73. catch (Exception ex)
  74. {
  75. return ex.Message;
  76. }
  77. }
  78. /// <summary>
  79. /// 加载监听,用于去除水印
  80. /// </summary>
  81. public static void removeWatermark()
  82. {
  83. new Aspose.Words.License().SetLicense(new MemoryStream(Convert.FromBase64String("PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4yMDA2MDIwMTI2MzM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+OTM2ZTVmZDEtODY2Mi00YWJmLTk1YmQtYzhkYzBmNTNhZmE2PC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjEwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT5wSkpjQndRdnYxV1NxZ1kyOHFJYUFKSysvTFFVWWRrQ2x5THE2RUNLU0xDQ3dMNkEwMkJFTnh5L3JzQ1V3UExXbjV2bTl0TDRQRXE1aFAzY2s0WnhEejFiK1JIWTBuQkh1SEhBY01TL1BSeEJES0NGbWg1QVFZRTlrT0FxSzM5NVBSWmJRSGowOUNGTElVUzBMdnRmVkp5cUhjblJvU3dPQnVqT1oyeDc4WFE9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4=")));
  84. }
  85. #endregion
  86. #region DownExcelToModel
  87. /// <summary>
  88. /// 根据Word模板进行数据的导出Word操作
  89. /// </summary>
  90. /// <param name="tempFileName">Excel模板文件名称</param>
  91. /// <param name="saveFolderName">保存文件夹名称</param>
  92. /// <param name="saveFilName">保存文件名称</param>
  93. /// <param name="dic">数据源 key 对应 value</param>
  94. /// <param name="listDt">需要循环的数据DataTable 多个注意DataTableName </param>
  95. /// <returns>返回的文档路径</returns>
  96. public static string ExpertExcelToModel(string tempFileName, string saveFolderName, string saveFilName, Dictionary<string, object> dic,
  97. List<DataTable>? listDt)
  98. {
  99. try
  100. {
  101. string tempPath = string.Format("{0}/Excel/Template/{1}", AppSettingsHelper.Get("OfficeTempBasePath"), tempFileName);
  102. //载入模板
  103. Workbook wbook = new Workbook(tempPath);
  104. //默认第一个工作表
  105. Worksheet wSheet = wbook.Worksheets[0];
  106. WorkbookDesigner designer = new WorkbookDesigner(wbook);
  107. //数据源 多个
  108. if (listDt != null && listDt.Count > 0)
  109. {
  110. foreach (var item in listDt)
  111. {
  112. if (item.Rows.Count > 0)
  113. {
  114. //designer.SetDataSource(item.TableName, item);
  115. designer.SetDataSource(item);
  116. }
  117. }
  118. }
  119. //报表单位
  120. if (dic.Count > 0)
  121. {
  122. foreach (var item in dic)
  123. {
  124. designer.SetDataSource(item.Key, item.Value);
  125. }
  126. }
  127. designer.Process();
  128. string path = string.Format("{0}/Excel/{1}", AppSettingsHelper.Get("OfficeTempBasePath"), saveFolderName);
  129. if (!System.IO.Directory.Exists(path))
  130. {
  131. System.IO.Directory.CreateDirectory(path);//不存在就创建文件夹
  132. }
  133. string saveFilePath = string.Format("{0}/{1}", path, saveFilName);
  134. //保存合并后的文档
  135. wbook.Save(saveFilePath);
  136. //saveFilePath = saveFilePath.Replace("C:/Server/File/0A2023/", AppSettingsHelper.Get("OfficeBaseUrl")); //返回下载地址
  137. saveFilePath = AppSettingsHelper.Get("OfficeBaseUrl") + "/Office/Excel/" + saveFolderName + "/" + saveFilName;
  138. return saveFilePath; //返回下载地址
  139. }
  140. catch (Exception ex)
  141. {
  142. return ex.Message;
  143. }
  144. }
  145. #endregion
  146. #region List<T> 转 Datatbale
  147. /// <summary>
  148. /// 将List转换为DataTable
  149. /// </summary>
  150. /// <param name="newTableName">newTableName</param>
  151. /// <param name="list">请求数据</param>
  152. /// <returns></returns>
  153. public static DataTable ListToDataTable<T>(string newTableName, List<T> list)
  154. {
  155. //创建一个名为"tableName"的空表
  156. DataTable dt = new DataTable(newTableName);
  157. //创建传入对象名称的列
  158. foreach (var item in list.FirstOrDefault().GetType().GetProperties())
  159. {
  160. dt.Columns.Add(item.Name);
  161. }
  162. //循环存储
  163. foreach (var item in list)
  164. {
  165. //新加行
  166. DataRow value = dt.NewRow();
  167. //根据DataTable中的值,进行对应的赋值
  168. foreach (DataColumn dtColumn in dt.Columns)
  169. {
  170. int i = dt.Columns.IndexOf(dtColumn);
  171. //基元元素,直接复制,对象类型等,进行序列化
  172. if (value.GetType().IsPrimitive)
  173. {
  174. value[i] = item.GetType().GetProperty(dtColumn.ColumnName).GetValue(item);
  175. }
  176. else
  177. {
  178. value[i] = JsonConvert.SerializeObject(item.GetType().GetProperty(dtColumn.ColumnName).GetValue(item));
  179. }
  180. }
  181. dt.Rows.Add(value);
  182. }
  183. return dt;
  184. }
  185. #endregion
  186. }
  187. }