溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么使用OpenXML讀取Excel文檔

發布時間:2021-07-07 15:44:00 來源:億速云 閱讀:1240 作者:Leah 欄目:大數據
# 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

2. 添加命名空間

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Linq;

三、基礎讀取操作

1. 打開Excel文件

// 文件路徑
string filePath = @"C:\example.xlsx";

// 打開Excel文檔
using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
{
    WorkbookPart workbookPart = document.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    
    // 后續操作...
}

2. 獲取工作表數據

// 獲取第一個工作表
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().First();
Worksheet worksheet = ((WorksheetPart)workbookPart.GetPartById(sheet.Id)).Worksheet;

// 獲取所有行
var rows = worksheet.Descendants<Row>();

四、讀取單元格數據

1. 基本讀取方法

foreach (Row row in rows)
{
    foreach (Cell cell in row.Descendants<Cell>())
    {
        // 獲取單元格值
        string cellValue = GetCellValue(cell, workbookPart);
        Console.Write(cellValue + "\t");
    }
    Console.WriteLine();
}

2. 輔助方法:獲取單元格值

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;
}

五、高級讀取技巧

1. 按列名讀取數據

// 獲取列名與索引的映射
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());
}

2. 處理日期類型

if (cell.DataType != null && cell.DataType.Value == CellValues.Number)
{
    if (double.TryParse(value, out double oaDate))
    {
        value = DateTime.FromOADate(oaDate).ToString("yyyy-MM-dd");
    }
}

六、性能優化建議

  1. 使用SAX模式讀取大文件

    OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
    while (reader.Read())
    {
       if (reader.ElementType == typeof(Row))
       {
           Row row = (Row)reader.LoadCurrentElement();
           // 處理行數據
       }
    }
    
  2. 限制讀取范圍

    var rows = worksheet.Descendants<Row>()
               .Skip(1)  // 跳過標題行
               .Take(1000); // 只讀取1000行
    
  3. 緩存共享字符串表

    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();
            }
        }
    }
    
    // 前面列出的輔助方法...
}

八、常見問題解決

  1. 文件被占用錯誤:確保正確使用using語句釋放資源
  2. 格式不兼容:OpenXML不支持.xls格式(需要使用其他庫如NPOI)
  3. 性能問題:大文件建議使用SAX模式讀取
  4. 空值處理:注意檢查cell是否為null

九、擴展學習資源

  1. 官方OpenXML SDK文檔
  2. OpenXML標準文檔
  3. OpenXML Productivity Tool

通過本文介紹的方法,您可以高效地使用C#和OpenXML SDK讀取Excel文檔內容。對于更復雜的需求,還可以進一步研究樣式、公式、圖表等高級功能的操作。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女