您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。