ASP.NET Core Library – Excel 读写
前言
以前写过 EPPlus 的笔记, 但后来 EPPlus 开始收费了.... (这好像是 .NET 生态的宿命)
在找替代方案中看中了微软的 Open XML SDK.
但经过一番折腾, 它确实太底层了, 学习资源又少. 于是找到了它的上层版本 ClosedXML
ClosedXML 是社区因为 Open XML 真的太底层了, 而 wrap 的上层. 它满足了绝大部分需求.
虽然它没有一直保持更新, 但已经足够小项目使用了. 非到万不得已还是不要去碰 Open XML SDK 比较好. 年纪大了少折腾自己.
以前写的笔记
ClosedXML
参考: Documentation
它的结构很简单 Book > Sheets > Sheet > Row/Column > Cell
创建 Book
- var book = new XLWorkbook();
打开 Book
- using var book = new XLWorkbook(@"Excel\Excel.xlsx");
创建 Sheet
- var sheet = book.Worksheets.Add("Sheet1");
获取 Cell
- var cell1 = sheet.Row(1).Cell(1);
- var cell2 = sheet.Cell("A1");
Row(1) 是拿第一行, 没有第 0 行的哦. start from 1, column 也是一样
定义值和类型
- cell.DataType = XLDataType.Text;
- cell.Value = "value";
类型有 5 种
Set custom format
我的做法通常是去 excel set 然后查看 custom, 复制过来, 比如下面这个是 Accounting 的
- cell.Style.NumberFormat.Format = "_ [$USD] * #,##0.00_ ;_ [$USD] * -#,##0.00_ ;_ [$USD] * \"-\"??_ ;_ @_ ";
Set hyperlink
- cell.Hyperlink = new XLHyperlink(@"https://www.stooges.com.my");
Set alignment
- cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
- cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Top;
Set Color
- cell.Style.Font.FontColor = XLColor.Blue;
- cell.Style.Fill.BackgroundColor = XLColor.FromHtml("#FF0000");
Set wrap text
- cell.Style.Alignment.SetWrapText(true);
Set date format
- cell.Style.DateFormat.Format = "dd-MM-yyyy";
- cell.Style.DateFormat.Format = "dd-MM-yyyy hh:mm:ss AM/PM";
Set column width
- sheet.Column(1).Width = 10;
10 的单位是字数 (number of characters)
Set column width / row height base on content
- sheet.Column(1).AdjustToContents(10d, 20d);
- sheet.Row(2).AdjustToContents(0d, 20d);
参数是 min, max (是 double 哦)
保存
- book.SaveAs(@"Excel\Excel.xlsx");
- book.Save();
通常新建配 SaveAs, 修改配 Save
读取 Excel
- var book = new XLWorkbook(@"Excel\excel.xlsx");
- if (book.TryGetWorksheet("Sheet1", out var worksheet))
- {
- var rows = worksheet.RowsUsed();
- var headerRow = rows.First();
- var dataRows = rows.Take(1..);
- foreach (var row in dataRows)
- {
- var cells = row.Cells();
- foreach (var cell in cells)
- {
- var value = cell.Value;
- var address = cell.Address.ToString(); // A2
- }
- }
- }
一开始折腾后来放弃的 Open XML SDK
参考:
Cell styles in OpenXML spreadsheet (SpreadsheetML)
Open XML 的结构非常绕. 很多层. 我对 Excel 的理解就是 file > sheets > sheet = table, row, column, cell
但是 Open XML 的结构是
Document 是 file
Part 是 container
SheetData 就 table
其余的我不清楚...为什么要搞这么多东东出来
Create Excel File
add nuget package
- dotnet add package DocumentFormat.OpenXml
ExcelController.cs
- [HttpPost("CreateExcel")]
- public ActionResult CreateExcel([FromBody] CreateExcelDto dto)
- {
- // create doc
- using var doc = SpreadsheetDocument.Create(@"Excel\Excel.xlsx", SpreadsheetDocumentType.Workbook);
- // create workbook part
- var workbookpart = doc.AddWorkbookPart();
- // create workbook
- workbookpart.Workbook = new Workbook();
- // create worksheet part
- var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
- // create sheet data
- var sheetData = new SheetData();
- // create header
- var headerRow = new Row();
- var headerCell = new Cell
- {
- DataType = new EnumValue<CellValues>(CellValues.String),
- CellValue = new CellValue("FirstName")
- };
- headerRow.Append(headerCell);
- sheetData.Append(headerRow);
- // create row
- var firstRow = new Row();
- var firstRowCell = new Cell
- {
- DataType = new EnumValue<CellValues>(CellValues.String),
- CellValue = new CellValue("Derrick Yam")
- };
- firstRow.Append(firstRowCell);
- sheetData.Append(firstRow);
- // create worksheet
- worksheetPart.Worksheet = new Worksheet(sheetData);
- // create sheets
- var sheets = workbookpart.Workbook.AppendChild<Sheets>(new Sheets());
- // create sheet
- var sheet = new Sheet()
- {
- Id = workbookpart.GetIdOfPart(worksheetPart), // connect sheet to worksheet part
- SheetId = 1,
- Name = "Sheet1"
- };
- sheets.Append(sheet);
- workbookpart.Workbook.Save();
- return Ok();
- }
需要注意的是它的结构很多层, 不要搞错. 顺序做就对了.
ASP.NET Core Library – Excel 读写的更多相关文章
- JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动
JavaScript日历控件开发 概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...
- Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel
Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...
- asp.net core导入excel
接昨天的导出 导入excel内容 对比昨天导出的内容增加了一行实体属性名称作为标题行,这样到转换为实体的时候才能找到对应的属性. 导入代码 public IActionResult InportExc ...
- Asp.net Core导出Excel
本篇文章是在MVC设计模式下,基于windows系统的Excel导出 1.前台的实现不用我多说了吧,加一个a标签链接地址跳到它所调用的方法里面,可以根据当前页面的查询条件去传值,从而查询出你想要的数据 ...
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- 在ASP.NET Core中使用EPPlus导入出Excel文件
这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件(Excel).在考虑使用.NET处理excel时,我们总是寻找第三方库或组件.使用Open Offic ...
- ASP.NET Core 导入导出Excel xlsx 文件
ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...
- ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package
目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...
- 基于 ASP.NET Core 2.1 的 Razor Class Library 实现自定义错误页面的公用类库
注意:文中使用的是 razor pages ,建议使用 razor views ,使用 razor pages 有一个小坑,razor pages 会用到 {page} 路由参数,如果应用中也用到了这 ...
- ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据
ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...
随机推荐
- log4cpp的安装及使用
目录 前言 安装 使用 示例代码 配置文件 编译链接 输出 前言 本文的操作均在ubuntu20.04下进行 安装 本文仅介绍从源码编译安装log4cpp的过程. ①在开始编译前,首先要确保系统中安装 ...
- Vue3中如何使用this
vue3提供了getCurrentInstance ,通过这个属性,直接使用ctx是错误的,需要找到全局属性globalProperties import { getCurrentInstance } ...
- 双指针 & 双向搜索
双指针 根据人类直觉这个东西需要满足单调性,所以预处理的时候大概率需要排序. 好像常与二分结合使用? 可以用在序列.链表(存储位置)或者树.图上(存储结点). 或者用于其他算法(eg:单调队列.差分) ...
- odoo 通过Javascript显示或隐藏form自带按钮
实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下,根据条件对form视图自带按钮的显示.隐藏进行控制 代码实现 隐藏.显示编辑和创建按钮为例 od ...
- Kubernetes 部署Dashboard UI
实践环境 CentOS-7-x86_64-DVD-1810 Docker 19.03.9 Kubernetes version: v1.20.5 发布Dashboard 可以通过运行以下命令部署Das ...
- Cython与C函数的结合
技术背景 在前面一篇博客中,我们介绍了使用Cython加速谐振势计算的方法.有了Cython对于计算过程更加灵活的配置(本质上是时间占用和空间占用的一种均衡),及其接近于C的性能,并且还最大程度上的保 ...
- Ubuntu16.04设置静态IP或动态ip(DHCP)
Ubuntu16.04设置静态IP或动态ip(DHCP) 设置静态IP 1,vim编辑/etc/network/interfaces 网络配置文件 sudo vim /etc/network/inte ...
- AI辅助教学,甚至AI教学,逐渐成为可能
看新闻,有感: 太火爆!一门课,两个月吸粉十五万人!企业纷纷布局!千亿级大市场,来了?
- 国内的开源AI模型共享网站(AI模型的GitHub)—— mindscope —— 使用git lfs方式下载模型文件
参考前文: 国内的开源AI模型共享网站(AI模型的GitHub)-- mindscope -- 对标外网的"huggingface",mindscope好用吗? 使用git lfs ...
- ubuntu编译软件报错:fatal error: libnet.h: No such file or directory
参考: https://blog.csdn.net/wuyou1995/article/details/104742326/ ------------------------------------- ...