美文网首页
[.Net] 用OpenXml导出Excel最精简实用的Quic

[.Net] 用OpenXml导出Excel最精简实用的Quic

作者: 无衔 | 来源:发表于2018-08-05 00:03 被阅读44次

    OpenXml个人下载地址:链接:https://pan.baidu.com/s/1ldqVQWxSDjrikvsvufRNtQ 密码:dlll

    .Net导出Excel的方案不少。至于选哪种,一般考虑下面3个因素

    1.是否要支持xls

    鉴于目前已经基本不再有xls这种老版本存在了,OpenXml(它只支持xlsx)的重要性和普适性更具备价值。

    2.对大数据量生成Excel的支持如何

    对于超大数据量的Excel生成,OpenXml稳定可靠(毕竟是亲生的和更好的架构),不会内存溢出。当然极限情况下还有比它更快的方案。

    3.运行的兼容性-->对于是否要安装Office作为前提

    特别是客户端程序,为了避免不必要的崩溃和兼容性,免得那么多千奇百怪的问题发生,OpenXml还是首选。服务端的话,只要测试通过就行,那只要性能过关就好。

    示例代码

    所以既然有那么多方案,OpenXml基本没有什么缺陷的话,选它用它玩转它就够了。所以我们需要一个快速入门。不过,发现网上翻了一圈都是一些非常罗嗦繁琐和封装的不好的例子,多看两眼对比下,我觉得根源还是MSDN的入门范例不够犀利。

    这里贴一个简洁明了的DataTable[]转成Excel的范例。之所以是DataTable的数组就是为了强调一下通用性。网上其他DataTable转Excel的例子,你会很头疼怎么扩展为一个DataTable数组转Excel的例子。其实关键是DataTable应该映射为SheetData这个类型。

    public static SheetData CreatSheetData(DataTable table)
    

    版本信息如下


    OpenXml

    下面是完整代码

    注意这仅仅是个QuickStart,有一定功能,能清晰的入门理解。并不纳入的对单元格数据合法性的处理,强壮和通用不是它本来的目的,请自行完善。

    先附图,免得觉得各种类的关系很绕


    关系图
    using System.Data;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Spreadsheet;
    
    namespace BankMoneyClient
    {
        public class OpenXmlExcelHelper
        {
            public static void CreateExcel(string excelFilePath, DataTable[] tables, string[] sheetNames)
            {
                var spreadsheetDocument = SpreadsheetDocument.Create(excelFilePath, SpreadsheetDocumentType.Workbook);
                var workbookpart = spreadsheetDocument.AddWorkbookPart();
                workbookpart.Workbook = new Workbook();
    
                Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets());
    
                for (int i = 0; i < tables.Length; i++)
                {
                    WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
                    worksheetPart.Worksheet = new Worksheet(CreatSheetData(tables[i]));
    
                    Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), 
                        SheetId = new UInt32Value((uint)(i + 1)), Name = (sheetNames != null ? sheetNames[i] : i.ToString()) };
                    sheets.Append(sheet);
                }
    
                workbookpart.Workbook.Save();
                spreadsheetDocument.Close();
            }
    
            public static SheetData CreatSheetData(DataTable table)
            {
                var sheetData = new SheetData();
                for (int r = 0; r < table.Rows.Count; r++)
                {
                    Row row = new Row();
                    for (int c = 0; c < table.Columns.Count; c++)
                    {
                        Cell dataCell = new Cell();
                        dataCell.CellValue = new CellValue(table.Rows[r][c].ToString());
                        dataCell.DataType = CellValues.String;
                        row.AppendChild(dataCell);
                    }
                    sheetData.Append(row);
                }
                return sheetData;
            }
        }
    }
    
    
    关于修改单元格样式

    不止一个博文里提到有坑,这里抄录过来作为备忘

    Fonts 要有一个默认值
    Fills 要有2个默认值
    Borders 要有1个默认值

    StylesheetPart->Stylesheet->CellStyleFormats->CellFormat->FormatId
    ->FontId
    ->BorderId->BottomBorder->Style->1
    ->FillId

    相关文章

      网友评论

          本文标题:[.Net] 用OpenXml导出Excel最精简实用的Quic

          本文链接:https://www.haomeiwen.com/subject/pievvftx.html