前言

以前写过 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

  1. var book = new XLWorkbook();

打开 Book

  1. using var book = new XLWorkbook(@"Excel\Excel.xlsx");

创建 Sheet

  1. var sheet = book.Worksheets.Add("Sheet1");

获取 Cell

  1. var cell1 = sheet.Row(1).Cell(1);
  2. var cell2 = sheet.Cell("A1");

Row(1) 是拿第一行, 没有第 0 行的哦. start from 1, column 也是一样

定义值和类型

  1. cell.DataType = XLDataType.Text;
  2. cell.Value = "value";

类型有 5 种

Set custom format

我的做法通常是去 excel set 然后查看 custom, 复制过来, 比如下面这个是 Accounting 的

  1. cell.Style.NumberFormat.Format = "_ [$USD] * #,##0.00_ ;_ [$USD] * -#,##0.00_ ;_ [$USD] * \"-\"??_ ;_ @_ ";

Set hyperlink

  1. cell.Hyperlink = new XLHyperlink(@"https://www.stooges.com.my");

Set alignment

  1. cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
  2. cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Top;

Set Color

  1. cell.Style.Font.FontColor = XLColor.Blue;
  2. cell.Style.Fill.BackgroundColor = XLColor.FromHtml("#FF0000");

Set wrap text

  1. cell.Style.Alignment.SetWrapText(true);

Set date format

  1. cell.Style.DateFormat.Format = "dd-MM-yyyy";
  2. cell.Style.DateFormat.Format = "dd-MM-yyyy hh:mm:ss AM/PM";

Set column width

  1. sheet.Column(1).Width = 10;

10 的单位是字数 (number of characters)

Set column width / row height base on content

  1. sheet.Column(1).AdjustToContents(10d, 20d);
  2. sheet.Row(2).AdjustToContents(0d, 20d);

参数是 min, max (是 double 哦)

保存

  1. book.SaveAs(@"Excel\Excel.xlsx");
  2. book.Save();

通常新建配 SaveAs, 修改配 Save

读取 Excel

  1. var book = new XLWorkbook(@"Excel\excel.xlsx");
  2. if (book.TryGetWorksheet("Sheet1", out var worksheet))
  3. {
  4. var rows = worksheet.RowsUsed();
  5. var headerRow = rows.First();
  6. var dataRows = rows.Take(1..);
  7. foreach (var row in dataRows)
  8. {
  9. var cells = row.Cells();
  10. foreach (var cell in cells)
  11. {
  12. var value = cell.Value;
  13. var address = cell.Address.ToString(); // A2
  14. }
  15. }
  16. }

一开始折腾后来放弃的 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

  1. dotnet add package DocumentFormat.OpenXml

ExcelController.cs

  1. [HttpPost("CreateExcel")]
  2. public ActionResult CreateExcel([FromBody] CreateExcelDto dto)
  3. {
  4. // create doc
  5. using var doc = SpreadsheetDocument.Create(@"Excel\Excel.xlsx", SpreadsheetDocumentType.Workbook);
  6.  
  7. // create workbook part
  8. var workbookpart = doc.AddWorkbookPart();
  9. // create workbook
  10. workbookpart.Workbook = new Workbook();
  11.  
  12. // create worksheet part
  13. var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
  14.  
  15. // create sheet data
  16. var sheetData = new SheetData();
  17. // create header
  18. var headerRow = new Row();
  19. var headerCell = new Cell
  20. {
  21. DataType = new EnumValue<CellValues>(CellValues.String),
  22. CellValue = new CellValue("FirstName")
  23. };
  24. headerRow.Append(headerCell);
  25. sheetData.Append(headerRow);
  26.  
  27. // create row
  28. var firstRow = new Row();
  29. var firstRowCell = new Cell
  30. {
  31. DataType = new EnumValue<CellValues>(CellValues.String),
  32. CellValue = new CellValue("Derrick Yam")
  33. };
  34. firstRow.Append(firstRowCell);
  35. sheetData.Append(firstRow);
  36.  
  37. // create worksheet
  38. worksheetPart.Worksheet = new Worksheet(sheetData);
  39.  
  40. // create sheets
  41. var sheets = workbookpart.Workbook.AppendChild<Sheets>(new Sheets());
  42. // create sheet
  43. var sheet = new Sheet()
  44. {
  45. Id = workbookpart.GetIdOfPart(worksheetPart), // connect sheet to worksheet part
  46. SheetId = 1,
  47. Name = "Sheet1"
  48. };
  49. sheets.Append(sheet);
  50.  
  51. workbookpart.Workbook.Save();
  52. return Ok();
  53. }

需要注意的是它的结构很多层, 不要搞错. 顺序做就对了.

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. log4cpp的安装及使用

    目录 前言 安装 使用 示例代码 配置文件 编译链接 输出 前言 本文的操作均在ubuntu20.04下进行 安装 本文仅介绍从源码编译安装log4cpp的过程. ①在开始编译前,首先要确保系统中安装 ...

  2. Vue3中如何使用this

    vue3提供了getCurrentInstance ,通过这个属性,直接使用ctx是错误的,需要找到全局属性globalProperties import { getCurrentInstance } ...

  3. 双指针 & 双向搜索

    双指针 根据人类直觉这个东西需要满足单调性,所以预处理的时候大概率需要排序. 好像常与二分结合使用? 可以用在序列.链表(存储位置)或者树.图上(存储结点). 或者用于其他算法(eg:单调队列.差分) ...

  4. odoo 通过Javascript显示或隐藏form自带按钮

    实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下,根据条件对form视图自带按钮的显示.隐藏进行控制 代码实现 隐藏.显示编辑和创建按钮为例 od ...

  5. Kubernetes 部署Dashboard UI

    实践环境 CentOS-7-x86_64-DVD-1810 Docker 19.03.9 Kubernetes version: v1.20.5 发布Dashboard 可以通过运行以下命令部署Das ...

  6. Cython与C函数的结合

    技术背景 在前面一篇博客中,我们介绍了使用Cython加速谐振势计算的方法.有了Cython对于计算过程更加灵活的配置(本质上是时间占用和空间占用的一种均衡),及其接近于C的性能,并且还最大程度上的保 ...

  7. Ubuntu16.04设置静态IP或动态ip(DHCP)

    Ubuntu16.04设置静态IP或动态ip(DHCP) 设置静态IP 1,vim编辑/etc/network/interfaces 网络配置文件 sudo vim /etc/network/inte ...

  8. AI辅助教学,甚至AI教学,逐渐成为可能

    看新闻,有感: 太火爆!一门课,两个月吸粉十五万人!企业纷纷布局!千亿级大市场,来了?

  9. 国内的开源AI模型共享网站(AI模型的GitHub)—— mindscope —— 使用git lfs方式下载模型文件

    参考前文: 国内的开源AI模型共享网站(AI模型的GitHub)-- mindscope -- 对标外网的"huggingface",mindscope好用吗? 使用git lfs ...

  10. ubuntu编译软件报错:fatal error: libnet.h: No such file or directory

    参考: https://blog.csdn.net/wuyou1995/article/details/104742326/ ------------------------------------- ...