C# 使用Aspose.Cells 导出Excel
今天在工作中碰到同事用了一种新型的方式导入excel,在此做个学习记录。
插件:Aspose.Cells
第一步:准备好导出的模板,例子:
C#代码:
- #region 验证数据
- if (model == null)
- {
- throw new FriendlyException("无该月结单!");
- }
- var templatePath = @"Template\trade\Cecsc2bHN\分包分供月度结算审批表.xlsx"; ;
- var resFileName = string.Empty;
- var bigTitle = string.Empty;
- var barCodeStr = string.Empty;
- if (string.IsNullOrEmpty(templatePath) || !File.Exists(templatePath))
- {
- throw new FriendlyException("未找到模板文件!");
- }
- #endregion
- #region 初始化模板文件
- var wk = new Workbook(templatePath);
- var designer = new WorkbookDesigner(wk);
- #endregion
- #region 数据重构造
- // 工程形象进度
- #endregion
- #region 构造头部信息
- var topInfo = new Dictionary<string, object>
- {
- { "Title", bigTitle },
- { "ProjectName", model.ProjectName },
- { "Code", barCodeStr }
- };
- #endregion
- MonthSettlementInfo monthInfo = new MonthSettlementInfo()
- {
- CurrentInContractSettlementAmount = 56.32M,
- TerminalInContractSettlementAmount = 123.32M,
- CurrentOutContractSettlementAmount = 6.32M,
- TerminalOutContractSettlementAmount = 5.32M,
- CurrentDeductionSettlementAmount = 12.32M,
- TerminalDeductionSettlementAmount = 26.32M,
- CurrentInContractSafeAmount = 2.32M,
- TerminalInContractSafeAmount = 1.32M,
- CurrentOutContractSafeAmount = 6.32M,
- TerminalOutContractSafeAmount = 8.32M,
- CurrentDeductionSafeAmount = 4.32M,
- TerminalDeductionSafeAmount = 3.32M,
- };
- //形象进度描述
- List<TradeSettleReportProjectProgressItemModel> ProjectProgressList = new List<TradeSettleReportProjectProgressItemModel>();
- for (int i = 0; i < 3; i++)
- {
- TradeSettleReportProjectProgressItemModel Progressmodel = new TradeSettleReportProjectProgressItemModel()
- {
- ConstractArea = "测试水水水水水水" + i,
- Remark = "测试模拟的备注" + i,
- ProgressDesc = "测试撒子怕发送所属" + i,
- ConstractSite = "场地" + i
- };
- ProjectProgressList.Add(Progressmodel);
- }
- #region 工程名称
//绑定数据到excel中
//designer.SetDataSource("绑定的到excle的变量名","对应的值")- designer.SetDataSource("ProgressItem", ProjectProgressList); //list可以循环绑定 绑定的例子在下面。
- designer.SetDataSource("ProjectName", model.ProjectName);
- designer.SetDataSource("ContractName", model.ContractName);
- designer.SetDataSource("ContractCode", model.ContractCode);
- designer.SetDataSource("MonthSettlementNo", model.MonthSettlementNo);
- designer.SetDataSource("ContractingUnit", model.ContractingUnit);
- designer.SetDataSource("SettlementCode", model.SettlementCode);
- designer.SetDataSource("EnterpriseName", model.EnterpriseName);
- designer.SetDataSource("ThirdPartyName", model.ThirdPartyName);
- designer.SetDataSource("SettlementMonth", model.SettlementMonth);
- designer.SetDataSource("TotalContractAmount", model.TotalContractAmount);
- designer.SetDataSource("SettlementAmountCapitalize", model.SettlementAmountCapitalize);
- #endregion
- #endregion
- #region 尾部
- #endregion
- designer.Process();
- wk.CalculateFormula();
- #region 重新计算行高
- var startRow = 9;
- var endRow = startRow;
- #endregion
- #region 导出文件
- var fileName = $"{model.SettlementMonth.ToString("yyyy年MM月")}{resFileName}.xlsx";
- using (var file = new MemoryStream())
- {
- wk.Save(file, SaveFormat.Xlsx);
- wk.Dispose();
- return new KeyValuePair<string, byte[]>(fileName, file.ToArray());
- }
- #endregion
此种当时的重点是Excel模板的数据绑定:
第一种:单个值的绑定
第二种:列表值的循环绑定
完整代码
Service层:


- public KeyValuePair<string, byte[]> ExportSettle(TradeSettleReportModel model)
- {
- #region 验证数据
- if (model == null)
- {
- throw new FriendlyException("无该月结单!");
- }
- var templatePath = @"Template\trade\Cecsc2bHN\分包分供月度结算审批表.xlsx"; ;
- var resFileName = string.Empty;
- var bigTitle = string.Empty;
- var barCodeStr = string.Empty;
- if (string.IsNullOrEmpty(templatePath) || !File.Exists(templatePath))
- {
- throw new FriendlyException("未找到模板文件!");
- }
- #endregion
- #region 初始化模板文件
- var wk = new Workbook(templatePath);
- var designer = new WorkbookDesigner(wk);
- #endregion
- #region 数据重构造
- // 工程形象进度
- #endregion
- #region 构造头部信息
- var topInfo = new Dictionary<string, object>
- {
- { "Title", bigTitle },
- { "ProjectName", model.ProjectName },
- { "Code", barCodeStr }
- };
- #endregion
- MonthSettlementInfo monthInfo = new MonthSettlementInfo()
- {
- CurrentInContractSettlementAmount = 56.32M,
- TerminalInContractSettlementAmount = 123.32M,
- CurrentOutContractSettlementAmount = 6.32M,
- TerminalOutContractSettlementAmount = 5.32M,
- CurrentDeductionSettlementAmount = 12.32M,
- TerminalDeductionSettlementAmount = 26.32M,
- CurrentInContractSafeAmount = 2.32M,
- TerminalInContractSafeAmount = 1.32M,
- CurrentOutContractSafeAmount = 6.32M,
- TerminalOutContractSafeAmount = 8.32M,
- CurrentDeductionSafeAmount = 4.32M,
- TerminalDeductionSafeAmount = 3.32M,
- };
- //审批记录
- List<TradeSettleReportApprovalCommentsModel> approveModelList = new List<TradeSettleReportApprovalCommentsModel>();
- for (int i = 0; i < 2; i++)
- {
- TradeSettleReportApprovalCommentsModel approveModel = new TradeSettleReportApprovalCommentsModel()
- {
- Approver = "admin" + i,
- Comments = "审批通过" + i,
- NodeName = "测试模板" + i,
- Seq = i
- };
- approveModelList.Add(approveModel);
- }
- //形象进度描述
- List<TradeSettleReportProjectProgressItemModel> ProjectProgressList = new List<TradeSettleReportProjectProgressItemModel>();
- for (int i = 0; i < 3; i++)
- {
- TradeSettleReportProjectProgressItemModel Progressmodel = new TradeSettleReportProjectProgressItemModel()
- {
- ConstractArea = "测试水水水水水水" + i,
- Remark = "测试模拟的备注" + i,
- ProgressDesc = "测试撒子怕发送所属" + i,
- ConstractSite = "场地" + i
- };
- ProjectProgressList.Add(Progressmodel);
- }
- #region 工程名称
- designer.SetDataSource("CurrentInContractSettlementAmount", monthInfo.CurrentInContractSettlementAmount);
- designer.SetDataSource("TerminalInContractSettlementAmount", monthInfo.TerminalInContractSettlementAmount);
- designer.SetDataSource("CurrentOutContractSettlementAmount", monthInfo.CurrentOutContractSettlementAmount);
- designer.SetDataSource("TerminalOutContractSettlementAmount", monthInfo.TerminalOutContractSettlementAmount);
- designer.SetDataSource("CurrentDeductionSettlementAmount", monthInfo.CurrentDeductionSettlementAmount);
- designer.SetDataSource("TerminalDeductionSettlementAmount", monthInfo.TerminalDeductionSettlementAmount);
- designer.SetDataSource("CurrentInContractSafeAmount", monthInfo.CurrentInContractSafeAmount);
- designer.SetDataSource("TerminalInContractSafeAmount", monthInfo.TerminalInContractSafeAmount);
- designer.SetDataSource("CurrentOutContractSafeAmount", monthInfo.CurrentOutContractSafeAmount);
- designer.SetDataSource("TerminalOutContractSafeAmount", monthInfo.TerminalOutContractSafeAmount);
- designer.SetDataSource("CurrentDeductionSafeAmount", monthInfo.CurrentDeductionSafeAmount);
- designer.SetDataSource("TerminalDeductionSafeAmount", monthInfo.TerminalDeductionSafeAmount);
- designer.SetDataSource("DetailItem", approveModelList);
- designer.SetDataSource("ProgressItem", ProjectProgressList);
- designer.SetDataSource("ProjectName", model.ProjectName);
- designer.SetDataSource("ContractName", model.ContractName);
- designer.SetDataSource("ContractCode", model.ContractCode);
- designer.SetDataSource("MonthSettlementNo", model.MonthSettlementNo);
- designer.SetDataSource("ContractingUnit", model.ContractingUnit);
- designer.SetDataSource("SettlementCode", model.SettlementCode);
- designer.SetDataSource("EnterpriseName", model.EnterpriseName);
- designer.SetDataSource("ThirdPartyName", model.ThirdPartyName);
- designer.SetDataSource("SettlementMonth", model.SettlementMonth);
- designer.SetDataSource("TotalContractAmount", model.TotalContractAmount);
- designer.SetDataSource("SettlementAmountCapitalize", model.SettlementAmountCapitalize);
- #endregion
- #region 预算编号
- //var _dic = this.GetLaborProSettleInfo(exportDataSource);
- //foreach (var item in _dic)
- //{
- // designer.SetDataSource(item.Key, item.Value);
- //}
- #endregion
- #region 写入数据
- //foreach (var keyValuePair in topInfo)
- //{
- // designer.SetDataSource(keyValuePair.Key, keyValuePair.Value);
- //}
- //designer.SetDataSource("ProjectProgress", exportDataSource.ProjectProgressItems);
- //designer.SetDataSource("MonthEstimate", exportDataSource.MonthEstimateOutputs);
- #region 表1
- //
- Dictionary<string, decimal> dic = new Dictionary<string, decimal>();
- if (dic != null)
- {
- foreach (var item in dic)
- {
- designer.SetDataSource(item.Key, item.Value);
- }
- }
- #endregion
- #endregion
- #region 尾部
- #endregion
- #region 删除模板sheet
- //wk.Worksheets.RemoveAt(wk.Worksheets["表2"].Index);
- //wk.Worksheets.RemoveAt(wk.Worksheets["表3"].Index);
- designer.Process();
- wk.CalculateFormula();
- #endregion
- #region 插入条形码
- //var barCode = BarCodeGenerator.GetBarCodePNG(barCodeStr);
- //var barCode = BarCodeGenerator.WriteQRCodeImg(barCodeStr);
- //wk.Worksheets[0].Pictures.Add(0, 0, 1, 1, new MemoryStream(barCode));
- //wk.Worksheets[0].Pictures[0].Width = 60;
- //wk.Worksheets[0].Pictures[0].Width = 60;
- #endregion
- #region 重新计算行高
- var startRow = 9;
- var endRow = startRow;
- #endregion
- #region 导出文件
- var fileName = $"{model.SettlementMonth.ToString("yyyy年MM月")}{resFileName}.xlsx";
- using (var file = new MemoryStream())
- {
- wk.Save(file, SaveFormat.Xlsx);
- wk.Dispose();
- return new KeyValuePair<string, byte[]>(fileName, file.ToArray());
- }
- #endregion
- }
Interface层:
- KeyValuePair<string, byte[]> ExportSettle(TradeSettleReportModel model);
Controller层:


- [AllowAnonymous]
- [HttpPost("Export")]
- public async Task<IActionResult> Export()
- {
- TradeSettleReportModel model = new TradeSettleReportModel()
- {
- ProjectName = "测刷",
- ContractName = "测试合同名称",
- ContractCode = "0010101012E",
- MonthSettlementNo = "0010101012E",
- ContractingUnit = "重庆市",
- SettlementCode = "EW2Z4523",
- EnterpriseName = "WZQ我在钱钱钱",
- ThirdPartyName = "第三方地中四年",
- SettlementMonth = DateTime.Now,
- SettlementAmountCapitalize = "壹拾贰万叁仟壹佰贰拾叁元贰角伍分",
- };
- var result = await Task.Run(() => tradeSettleCommonService.ExportSettle(model));
- return File(result.Value, "application/octet-stream", result.Key);
- }
C# 使用Aspose.Cells 导出Excel的更多相关文章
- Aspose.Cells导出Excel(1)
利用Aspose.Cells导出excel 注意的问题 1.DataTable的处理 2.进行编码,便于中文名文件下载 3.别忘了Aspose.Cells.dll(可以自己在网上搜索) public ...
- C#使用Aspose.Cells导出Excel简单实现
首先,需要添加引用Aspose.Cells.dll,官网下载地址:http://downloads.aspose.com/cells/net 将DataTable导出Xlsx格式的文件下载(网页输出) ...
- Aspose.Cells导出Excel(2)
DataTable dtTitle = ds.Tables[]; DataTable dtDetail = ds.Tables[]; int columns = dtTitle.Columns.Cou ...
- C#+Aspose.Cells 导出Excel及设置样式 (Webform/Winform)
在项目中用到,特此记录下来,Aspose.Cells 不依赖机器装没有装EXCEL都可以导出,很方便.具体可以参考其他 http://www.aspose.com/docs/display/cells ...
- aspose.Cells 导出Excel
aspose aspse.Cells可以操作Excel,且不依赖于系统环境. 使用模板,通过绑定输出数据源 这种适合于对格式没有特别要求的,直接绑定数据源即可.和数据绑定控件差不多. Workbook ...
- Aspose.Cells 导出 excel
Aspose.Cells.Workbook book = new Aspose.Cells.Workbook(); Aspose.Cells.Worksheet sheet = book.Worksh ...
- 使用Aspose.Cells读取Excel
最新更新请访问: http://denghejun.github.io Aspose.Cells读取Excel非常方便,以下是一个简单的实现读取和导出Excel的操作类: 以下是Aspose.Ce ...
- 报表中的Excel操作之Aspose.Cells(Excel模板)
原文:报表中的Excel操作之Aspose.Cells(Excel模板) 本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导 ...
- 怎么使用Aspose.Cells读取excel 转化为Datatable
说明:vs2012 asp.net mvc4 c# 使用Aspose.Cells 读取Excel 转化为Datatable 1.HTML前端代码 <%@ Page Language=" ...
随机推荐
- DirectByteBuffer实现原理分析
1.创建DirectByteBuffer Direct ByteBuffer是通过JNI在Java虚拟机外的内存中分配了一块(所以即使在运行时通过-Xmx指定了Java虚拟机的最大堆内存,还是可能实例 ...
- 【LeetCode】1042. Flower Planting With No Adjacent 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 图 日期 题目地址:https://leetcode ...
- 【LeetCode】945. Minimum Increment to Make Array Unique 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解,TLE 一次遍历 日期 题目地址:http ...
- 【LeetCode】667. Beautiful Arrangement II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- Monkey工具之fastbot-iOS实践
Monkey工具之fastbot-iOS实践 背景 目前移动端App上线后 crash 率比较高, 尤其在iOS端.我们需要一款Monkey工具测试App的稳定性,更早的发现crash问题并修复. 去 ...
- C# 编写 Windows 动态桌面软件实现(一)之桌面交互功能
DreamScene2 1.3 版本已经发布了,现在支持鼠标和桌面交互功能.这个功能不会影响性能,基本不占用 CPU.这个功能让我对 Windows 消息机制有了更深入的理解,在这篇博客中我会详细介绍 ...
- 第七个知识点:随机性如何辅助计算和什么是BPP类问题
第七个知识点:随机性如何辅助计算和什么是BPP类问题 原文地址:http://bristolcrypto.blogspot.com/2014/11/52-things-number-7-how-doe ...
- Understanding Black-box Predictions via Influence Functions
目录 概 主要内容 样本重要性分析 样本摄动对损失的影响 高效计算 共轭梯度 随机估计 一些应用 附录 (1)的证明 Koh P W, Liang P. Understanding black-box ...
- vue为什么要设计成异步队列渲染
异步队列渲染 上一篇文章是在vue2.0 中通过Object.defineProperty去拦截并监听数据变化的响应式原理,这篇文章将会沿着图谱继续深入探索,在依赖被通知变化了之后,会触发vue当中的 ...
- JavaWeb项目作业 Market商品管理系统
目录 一.语言和环境 二.实现功能 三.数据库设计 四.实现代码 一.语言和环境 实现语言:Java语言. 环境要求:MyEclipse(Eclipse)+MySQL. 实现方式:JBDC.jsp/s ...