在实际的业务需求中,数据报表的导出功能是必不可少的。通常会支持按日期导出,如果数据量较小,那么问题不大。但是,当数据量特别大,如几十万或上百万条时,我们就需要考虑如何解决服务器负载问题,以免导致程序崩溃。目前,主要有以下几种导出方式:
1. NPOI:这是我们经常使用的一种方式。在导出时,可以找到很多相关的代码,简单方便地复制使用。然而,NPOI库在处理大量数据时可能会消耗较多内存,导致内存不足或程序崩溃。虽然可以使用流式写入解决此问题,但NPOI库本身并不支持这种写入方式。
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
// 创建一个新的Excel文件
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("Sheet1");
// 添加数据
IRow row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue("Hello");
row.CreateCell(1).SetCellValue("World");
// 保存Excel文件
using FileStream fileStream = new FileStream("Sample_NPOI.xlsx", FileMode.Create, FileAccess.Write);
workbook.Write(fileStream);
workbook.Close();
2. StreamWriter:使用StreamWriter类写入CSV文件对内存消耗最小,但缺陷也明显。CSV文件本质上是纯文本文件,不能处理复杂的格式、样式、图表和其他高级Excel功能,仅支持文本和数值类型的数据。
using System.IO;
// 创建一个新的CSV文件
using StreamWriter writer = new StreamWriter("Sample.csv");
// 添加数据
writer.WriteLine("Hello,World");
// 关闭文件
writer.Close();
3. OpenXML:直接操作底层XML结构,性能较好,但使用OpenXML SDK操作Excel文件的行和列可能显得更复杂。这是因为OpenXML SDK更接近Excel文件的底层结构,它直接操作Office文件的XML结构。这为用户提供了更高的灵活性和控制力,但同时也需要更多的操作和对底层结构的了解。对于新手来说并不友好。
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
// 创建一个新的Excel文件
using SpreadsheetDocument document = SpreadsheetDocument.Create("Sample_OpenXML.xlsx", SpreadsheetDocumentType.Workbook);
WorkbookPart workbookPart = document.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
// 添加数据
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
Row row = new Row();
row.Append(new Cell { CellValue = new CellValue("Hello"), DataType = CellValues.String });
row.Append(new Cell { CellValue = new CellValue("World"), DataType = CellValues.String });
sheetData.Append(row);
Sheets sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets());
Sheet sheet = new Sheet { Id = document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };
sheets.Append(sheet);
workbookPart.Workbook.Save();
4. EPPlus:EPPlus是一个用于操作Microsoft Excel文件的.NET库,基于Open XML SDK。它可以创建、读取、写入和编辑Excel文件(如XLSX、XLSM和XLTX),并提供了一组易于使用的API,使得处理Excel文件更加简单。相较于前几种方式,EPPlus的性能和操作简易性都较为适中。然而,在处理大数据时,也可能遇到崩溃的情况。此时,我们可以考虑对数据进行分批处理,生成多个sheet页,从而大大减少内存消耗压力。
using OfficeOpenXml;
using System.IO;
// 设置EPPlus的许可证(根据您的许可证情况进行设置)
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
// 创建一个新的Excel文件
using ExcelPackage package = new ExcelPackage();
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");
// 添加数据
worksheet.Cells[1, 1].Value = "Hello";
worksheet.Cells[1, 2].Value = "World";
// 保存Excel文件
FileInfo fileInfo = new FileInfo("Sample_EPPlus.xlsx");
package.SaveAs(fileInfo);