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的路由方案,与原来的方案在使用上差别不 ...
随机推荐
- 微软账号密码修改后提示密码错误的解决方法(远程桌面&smb共享访问等)
众所周知,自从微软将Microsoft账户与Windows账号强制绑定后,使用起来便一直有诸多困难,在Microsoft Support和搜索引擎长期搜索解决方案未果,今天偶然在一个佬的博客翻到了这个 ...
- SQL Server 验证某栏位是否存在某字符串(CHARINDEX)
SELECT * FROM LiuJun_PKqitchqi WHERE CHARINDEX('230527Z3258',qr_code) > 0
- 使用.NET6实现动态API
ApiLite是基于.NET6直接将Service层生成动态api路由,可以不用添加Controller,支持模块插件化,在项目开发中能够提高工作效率,降低代码量. 开发环境 .NET SDK 6.0 ...
- STL 算法 <algorithm>,
STL 算法部分主要由头文件 <algorithm>,<numeric>,<functional > 组成.要使用 STL 中的算法函数必须包含头文件 < a ...
- MySQL 跨服务器关联查询
如果您需要在 MySQL 中关联查询位于不同服务器的表(跨服务器关联查询),您可以考虑使用 MySQL 的联机查询(Federated MySQL).联机查询允许您在一个服务器上访问和查询另一个服务器 ...
- C# 通过反射(Reflection)调用不同名泛型方法
概述 由于工作需要,需要通过数据类型和方法名控制方法走向 用到的数据类型有8种(string,Int16,Int32,Int64,Boolean,Byte,Single,Double) 读取的方法(参 ...
- Python和RPA网页自动化-让非标准下拉框选择指定文本的方法
以下方"节点审批"下拉框为例 该下拉框没有<select>标签,而是<div><ul><li>标签.分别使用Python和RPA网页 ...
- oracle执行报错 ORA-01722: 无效数字
1.背景 执行Oracle存储过程时报错:ORA-01722: 无效数字 2.错误描述 1.对于两个类型不匹配,一个数字类型,一个非数字类型的值进行赋值操作;2.两个类型不匹配的值进行比较操作,比如一 ...
- java Hutool工具类之Excel的操作
1.背景 程序中上传下载excel是家常便饭,因此hutool给我们提供了非充强大的工具类,使用如下...... 2.使用 官方地址:https://hutool.cn/docs/#/poi/Exce ...
- 数据库存储时间数据用timestamp 好还是 varchar好
表示日期数据基本是date型,只有年月的用varchar2或者char,好处见下:1.数据规范.date对合法日期型会校验,包括闰年2月这种.避免字符型变量产生的某月32号,日期长度不对,日期格式不统 ...