C#中怎么使用OpenXML读取Excel文档

发布时间:2021-07-07 15:44:00 作者:Leah
来源:亿速云 阅读:1183
# 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文档内容。对于更复杂的需求,还可以进一步研究样式、公式、图表等高级功能的操作。 “`

推荐阅读:
  1. C#中如何使用iTextSharp操作PDF文档
  2. c#读取excel数据

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

openxml

上一篇:C#中怎么利用RabbitMQ实现一个延迟队列功能

下一篇:C# 中怎么创建一个多线程窗体

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》