今天在工作中碰到同事用了一种新型的方式导入excel,在此做个学习记录。

插件:Aspose.Cells

第一步:准备好导出的模板,例子:

C#代码:

  1. #region 验证数据
  2.  
  3. if (model == null)
  4. {
  5. throw new FriendlyException("无该月结单!");
  6. }
  7. var templatePath = @"Template\trade\Cecsc2bHN\分包分供月度结算审批表.xlsx"; ;
  8. var resFileName = string.Empty;
  9. var bigTitle = string.Empty;
  10. var barCodeStr = string.Empty;
  11.  
  12. if (string.IsNullOrEmpty(templatePath) || !File.Exists(templatePath))
  13. {
  14. throw new FriendlyException("未找到模板文件!");
  15. }
  16.  
  17. #endregion
  18.  
  19. #region 初始化模板文件
  20.  
  21. var wk = new Workbook(templatePath);
  22. var designer = new WorkbookDesigner(wk);
  23.  
  24. #endregion
  25.  
  26. #region 数据重构造
  27.  
  28. // 工程形象进度
  29.  
  30. #endregion
  31.  
  32. #region 构造头部信息
  33. var topInfo = new Dictionary<string, object>
  34. {
  35. { "Title", bigTitle },
  36. { "ProjectName", model.ProjectName },
  37. { "Code", barCodeStr }
  38. };
  39. #endregion
  40.  
  41. MonthSettlementInfo monthInfo = new MonthSettlementInfo()
  42. {
  43. CurrentInContractSettlementAmount = 56.32M,
  44. TerminalInContractSettlementAmount = 123.32M,
  45. CurrentOutContractSettlementAmount = 6.32M,
  46. TerminalOutContractSettlementAmount = 5.32M,
  47. CurrentDeductionSettlementAmount = 12.32M,
  48. TerminalDeductionSettlementAmount = 26.32M,
  49.  
  50. CurrentInContractSafeAmount = 2.32M,
  51. TerminalInContractSafeAmount = 1.32M,
  52. CurrentOutContractSafeAmount = 6.32M,
  53. TerminalOutContractSafeAmount = 8.32M,
  54. CurrentDeductionSafeAmount = 4.32M,
  55. TerminalDeductionSafeAmount = 3.32M,
  56. };
  57.  
  58. //形象进度描述
  59. List<TradeSettleReportProjectProgressItemModel> ProjectProgressList = new List<TradeSettleReportProjectProgressItemModel>();
  60.  
  61. for (int i = 0; i < 3; i++)
  62. {
  63. TradeSettleReportProjectProgressItemModel Progressmodel = new TradeSettleReportProjectProgressItemModel()
  64. {
  65. ConstractArea = "测试水水水水水水" + i,
  66. Remark = "测试模拟的备注" + i,
  67. ProgressDesc = "测试撒子怕发送所属" + i,
  68. ConstractSite = "场地" + i
  69. };
  70. ProjectProgressList.Add(Progressmodel);
  71. }
  72.  
  73. #region 工程名称

  74. //绑定数据到excel中
    //designer.SetDataSource("绑定的到excle的变量名","对应的值")
  75. designer.SetDataSource("ProgressItem", ProjectProgressList); //list可以循环绑定 绑定的例子在下面。
  76. designer.SetDataSource("ProjectName", model.ProjectName);
  77. designer.SetDataSource("ContractName", model.ContractName);
  78. designer.SetDataSource("ContractCode", model.ContractCode);
  79. designer.SetDataSource("MonthSettlementNo", model.MonthSettlementNo);
  80. designer.SetDataSource("ContractingUnit", model.ContractingUnit);
  81. designer.SetDataSource("SettlementCode", model.SettlementCode);
  82. designer.SetDataSource("EnterpriseName", model.EnterpriseName);
  83. designer.SetDataSource("ThirdPartyName", model.ThirdPartyName);
  84. designer.SetDataSource("SettlementMonth", model.SettlementMonth);
  85. designer.SetDataSource("TotalContractAmount", model.TotalContractAmount);
  86. designer.SetDataSource("SettlementAmountCapitalize", model.SettlementAmountCapitalize);
  87. #endregion
  88.  
  89. #endregion
  90.  
  91. #region 尾部
  92.  
  93. #endregion
  94. designer.Process();
  95. wk.CalculateFormula();
  96.  
  97. #region 重新计算行高
  98. var startRow = 9;
  99. var endRow = startRow;
  100.  
  101. #endregion
  102.  
  103. #region 导出文件
  104.  
  105. var fileName = $"{model.SettlementMonth.ToString("yyyyMM")}{resFileName}.xlsx";
  106. using (var file = new MemoryStream())
  107. {
  108. wk.Save(file, SaveFormat.Xlsx);
  109. wk.Dispose();
  110. return new KeyValuePair<string, byte[]>(fileName, file.ToArray());
  111. }
  112. #endregion

此种当时的重点是Excel模板的数据绑定:

第一种:单个值的绑定

第二种:列表值的循环绑定

完整代码

Service层:

  1. public KeyValuePair<string, byte[]> ExportSettle(TradeSettleReportModel model)
  2. {
  3. #region 验证数据
  4.  
  5. if (model == null)
  6. {
  7. throw new FriendlyException("无该月结单!");
  8. }
  9. var templatePath = @"Template\trade\Cecsc2bHN\分包分供月度结算审批表.xlsx"; ;
  10. var resFileName = string.Empty;
  11. var bigTitle = string.Empty;
  12. var barCodeStr = string.Empty;
  13.  
  14. if (string.IsNullOrEmpty(templatePath) || !File.Exists(templatePath))
  15. {
  16. throw new FriendlyException("未找到模板文件!");
  17. }
  18.  
  19. #endregion
  20.  
  21. #region 初始化模板文件
  22.  
  23. var wk = new Workbook(templatePath);
  24. var designer = new WorkbookDesigner(wk);
  25.  
  26. #endregion
  27.  
  28. #region 数据重构造
  29.  
  30. // 工程形象进度
  31.  
  32. #endregion
  33.  
  34. #region 构造头部信息
  35. var topInfo = new Dictionary<string, object>
  36. {
  37. { "Title", bigTitle },
  38. { "ProjectName", model.ProjectName },
  39. { "Code", barCodeStr }
  40. };
  41. #endregion
  42.  
  43. MonthSettlementInfo monthInfo = new MonthSettlementInfo()
  44. {
  45. CurrentInContractSettlementAmount = 56.32M,
  46. TerminalInContractSettlementAmount = 123.32M,
  47. CurrentOutContractSettlementAmount = 6.32M,
  48. TerminalOutContractSettlementAmount = 5.32M,
  49. CurrentDeductionSettlementAmount = 12.32M,
  50. TerminalDeductionSettlementAmount = 26.32M,
  51.  
  52. CurrentInContractSafeAmount = 2.32M,
  53. TerminalInContractSafeAmount = 1.32M,
  54. CurrentOutContractSafeAmount = 6.32M,
  55. TerminalOutContractSafeAmount = 8.32M,
  56. CurrentDeductionSafeAmount = 4.32M,
  57. TerminalDeductionSafeAmount = 3.32M,
  58. };
  59.  
  60. //审批记录
  61. List<TradeSettleReportApprovalCommentsModel> approveModelList = new List<TradeSettleReportApprovalCommentsModel>();
  62.  
  63. for (int i = 0; i < 2; i++)
  64. {
  65.  
  66. TradeSettleReportApprovalCommentsModel approveModel = new TradeSettleReportApprovalCommentsModel()
  67. {
  68. Approver = "admin" + i,
  69. Comments = "审批通过" + i,
  70. NodeName = "测试模板" + i,
  71. Seq = i
  72. };
  73. approveModelList.Add(approveModel);
  74. }
  75.  
  76. //形象进度描述
  77. List<TradeSettleReportProjectProgressItemModel> ProjectProgressList = new List<TradeSettleReportProjectProgressItemModel>();
  78.  
  79. for (int i = 0; i < 3; i++)
  80. {
  81. TradeSettleReportProjectProgressItemModel Progressmodel = new TradeSettleReportProjectProgressItemModel()
  82. {
  83. ConstractArea = "测试水水水水水水" + i,
  84. Remark = "测试模拟的备注" + i,
  85. ProgressDesc = "测试撒子怕发送所属" + i,
  86. ConstractSite = "场地" + i
  87. };
  88. ProjectProgressList.Add(Progressmodel);
  89. }
  90.  
  91. #region 工程名称
  92.  
  93. designer.SetDataSource("CurrentInContractSettlementAmount", monthInfo.CurrentInContractSettlementAmount);
  94. designer.SetDataSource("TerminalInContractSettlementAmount", monthInfo.TerminalInContractSettlementAmount);
  95. designer.SetDataSource("CurrentOutContractSettlementAmount", monthInfo.CurrentOutContractSettlementAmount);
  96. designer.SetDataSource("TerminalOutContractSettlementAmount", monthInfo.TerminalOutContractSettlementAmount);
  97. designer.SetDataSource("CurrentDeductionSettlementAmount", monthInfo.CurrentDeductionSettlementAmount);
  98. designer.SetDataSource("TerminalDeductionSettlementAmount", monthInfo.TerminalDeductionSettlementAmount);
  99. designer.SetDataSource("CurrentInContractSafeAmount", monthInfo.CurrentInContractSafeAmount);
  100. designer.SetDataSource("TerminalInContractSafeAmount", monthInfo.TerminalInContractSafeAmount);
  101. designer.SetDataSource("CurrentOutContractSafeAmount", monthInfo.CurrentOutContractSafeAmount);
  102. designer.SetDataSource("TerminalOutContractSafeAmount", monthInfo.TerminalOutContractSafeAmount);
  103. designer.SetDataSource("CurrentDeductionSafeAmount", monthInfo.CurrentDeductionSafeAmount);
  104. designer.SetDataSource("TerminalDeductionSafeAmount", monthInfo.TerminalDeductionSafeAmount);
  105.  
  106. designer.SetDataSource("DetailItem", approveModelList);
  107. designer.SetDataSource("ProgressItem", ProjectProgressList);
  108. designer.SetDataSource("ProjectName", model.ProjectName);
  109. designer.SetDataSource("ContractName", model.ContractName);
  110. designer.SetDataSource("ContractCode", model.ContractCode);
  111. designer.SetDataSource("MonthSettlementNo", model.MonthSettlementNo);
  112. designer.SetDataSource("ContractingUnit", model.ContractingUnit);
  113. designer.SetDataSource("SettlementCode", model.SettlementCode);
  114. designer.SetDataSource("EnterpriseName", model.EnterpriseName);
  115. designer.SetDataSource("ThirdPartyName", model.ThirdPartyName);
  116. designer.SetDataSource("SettlementMonth", model.SettlementMonth);
  117. designer.SetDataSource("TotalContractAmount", model.TotalContractAmount);
  118. designer.SetDataSource("SettlementAmountCapitalize", model.SettlementAmountCapitalize);
  119. #endregion
  120.  
  121. #region 预算编号
  122. //var _dic = this.GetLaborProSettleInfo(exportDataSource);
  123. //foreach (var item in _dic)
  124. //{
  125. // designer.SetDataSource(item.Key, item.Value);
  126. //}
  127.  
  128. #endregion
  129.  
  130. #region 写入数据
  131. //foreach (var keyValuePair in topInfo)
  132. //{
  133. // designer.SetDataSource(keyValuePair.Key, keyValuePair.Value);
  134. //}
  135. //designer.SetDataSource("ProjectProgress", exportDataSource.ProjectProgressItems);
  136. //designer.SetDataSource("MonthEstimate", exportDataSource.MonthEstimateOutputs);
  137. #region 表1
  138. //
  139. Dictionary<string, decimal> dic = new Dictionary<string, decimal>();
  140.  
  141. if (dic != null)
  142. {
  143. foreach (var item in dic)
  144. {
  145. designer.SetDataSource(item.Key, item.Value);
  146. }
  147. }
  148.  
  149. #endregion
  150.  
  151. #endregion
  152.  
  153. #region 尾部
  154.  
  155. #endregion
  156. #region 删除模板sheet
  157. //wk.Worksheets.RemoveAt(wk.Worksheets["表2"].Index);
  158. //wk.Worksheets.RemoveAt(wk.Worksheets["表3"].Index);
  159. designer.Process();
  160. wk.CalculateFormula();
  161. #endregion
  162.  
  163. #region 插入条形码
  164.  
  165. //var barCode = BarCodeGenerator.GetBarCodePNG(barCodeStr);
  166. //var barCode = BarCodeGenerator.WriteQRCodeImg(barCodeStr);
  167. //wk.Worksheets[0].Pictures.Add(0, 0, 1, 1, new MemoryStream(barCode));
  168. //wk.Worksheets[0].Pictures[0].Width = 60;
  169. //wk.Worksheets[0].Pictures[0].Width = 60;
  170. #endregion
  171.  
  172. #region 重新计算行高
  173. var startRow = 9;
  174. var endRow = startRow;
  175.  
  176. #endregion
  177.  
  178. #region 导出文件
  179.  
  180. var fileName = $"{model.SettlementMonth.ToString("yyyyMM")}{resFileName}.xlsx";
  181. using (var file = new MemoryStream())
  182. {
  183. wk.Save(file, SaveFormat.Xlsx);
  184. wk.Dispose();
  185. return new KeyValuePair<string, byte[]>(fileName, file.ToArray());
  186. }
  187. #endregion
  188. }

Interface层:

  1. KeyValuePair<string, byte[]> ExportSettle(TradeSettleReportModel model);

Controller层:

  1. [AllowAnonymous]
  2. [HttpPost("Export")]
  3. public async Task<IActionResult> Export()
  4. {
  5. TradeSettleReportModel model = new TradeSettleReportModel()
  6. {
  7. ProjectName = "测刷",
  8. ContractName = "测试合同名称",
  9. ContractCode = "0010101012E",
  10. MonthSettlementNo = "0010101012E",
  11. ContractingUnit = "重庆市",
  12. SettlementCode = "EW2Z4523",
  13. EnterpriseName = "WZQ我在钱钱钱",
  14. ThirdPartyName = "第三方地中四年",
  15. SettlementMonth = DateTime.Now,
  16. SettlementAmountCapitalize = "壹拾贰万叁仟壹佰贰拾叁元贰角伍分",
  17.  
  18. };
  19. var result = await Task.Run(() => tradeSettleCommonService.ExportSettle(model));
  20. return File(result.Value, "application/octet-stream", result.Key);
  21. }

C# 使用Aspose.Cells 导出Excel的更多相关文章

  1. Aspose.Cells导出Excel(1)

    利用Aspose.Cells导出excel 注意的问题 1.DataTable的处理 2.进行编码,便于中文名文件下载 3.别忘了Aspose.Cells.dll(可以自己在网上搜索) public ...

  2. C#使用Aspose.Cells导出Excel简单实现

    首先,需要添加引用Aspose.Cells.dll,官网下载地址:http://downloads.aspose.com/cells/net 将DataTable导出Xlsx格式的文件下载(网页输出) ...

  3. Aspose.Cells导出Excel(2)

    DataTable dtTitle = ds.Tables[]; DataTable dtDetail = ds.Tables[]; int columns = dtTitle.Columns.Cou ...

  4. C#+Aspose.Cells 导出Excel及设置样式 (Webform/Winform)

    在项目中用到,特此记录下来,Aspose.Cells 不依赖机器装没有装EXCEL都可以导出,很方便.具体可以参考其他 http://www.aspose.com/docs/display/cells ...

  5. aspose.Cells 导出Excel

    aspose aspse.Cells可以操作Excel,且不依赖于系统环境. 使用模板,通过绑定输出数据源 这种适合于对格式没有特别要求的,直接绑定数据源即可.和数据绑定控件差不多. Workbook ...

  6. Aspose.Cells 导出 excel

    Aspose.Cells.Workbook book = new Aspose.Cells.Workbook(); Aspose.Cells.Worksheet sheet = book.Worksh ...

  7. 使用Aspose.Cells读取Excel

      最新更新请访问: http://denghejun.github.io Aspose.Cells读取Excel非常方便,以下是一个简单的实现读取和导出Excel的操作类: 以下是Aspose.Ce ...

  8. 报表中的Excel操作之Aspose.Cells(Excel模板)

    原文:报表中的Excel操作之Aspose.Cells(Excel模板) 本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导 ...

  9. 怎么使用Aspose.Cells读取excel 转化为Datatable

    说明:vs2012 asp.net mvc4 c# 使用Aspose.Cells 读取Excel 转化为Datatable 1.HTML前端代码 <%@ Page Language=" ...

随机推荐

  1. DirectByteBuffer实现原理分析

    1.创建DirectByteBuffer Direct ByteBuffer是通过JNI在Java虚拟机外的内存中分配了一块(所以即使在运行时通过-Xmx指定了Java虚拟机的最大堆内存,还是可能实例 ...

  2. 【LeetCode】1042. Flower Planting With No Adjacent 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 图 日期 题目地址:https://leetcode ...

  3. 【LeetCode】945. Minimum Increment to Make Array Unique 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解,TLE 一次遍历 日期 题目地址:http ...

  4. 【LeetCode】667. Beautiful Arrangement II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. Monkey工具之fastbot-iOS实践

    Monkey工具之fastbot-iOS实践 背景 目前移动端App上线后 crash 率比较高, 尤其在iOS端.我们需要一款Monkey工具测试App的稳定性,更早的发现crash问题并修复. 去 ...

  6. C# 编写 Windows 动态桌面软件实现(一)之桌面交互功能

    DreamScene2 1.3 版本已经发布了,现在支持鼠标和桌面交互功能.这个功能不会影响性能,基本不占用 CPU.这个功能让我对 Windows 消息机制有了更深入的理解,在这篇博客中我会详细介绍 ...

  7. 第七个知识点:随机性如何辅助计算和什么是BPP类问题

    第七个知识点:随机性如何辅助计算和什么是BPP类问题 原文地址:http://bristolcrypto.blogspot.com/2014/11/52-things-number-7-how-doe ...

  8. Understanding Black-box Predictions via Influence Functions

    目录 概 主要内容 样本重要性分析 样本摄动对损失的影响 高效计算 共轭梯度 随机估计 一些应用 附录 (1)的证明 Koh P W, Liang P. Understanding black-box ...

  9. vue为什么要设计成异步队列渲染

    异步队列渲染 上一篇文章是在vue2.0 中通过Object.defineProperty去拦截并监听数据变化的响应式原理,这篇文章将会沿着图谱继续深入探索,在依赖被通知变化了之后,会触发vue当中的 ...

  10. JavaWeb项目作业 Market商品管理系统

    目录 一.语言和环境 二.实现功能 三.数据库设计 四.实现代码 一.语言和环境 实现语言:Java语言. 环境要求:MyEclipse(Eclipse)+MySQL. 实现方式:JBDC.jsp/s ...