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

2018-08-05  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读