介紹
高效讀取大型 Excel 文件可能具有挑戰性,尤其是在處理需要高性能和可擴展性的應用程序時。Microsoft 的 OpenXML SDK 提供了一套強大的工具來處理 Office 文檔(包括 Excel 文件),而無需在服務器上安裝 Excel。本文將指導您使用 C# 和 OpenXML 高效讀取大型 Excel 文件。
為何使用 OpenXML?
OpenXML 是辦公文檔(Word、Excel、PowerPoint)的開放標準,允許以編程方式操作這些文檔。使用 OpenXML 的一些好處包括:
- 性能:它直接對文件流進行操作,而無需將整個文檔加載到內存中。
- 無依賴性:無需安裝 Microsoft Office。
- 可擴展性:非常適合服務器端應用程序和批處理。
先決條件
在深入研究代碼之前,請確保您已具備以下內容。
- Visual Studio 或任何 C# IDE
- .NET Framework 或 .NET Core SDK
- OpenXML SDK:您可以使用命令通過 NuGet 安裝它。
Install-Package DocumentFormat.OpenXml
使用 OpenXML 讀取大型 Excel 文件
以下是使用 C# 和 OpenXML 讀取大型 Excel 文件的分步指南。
1. 設置項目
創建一個新的 C# 控制臺應用程序。
- 打開 Visual Studio 并創建一個新的控制臺應用程序(.NET Core 或 .NET Framework)。
- 通過 NuGet 安裝 OpenXML SDK。
2.打開 Excel 文件
首先,您需要打開 Excel 文件并訪問要讀取的工作表。使用以下代碼打開 Excel 文件。
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;namespace ReadLargeExcelFile
{class Program{static void Main(string[] args){string filePath = "path/to/your/large/excelfile.xlsx";using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, false)){WorkbookPart workbookPart = doc.WorkbookPart;Sheet sheet = workbookPart.Workbook.Sheets.GetFirstChild<Sheet>();WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);IEnumerable<Row> rows = worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>();foreach (Row row in rows){foreach (Cell cell in row.Elements<Cell>()){string cellValue = GetCellValue(doc, cell);Console.Write(cellValue + " ");}Console.WriteLine();}}}private static string GetCellValue(SpreadsheetDocument doc, Cell cell){SharedStringTablePart stringTablePart = doc.WorkbookPart.SharedStringTablePart;string value = cell.CellValue.InnerXml;if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString){return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;}else{return value;}}}
}
3. 高效處理大文件
上述代碼將整個工作表讀入內存,這對于非常大的文件來說可能效率不高。為了更有效地處理大文件,請考慮分塊處理文件或使用流式傳輸技術。
. 優化性能
為了優化性能,您可以
- 流式傳輸文件:使用流式傳輸技術分部分處理文件,而不是將整個文件加載到內存中。
- 并行處理:如果您的應用程序允許,您可以并行處理文件的不同部分。
- 高效的數據結構:使用高效的數據結構來存儲和處理數據。
下面是一個使用流式傳輸的示例。
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;namespace ReadLargeExcelFile
{class Program{static void Main(string[] args){string filePath = "path/to/your/large/excelfile.xlsx";using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, false)){WorkbookPart workbookPart = doc.WorkbookPart;Sheet sheet = workbookPart.Workbook.Sheets.GetFirstChild<Sheet>();WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);while (reader.Read()){if (reader.ElementType == typeof(Row)){Row row = (Row)reader.LoadCurrentElement();foreach (Cell cell in row.Elements<Cell>()){string cellValue = GetCellValue(doc, cell);Console.Write(cellValue + " ");}Console.WriteLine();}}}}private static string GetCellValue(SpreadsheetDocument doc, Cell cell){SharedStringTablePart stringTablePart = doc.WorkbookPart.SharedStringTablePart;string value = cell.CellValue.InnerXml;if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString){return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;}else{return value;}}}
}
結論
使用 C# 和 OpenXML 讀取大型 Excel 文件為需要高性能和可擴展性的應用程序提供了強大的解決方案。通過遵循本文概述的做法,您可以高效地處理存儲在 Excel 文件中的大型數據集,從而使您的應用程序更高效、響應更快。OpenXML 無需安裝 Office 即可操作 Office 文檔,這使其成為任何開發人員工具包中的重要工具。