前言

以前写过 EPPlus 的笔记, 但后来 EPPlus 开始收费了.... (这好像是 .NET 生态的宿命)

在找替代方案中看中了微软的 Open XML SDK.

但经过一番折腾, 它确实太底层了, 学习资源又少. 于是找到了它的上层版本 ClosedXML

ClosedXML 是社区因为 Open XML 真的太底层了, 而 wrap 的上层. 它满足了绝大部分需求.

虽然它没有一直保持更新, 但已经足够小项目使用了. 非到万不得已还是不要去碰 Open XML SDK 比较好. 年纪大了少折腾自己.

以前写的笔记

Asp.net core 学习笔记 (Excel 读写)

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

参考:

Github

Excel 各种方法 (官网)

Open-Xml SDK使用介绍

使用Open XML SDK进行Excel开发的最小知识集

Cell styles in OpenXML spreadsheet (SpreadsheetML)

.Net Core使用OpenXML导出,导入Excel

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 读写的更多相关文章

  1. JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动

    JavaScript日历控件开发   概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...

  2. Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel

    Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...

  3. asp.net core导入excel

    接昨天的导出 导入excel内容 对比昨天导出的内容增加了一行实体属性名称作为标题行,这样到转换为实体的时候才能找到对应的属性. 导入代码 public IActionResult InportExc ...

  4. Asp.net Core导出Excel

    本篇文章是在MVC设计模式下,基于windows系统的Excel导出 1.前台的实现不用我多说了吧,加一个a标签链接地址跳到它所调用的方法里面,可以根据当前页面的查询条件去传值,从而查询出你想要的数据 ...

  5. 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!

    写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...

  6. 在ASP.NET Core中使用EPPlus导入出Excel文件

    这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件(Excel).在考虑使用.NET处理excel时,我们总是寻找第三方库或组件.使用Open Offic ...

  7. ASP.NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

  8. 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想试试,我 ...

  9. 基于 ASP.NET Core 2.1 的 Razor Class Library 实现自定义错误页面的公用类库

    注意:文中使用的是 razor pages ,建议使用 razor views ,使用 razor pages 有一个小坑,razor pages 会用到 {page} 路由参数,如果应用中也用到了这 ...

  10. 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的路由方案,与原来的方案在使用上差别不 ...

随机推荐

  1. 微软账号密码修改后提示密码错误的解决方法(远程桌面&smb共享访问等)

    众所周知,自从微软将Microsoft账户与Windows账号强制绑定后,使用起来便一直有诸多困难,在Microsoft Support和搜索引擎长期搜索解决方案未果,今天偶然在一个佬的博客翻到了这个 ...

  2. SQL Server 验证某栏位是否存在某字符串(CHARINDEX)

    SELECT * FROM LiuJun_PKqitchqi WHERE CHARINDEX('230527Z3258',qr_code) > 0

  3. 使用.NET6实现动态API

    ApiLite是基于.NET6直接将Service层生成动态api路由,可以不用添加Controller,支持模块插件化,在项目开发中能够提高工作效率,降低代码量. 开发环境 .NET SDK 6.0 ...

  4. STL 算法 <algorithm>,

    STL 算法部分主要由头文件 <algorithm>,<numeric>,<functional > 组成.要使用 STL 中的算法函数必须包含头文件 < a ...

  5. MySQL 跨服务器关联查询

    如果您需要在 MySQL 中关联查询位于不同服务器的表(跨服务器关联查询),您可以考虑使用 MySQL 的联机查询(Federated MySQL).联机查询允许您在一个服务器上访问和查询另一个服务器 ...

  6. C# 通过反射(Reflection)调用不同名泛型方法

    概述 由于工作需要,需要通过数据类型和方法名控制方法走向 用到的数据类型有8种(string,Int16,Int32,Int64,Boolean,Byte,Single,Double) 读取的方法(参 ...

  7. Python和RPA网页自动化-让非标准下拉框选择指定文本的方法

    以下方"节点审批"下拉框为例 该下拉框没有<select>标签,而是<div><ul><li>标签.分别使用Python和RPA网页 ...

  8. oracle执行报错 ORA-01722: 无效数字

    1.背景 执行Oracle存储过程时报错:ORA-01722: 无效数字 2.错误描述 1.对于两个类型不匹配,一个数字类型,一个非数字类型的值进行赋值操作;2.两个类型不匹配的值进行比较操作,比如一 ...

  9. java Hutool工具类之Excel的操作

    1.背景 程序中上传下载excel是家常便饭,因此hutool给我们提供了非充强大的工具类,使用如下...... 2.使用 官方地址:https://hutool.cn/docs/#/poi/Exce ...

  10. 数据库存储时间数据用timestamp 好还是 varchar好

    表示日期数据基本是date型,只有年月的用varchar2或者char,好处见下:1.数据规范.date对合法日期型会校验,包括闰年2月这种.避免字符型变量产生的某月32号,日期长度不对,日期格式不统 ...