C#利用OpenXML读取Excel数据实例
1. 什么是 OpenXML?
OpenXML是一个开放式、XML-based格式,用于表述和传输数据、文档和电子表格。该格式由Microsoft于2007年推出,其主要作用是为了实现对微软Office系列软件的扩展。OpenXML可以通过Microsoft Office 2007或更高版本创建和编辑,如Word、PowerPoint、Excel、Outlook等。
2. 为什么要使用 OpenXML?
使用 OpenXML 的主要原因是为了通过程序的方式操作和修改Microsoft Office系列文件。比如,现在很多企业都需要将Excel文件中的数据抽离出来,再进行各种统计和筛选。在此情景下,我们可以使用C#程序通过OpenXML来读取Excel文件中的数据,进而实现数据处理和分析。
3. 使用OpenXML读取Excel数据的步骤
- 添加OpenXML的引用
为了使用OpenXML,我们需要在项目中添加NuGet包,可以使用NuGet包管理工具或直接手动添加。使用 NuGet 安装时,我们只需要在包管理器控制台中输入以下代码即可安装:
PM> Install-Package DocumentFormat.OpenXml
- 创建读取流对象
在C#程序中,我们需要先获得一个实际数据的流对象。我们可以通过以下代码获得数据流:
using (var fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var doc = SpreadsheetDocument.Open(fs, false))
{
var sheets = doc.WorkbookPart.Workbook.Sheets;
foreach (var sheet in sheets)
{
var worksheet = (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);
var rows = worksheet.Worksheet.GetFirstChild<SheetData>().Descendants<Row>();
foreach (var row in rows)
{
//此处需要读取具体行数据并做相应处理
}
}
}
}
需要注意的是,示例代码中的fileInfo是由传入参数得到的参数FileInfo对象,它是Excel文档的文件路径,即需要读取的Excel文件路径。
- 读取行数据
在获取Excel数据流后,我们需要读取数据流的每一行。具体代码如下:
var cellValueList = new List<string>();
foreach (var cell in row.Descendants<Cell>())
{
var value = cell.InnerText;
if (cell.DataType != null && cell.DataType == CellValues.SharedString)
{
value = doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements[int.Parse(value)].InnerText;
}
cellValueList.Add(value);
}
在该示例代码中,我们遍历了每一行中的每一个单元格。对于每个单元格,我们读取了它的InnerText并获取它的数据类型,若单元格数据类型为SharedString则根据ChildElements[index]获取真正的值。
4. 示例说明
下面,我们通过两个数据集来说明如何使用OpenXML读取Excel数据并进行数据处理:
示例1:读取一般数据集
在这个示例中,我们将读取一个Excel文件,该文件包含三列数据,分别是姓名、年龄和职业。首先我们找到Excel文件所在的路径,通过以下代码获取数据流:
var fileInfo = new FileInfo(@"D:\samples\example1.xlsx");
using (var fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var doc = SpreadsheetDocument.Open(fs, false))
{
var sheets = doc.WorkbookPart.Workbook.Sheets;
foreach (var sheet in sheets)
{
var worksheet = (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);
Console.WriteLine($"Sheet Name:{sheet.Name}");
var rows = worksheet.Worksheet.GetFirstChild<SheetData>().Descendants<Row>();
foreach (var row in rows)
{
var cellValueList = new List<string>();
foreach (var cell in row.Descendants<Cell>())
{
var value = cell.InnerText;
if (cell.DataType != null && cell.DataType == CellValues.SharedString)
{
value = doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements[int.Parse(value)].InnerText;
}
cellValueList.Add(value);
}
Console.WriteLine($"{cellValueList[0]} {cellValueList[1]} {cellValueList[2]}");
}
}
}
}
当我们执行该程序后,便会输出读取到的数据:
Sheet Name:Sheet1
姓名 年龄 职业
张三 25 技术部
李四 24 人事部
王五 23 财务部
示例2:读取数据表头与数据内容
在这个示例中,我们将读取一个Excel文件,该文件的第一行是数据表头,之后的每一行是数据内容。我们将分别读取表头和数据内容,并进行处理。代码如下:
var fileInfo = new FileInfo(@"D:\samples\example2.xlsx");
using (var fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var doc = SpreadsheetDocument.Open(fs, false))
{
var sheets = doc.WorkbookPart.Workbook.Sheets;
foreach (var sheet in sheets)
{
var worksheet = (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);
Console.WriteLine($"Sheet Name:{sheet.Name}");
var rows = worksheet.Worksheet.GetFirstChild<SheetData>().Descendants<Row>();
var fieldNames = new List<string>();
var fieldList = new List<List<string>>();
foreach (var row in rows)
{
var cellValueList = new List<string>();
foreach (var cell in row.Descendants<Cell>())
{
var value = cell.InnerText;
if (cell.DataType != null && cell.DataType == CellValues.SharedString)
{
value = doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements[int.Parse(value)].InnerText;
}
cellValueList.Add(value);
}
if (row.RowIndex == 1)
{
fieldNames = cellValueList;
}
else
{
fieldList.Add(cellValueList);
}
}
Console.WriteLine("Field Names:");
Console.WriteLine(string.Join(",", fieldNames));
Console.WriteLine("Data:");
foreach (var fieldRow in fieldList)
{
Console.WriteLine(string.Join(",", fieldRow));
}
}
}
}
当我们执行该程序后,便会输出读取到的数据:
Sheet Name:Sheet1
Field Names:
Name,Age,Department
Data:
Allen,30,Sales
Emma,25,IT
Mike,27,HR
这里通过读取表头和数据内容分别存储在不同的List变量中,我们可以更方便地去获取需要的数据信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#利用Openxml读取Excel数据实例 - Python技术站