zoukankan      html  css  js  c++  java
  • ASP.NET Core Excel 读写

    前言

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

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

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

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

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

    以前写的笔记

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

    ClosedXML

    它的结构很简单 Book > Sheets > Sheet > Row/Column > Cell

    创建 Book

    var book = new XLWorkbook();

    打开 Book

    using var book = new XLWorkbook(@"ExcelExcel.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(@"ExcelExcel.xlsx");
    book.Save();

    通常新建配 SaveAs, 修改配 Save

    一开始折腾后来放弃的 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(@"ExcelExcel.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();
    }

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

  • 相关阅读:
    区别@ControllerAdvice 和@RestControllerAdvice
    Cannot determine embedded database driver class for database type NONE
    使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
    Markdown语法笔记
    Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
    Mysql 查看连接数,状态 最大并发数(赞)
    OncePerRequestFilter的作用
    java连接MySql数据库 zeroDateTimeBehavior
    Intellij IDEA 安装lombok及使用详解
    ps -ef |grep xxx 输出的具体含义
  • 原文地址:https://www.cnblogs.com/keatkeat/p/15077361.html
Copyright © 2011-2022 走看看