C#利用Openxml读取Excel数据实例

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数据的步骤

  1. 添加OpenXML的引用

为了使用OpenXML,我们需要在项目中添加NuGet包,可以使用NuGet包管理工具或直接手动添加。使用 NuGet 安装时,我们只需要在包管理器控制台中输入以下代码即可安装:

PM> Install-Package DocumentFormat.OpenXml
  1. 创建读取流对象

在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文件路径。

  1. 读取行数据

在获取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技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • Js获取table当前tr行的值的代码

    以下是“Js获取table当前tr行的值的代码”的完整攻略: Js获取table当前tr行的值的代码 在JavaScript中,可以使用以下代码来获取table当前tr行的值: var table = document.getElementById("tableId"); var rows = table.getElementsByTag…

    html 2023年5月18日
    00
  • 火炬之光无限s2月女开荒技能装备搭配推荐 月女开荒攻略

    以下是“火炬之光无限s2月女开荒技能装备搭配推荐 月女开荒攻略”的完整攻略: 火炬之光无限s2月女开荒技能装备搭配推荐 月女开荒攻略 月女是火炬之光无限s2中的一个强力角色,她拥有多种技能和装备,可以在开荒过程中发挥重要作用。以下是关于月女开荒技能装备搭配推荐的详细攻略。 月女开荒技能推荐 月之祝福:月之祝福是月女的主动技能,可以为队友提供强力的增益效果。在…

    html 2023年5月18日
    00
  • php抓取页面的几种方法详解

    PHP抓取页面的几种方法详解 什么是抓取页面? 抓取页面,顾名思义,就是获取网站上的数据。通俗的说,就是爬取网页上的内容,然后根据需要进行处理分析。在互联网发展迅速的今天,抓取页面已经成为网络爬虫应用的重要组成部分,广泛应用于搜索引擎、数据挖掘、分析等领域,而PHP也是其中常用的语言之一。 抓取页面的方式 PHP抓取页面的方式多种多样,根据需求不同,可以选用…

    html 2023年5月30日
    00
  • 使用SyntaxHighlighter实现HTML高亮显示代码的方法

    接下来我将详细介绍如何使用SyntaxHighlighter实现HTML高亮显示代码的方法,包括必要的准备工作和步骤,以及示例说明。 准备工作 下载SyntaxHighlighter的源代码和CSS样式文件。可以从官网下载最新版本的代码,或者使用GitHub上的源代码。 将下载的代码解压缩到合适的目录中,并将CSS样式文件放到网站的样式文件夹中。 在HTML…

    html 2023年5月30日
    00
  • HTML标签的语法格式

    HTML标签的语法格式包括标签名、属性和内容等三个部分。 1. 标签名:用于表示不同的元素,一般由一个小于号,后面跟标签名称,再以大于号结束。 标签名的格式为:<标签名称> 例如,段落标签的名称是<p>,标题标签的名称是<h1>、<h2>、<h3>等等。 2. 属性:用于指定元素的特征和行为。属性包…

    Web开发基础 2023年3月15日
    00
  • 详解log4j.properties的简单配置和使用

    下面是“详解log4j.properties的简单配置和使用”的完整攻略。 一、log4j.properties概述 log4j.properties是一个Log4j的配置文件。在Java应用程序中使用Log4j,我们通常先要配置log4j.properties文件。 在该文件中可以定义: 根节点日志级别 不同包的日志级别 不同的日志输出方式 日志格式等 下…

    html 2023年5月30日
    00
  • mybatis注解与xml常用语句汇总

    下面就为你详细讲解mybatis注解与xml常用语句汇总的完整攻略。 一、Mybatis注解与XML常用语句汇总 在Mybatis中,我们可以使用注解或XML来编写SQL语句。虽然两者各有优劣,但其本质是一致的,都是用于定义SQL语句和数据库操作。在实际开发中,我们可以根据具体情况选择使用注解或XML编写SQL语句。下面分别介绍注解和XML中常用的SQL语句…

    html 2023年5月30日
    00
  • Word文档打开后出现乱码怎么解决?

    Word文档打开后出现乱码怎么解决? 在打开Word文档时出现乱码是一个常见的问题。下面我们可以按照以下步骤解决。 步骤一:修改编码方式 很多时候,由于编码方式不同,才导致Word文档打开后出现乱码。这时可以尝试修改编码方式。 首先打开出现乱码的Word文档,选择“文件”菜单-“选项”-“高级”。 找到“将文档中的字体替换为”选项,勾选“仅在打印时添加替换字…

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部