前言

以前写过 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. [oeasy]python017_万行代码之梦_vim环境_复制粘贴

    继续运行 回忆上次内容 上次 保存运行一条龙 :w|!python3 %   我想 再多输出 几行 增加一下 代码量 可以吗?       添加图片注释,不超过 140 字(可选) 代码量 在正常模式 ...

  2. 阅读翻译Mathematics for Machine Learning之2.5 Linear Independence

    阅读翻译Mathematics for Machine Learning之2.5 Linear Independence 关于: 首次发表日期:2024-07-18 Mathematics for M ...

  3. FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"第11章  FFmpeg的桌面开发"介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Win ...

  4. Vue 在父(子)组件引用其子(父)组件方法和属性

    Vue 在父(子)组件引用其子(父)组件方法和属性   by:授客 QQ:1033553122   开发环境   Win 10 element-ui  "2.8.2" Vue 2. ...

  5. 关于Pure中使用RnadomInteger问题的BUG

    每一次连线都会造成返回值不一样相当于重新调用了一次,所以返回值需要新建变量存储来使用而不是直接用它拉两次线 下面是错误写法: 正确写法:

  6. 使用 useRequestEvent Hook 访问请求事件

    title: 使用 useRequestEvent Hook 访问请求事件 date: 2024/7/23 updated: 2024/7/23 author: cmdragon excerpt: 摘 ...

  7. 机器学习:详解是否要使用端到端的深度学习?(Whether to use end-to-end learning?)

    详解是否要使用端到端的深度学习? 假设正在搭建一个机器学习系统,要决定是否使用端对端方法,来看看端到端深度学习的一些优缺点,这样就可以根据一些准则,判断的应用程序是否有希望使用端到端方法. 这里是应用 ...

  8. python性能分析器:cProfile

    代码: (1) import cProfile import re cProfile.run('re.compile("foo|bar")') 运行结果: (2) import c ...

  9. 【托普斯的力场】—— ARPG游戏《艾尔登法环》中的人物:托普斯

    地址: https://youtube.com/shorts/oSIbOQ_r4fA?si=F-knFwjZ3iPXqPeS https://www.bilibili.com/video/BV1fV4 ...

  10. 国产AI训练卡,对标美国NVIDIA公司的A100,华为昇腾Atlas 300T A2(Ascend 910B4)高性能GPU/NPU/AI推理/国产计算/信创训练卡 —— 电商平台已开售

    China has successfully achieved the localization of AI chips, breaking through the technological res ...