AsposeHelper.cs 12 KB

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