# C#中怎么使用OpenXML讀取Excel文檔
## 一、OpenXML SDK簡介
OpenXML是微軟提供的用于操作Office文檔(Word/Excel/PPT)的開源SDK,它允許開發人員在不安裝Microsoft Office的情況下直接讀寫Office文件。相比傳統的COM組件(如Microsoft.Office.Interop),OpenXML具有以下優勢:
- 不需要安裝Office軟件
- 性能更好,內存占用更低
- 支持跨平臺開發
- 開源免費(MIT許可證)
## 二、環境準備
### 1. 安裝NuGet包
在Visual Studio中通過NuGet安裝以下包:
```bash
Install-Package DocumentFormat.OpenXml
Install-Package System.IO.Packaging
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Linq;
// 文件路徑
string filePath = @"C:\example.xlsx";
// 打開Excel文檔
using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
{
WorkbookPart workbookPart = document.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
// 后續操作...
}
// 獲取第一個工作表
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().First();
Worksheet worksheet = ((WorksheetPart)workbookPart.GetPartById(sheet.Id)).Worksheet;
// 獲取所有行
var rows = worksheet.Descendants<Row>();
foreach (Row row in rows)
{
foreach (Cell cell in row.Descendants<Cell>())
{
// 獲取單元格值
string cellValue = GetCellValue(cell, workbookPart);
Console.Write(cellValue + "\t");
}
Console.WriteLine();
}
private static string GetCellValue(Cell cell, WorkbookPart workbookPart)
{
if (cell == null) return string.Empty;
string value = cell.InnerText;
// 處理共享字符串
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
{
var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
if (stringTable != null)
{
value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
}
}
return value;
}
// 獲取列名與索引的映射
Dictionary<string, int> columnNames = new Dictionary<string, int>();
var firstRow = worksheet.Descendants<Row>().First();
foreach (Cell cell in firstRow.Descendants<Cell>())
{
string columnName = GetColumnName(cell.CellReference);
columnNames[columnName] = int.Parse(cell.CellReference.Value.Replace(columnName, ""));
}
// 輔助方法:獲取列名
private static string GetColumnName(string cellReference)
{
return new string(cellReference.Where(char.IsLetter).ToArray());
}
if (cell.DataType != null && cell.DataType.Value == CellValues.Number)
{
if (double.TryParse(value, out double oaDate))
{
value = DateTime.FromOADate(oaDate).ToString("yyyy-MM-dd");
}
}
使用SAX模式讀取大文件:
OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
while (reader.Read())
{
if (reader.ElementType == typeof(Row))
{
Row row = (Row)reader.LoadCurrentElement();
// 處理行數據
}
}
限制讀取范圍:
var rows = worksheet.Descendants<Row>()
.Skip(1) // 跳過標題行
.Take(1000); // 只讀取1000行
緩存共享字符串表:
var sharedStringTable = workbookPart.SharedStringTablePart.SharedStringTable;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;
using System.Linq;
class ExcelReader
{
static void Main(string[] args)
{
string filePath = @"C:\data.xlsx";
using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
{
WorkbookPart workbookPart = document.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
Worksheet worksheet = worksheetPart.Worksheet;
foreach (Row row in worksheet.Descendants<Row>())
{
foreach (Cell cell in row.Descendants<Cell>())
{
Console.Write(GetCellValue(cell, workbookPart) + "\t");
}
Console.WriteLine();
}
}
}
// 前面列出的輔助方法...
}
using語句釋放資源通過本文介紹的方法,您可以高效地使用C#和OpenXML SDK讀取Excel文檔內容。對于更復雜的需求,還可以進一步研究樣式、公式、圖表等高級功能的操作。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。