前言

以前写过 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. SparkSQL on K8s 在网易传媒的落地实践

    作者:鲁成祥 易顺 随着云原生技术的发展和成熟,大数据基础设施积极拥抱云原生是业内发展的一大趋势.网易传媒在 2021 年成功将 SparkSQL 部署到了 K8s 集群,并实现与部分在线业务的混合部 ...

  2. K8S 中的 CRI、OCI、CRI shim、containerd

    哈喽大家好,我是咸鱼. 好久没发文了,最近这段时间都在学 K8S.不知道大家是不是和咸鱼一样,刚开始学 K8S.Docker 的时候,往往被 CRI.OCI.CRI shim.containerd 这 ...

  3. 解决“网页源代码编码形式为utf-8,但爬虫代码设置为decode('utf-8')仍出现汉字乱码”的问题

    为了用爬虫获取百度首页的源代码,检查了百度的源代码,显示编码格式为utf-8 但这样写代码,却失败了-.. (这里提示:不要直接复制百度的URL,应该是http,不是https!!!) # 获取百度首 ...

  4. 游戏开发进行中UE5引擎打不开后续

    游戏每次启动都有个问题: 之前我实现了插件里的接口,但是已启动,关于接口这一块的就消失了,有些函数还在但是却是自定义事件,不是接口里的,Class Settings里面也提了 然后我把他改成了新的ch ...

  5. windows生成苹果私钥证书p12证书和profile文件的方法

    hbuilderx出现已经有差不多10年时间了,现在越来越多的企业,开始使用跨平台性更优秀的uniapp来开发ios app. 开发ios app的时候,打包需要苹果的私钥证书和证书profile文件 ...

  6. 助动词&情态动词

    助动词 (auxiliary verbs) 任何整句都分为主语和谓语,而谓语部分的核心是谓语动词, 但是谓语动词本身往往无法独立表达某些语法概念,需要其他词的辅助, 而这类来辅助构成谓语但自己本身不能 ...

  7. LangChain的LCEL和Runnable你搞懂了吗

    LangChain的LCEL估计行业内的朋友都听过,但是LCEL里的RunnablePassthrough.RunnableParallel.RunnableBranch.RunnableLambda ...

  8. SEO自动外链工具的功效以及使用心得

    SEO外链发布工具原理 1.自动SEO外链工具原理:就是把您的网址提交大站长工具类似的网站上面进行搜索,然后就会在上面留下痕迹自动生成以网址为标题的静态页面. 2.自动SEO外链发布效果:我们就是利用 ...

  9. Google的TPU的运算数据类型最高为32比特,也就是说TPU不支持double数据类型,浮点数类型最高支持float32

    Google的TPU的运算数据类型最高为32比特,也就是说TPU不支持double数据类型,浮点数类型最高支持float32 地址: https://cloud.google.com/tpu/docs ...

  10. vue3:setup语法糖使用教程

    setup语法糖简介 直接在script标签中添加setup属性就可以直接使用setup语法糖了. 使用setup语法糖后,不用写setup函数:组件只需要引入不需要注册:属性和方法也不需要再返回,可 ...