使用C#和OpenXML讀取大型Excel文件
介紹
高效讀取大型 Excel 文件可能具有挑戰(zhàn)性,尤其是在處理需要高性能和可擴(kuò)展性的應(yīng)用程序時(shí)。Microsoft 的 OpenXML SDK 提供了一套強(qiáng)大的工具來(lái)處理 Office 文檔(包括 Excel 文件),而無(wú)需在服務(wù)器上安裝 Excel。本文將指導(dǎo)您使用 C# 和 OpenXML 高效讀取大型 Excel 文件。
為何使用 OpenXML
OpenXML 是辦公文檔(Word、Excel、PowerPoint)的開放標(biāo)準(zhǔn),允許以編程方式操作這些文檔。使用 OpenXML 的一些好處包括:
性能:它直接對(duì)文件流進(jìn)行操作,而無(wú)需將整個(gè)文檔加載到內(nèi)存中。
無(wú)依賴性:無(wú)需安裝 Microsoft Office。
可擴(kuò)展性:非常適合服務(wù)器端應(yīng)用程序和批處理。
先決條件
在深入研究代碼之前,請(qǐng)確保您已具備以下內(nèi)容。
Visual Studio 或任何 C# IDE
.NET Framework 或 .NET Core SDK
OpenXML SDK:您可以使用命令通過 NuGet 安裝它。
Install-Package DocumentFormat.OpenXml
使用 OpenXML 讀取大型 Excel 文件
以下是使用 C# 和 OpenXML 讀取大型 Excel 文件的分步指南。
1. 設(shè)置項(xiàng)目
創(chuàng)建一個(gè)新的 C# 控制臺(tái)應(yīng)用程序。
打開 Visual Studio 并創(chuàng)建一個(gè)新的控制臺(tái)應(yīng)用程序(.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. 高效處理大文件
上述代碼將整個(gè)工作表讀入內(nèi)存,這對(duì)于非常大的文件來(lái)說(shuō)可能效率不高。為了更有效地處理大文件,請(qǐng)考慮分塊處理文件或使用流式傳輸技術(shù)。
4. 優(yōu)化性能
為了優(yōu)化性能,您可以
流式傳輸文件:使用流式傳輸技術(shù)分部分處理文件,而不是將整個(gè)文件加載到內(nèi)存中。
并行處理:如果您的應(yīng)用程序允許,您可以并行處理文件的不同部分。
高效的數(shù)據(jù)結(jié)構(gòu):使用高效的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)和處理數(shù)據(jù)。
下面是一個(gè)使用流式傳輸?shù)氖纠?/p>
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; } } } }
結(jié)論
使用 C# 和 OpenXML 讀取大型 Excel 文件為需要高性能和可擴(kuò)展性的應(yīng)用程序提供了強(qiáng)大的解決方案。通過遵循本文概述的做法,您可以高效地處理存儲(chǔ)在 Excel 文件中的大型數(shù)據(jù)集,從而使您的應(yīng)用程序更高效、響應(yīng)更快。OpenXML 無(wú)需安裝 Office 即可操作 Office 文檔,這使其成為任何開發(fā)人員工具包中的重要工具。
到此這篇關(guān)于使用C#和OpenXML讀取大型Excel文件的文章就介紹到這了,更多相關(guān)C# OpenXML讀取Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#網(wǎng)頁(yè)跳轉(zhuǎn)方法總結(jié)
這篇文章主要介紹了C#網(wǎng)頁(yè)跳轉(zhuǎn)方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2015-12-12C# 對(duì)MongoDB 進(jìn)行增刪改查的簡(jiǎn)單操作實(shí)例
這篇文章介紹了C# 對(duì)MongoDB 進(jìn)行增刪改查的簡(jiǎn)單操作實(shí)例,有需要的朋友可以參考一下2013-09-09C#中使用反射遍歷一個(gè)對(duì)象屬性及值的小技巧
這篇文章主要介紹了C#中使用反射遍歷一個(gè)對(duì)象屬性及值的小技巧,這在很時(shí)候應(yīng)該都非常有用,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-07-07.net實(shí)現(xiàn)序列化與反序列化實(shí)例解析
這篇文章主要介紹了.net實(shí)現(xiàn)序列化與反序列化實(shí)例解析,需要的朋友可以參考下2014-08-08