使用C#和OpenXML读取大型Excel文件

 更新时间:2024年11月12日 10:45:03   作者:谢.锋  
OpenXML 是办公文档(Word、Excel、PowerPoint)的开放标准,允许以编程方式操作这些文档,本文主要介绍了C#如何利用OpenXML读取大型Excel文件,感兴趣的可以了解下

介绍

高效读取大型 Excel 文件可能具有挑战性,尤其是在处理需要高性能和可扩展性的应用程序时。Microsoft 的 OpenXML SDK 提供了一套强大的工具来处理 Office 文档(包括 Excel 文件),而无需在服务器上安装 Excel。本文将指导您使用 C# 和 OpenXML 高效读取大型 Excel 文件。

为何使用 OpenXML

OpenXML 是办公文档(Word、Excel、PowerPoint)的开放标准,允许以编程方式操作这些文档。使用 OpenXML 的一些好处包括:

性能:它直接对文件流进行操作,而无需将整个文档加载到内存中。

无依赖性:无需安装 Microsoft Office。

可扩展性:非常适合服务器端应用程序和批处理。

先决条件

在深入研究代码之前,请确保您已具备以下内容。

Visual Studio 或任何 C# IDE

.NET Framework 或 .NET Core SDK

OpenXML SDK:您可以使用命令通过 NuGet 安装它。

Install-Package DocumentFormat.OpenXml

使用 OpenXML 读取大型 Excel 文件

以下是使用 C# 和 OpenXML 读取大型 Excel 文件的分步指南。

1. 设置项目

创建一个新的 C# 控制台应用程序。

打开 Visual Studio 并创建一个新的控制台应用程序(.NET Core 或 .NET Framework)。

通过 NuGet 安装 OpenXML SDK。

2.打开 Excel 文件

首先,您需要打开 Excel 文件并访问要读取的工作表。使用以下代码打开 Excel 文件。

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;

namespace ReadLargeExcelFile
{
    class Program
    {
        static void Main(string[] args)
        {
            string filePath = "path/to/your/large/excelfile.xlsx";
            using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, false))
            {
                WorkbookPart workbookPart = doc.WorkbookPart;
                Sheet sheet = workbookPart.Workbook.Sheets.GetFirstChild<Sheet>();
                WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);

                IEnumerable<Row> rows = worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>();

                foreach (Row row in rows)
                {
                    foreach (Cell cell in row.Elements<Cell>())
                    {
                        string cellValue = GetCellValue(doc, cell);
                        Console.Write(cellValue + " ");
                    }
                    Console.WriteLine();
                }
            }
        }

        private static string GetCellValue(SpreadsheetDocument doc, Cell cell)
        {
            SharedStringTablePart stringTablePart = doc.WorkbookPart.SharedStringTablePart;
            string value = cell.CellValue.InnerXml;

            if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
            {
                return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
            }
            else
            {
                return value;
            }
        }
    }
}

3. 高效处理大文件

上述代码将整个工作表读入内存,这对于非常大的文件来说可能效率不高。为了更有效地处理大文件,请考虑分块处理文件或使用流式传输技术。

4. 优化性能

为了优化性能,您可以

流式传输文件:使用流式传输技术分部分处理文件,而不是将整个文件加载到内存中。

并行处理:如果您的应用程序允许,您可以并行处理文件的不同部分。

高效的数据结构:使用高效的数据结构来存储和处理数据。

下面是一个使用流式传输的示例。

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections.Generic;

namespace ReadLargeExcelFile
{
    class Program
    {
        static void Main(string[] args)
        {
            string filePath = "path/to/your/large/excelfile.xlsx";
            using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, false))
            {
                WorkbookPart workbookPart = doc.WorkbookPart;
                Sheet sheet = workbookPart.Workbook.Sheets.GetFirstChild<Sheet>();
                WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);

                OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
                while (reader.Read())
                {
                    if (reader.ElementType == typeof(Row))
                    {
                        Row row = (Row)reader.LoadCurrentElement();
                        foreach (Cell cell in row.Elements<Cell>())
                        {
                            string cellValue = GetCellValue(doc, cell);
                            Console.Write(cellValue + " ");
                        }
                        Console.WriteLine();
                    }
                }
            }
        }

        private static string GetCellValue(SpreadsheetDocument doc, Cell cell)
        {
            SharedStringTablePart stringTablePart = doc.WorkbookPart.SharedStringTablePart;
            string value = cell.CellValue.InnerXml;

            if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
            {
                return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
            }
            else
            {
                return value;
            }
        }
    }
}

结论

使用 C# 和 OpenXML 读取大型 Excel 文件为需要高性能和可扩展性的应用程序提供了强大的解决方案。通过遵循本文概述的做法,您可以高效地处理存储在 Excel 文件中的大型数据集,从而使您的应用程序更高效、响应更快。OpenXML 无需安装 Office 即可操作 Office 文档,这使其成为任何开发人员工具包中的重要工具。

到此这篇关于使用C#和OpenXML读取大型Excel文件的文章就介绍到这了,更多相关C# OpenXML读取Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#网页跳转方法总结

    C#网页跳转方法总结

    这篇文章主要介绍了C#网页跳转方法总结的相关资料,需要的朋友可以参考下
    2015-12-12
  • C# 对MongoDB 进行增删改查的简单操作实例

    C# 对MongoDB 进行增删改查的简单操作实例

    这篇文章介绍了C# 对MongoDB 进行增删改查的简单操作实例,有需要的朋友可以参考一下
    2013-09-09
  • C#使用Ado.net读取Excel表的方法

    C#使用Ado.net读取Excel表的方法

    这篇文章主要介绍了C#使用Ado.net读取Excel表的方法,涉及C#使用OLEDB操作Excel的方法,需要的朋友可以参考下
    2015-04-04
  • c#唯一值渲染实例代码

    c#唯一值渲染实例代码

    这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
    2013-12-12
  • C#预处理器指令详解与示例

    C#预处理器指令详解与示例

    在软件开发中,我们常常需要编写可移植和可配置的代码,C# 预处理器指令为我们提供了这样的能力,在本篇文章中,我们将详细介绍C#预处理器指令的定义、语法格式、功能以及在实际编程中的应用,需要的朋友可以参考下
    2024-04-04
  • c# 通过WinAPI播放PCM声音

    c# 通过WinAPI播放PCM声音

    这篇文章主要介绍了c# 通过WinAPI播放PCM声音的方法,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下
    2020-12-12
  • C#中使用反射遍历一个对象属性及值的小技巧

    C#中使用反射遍历一个对象属性及值的小技巧

    这篇文章主要介绍了C#中使用反射遍历一个对象属性及值的小技巧,这在很时候应该都非常有用,本文直接给出实例代码,需要的朋友可以参考下
    2015-07-07
  • .net实现序列化与反序列化实例解析

    .net实现序列化与反序列化实例解析

    这篇文章主要介绍了.net实现序列化与反序列化实例解析,需要的朋友可以参考下
    2014-08-08
  • C#开发中常用的加密解密方法汇总

    C#开发中常用的加密解密方法汇总

    这篇文章主要介绍了C#开发中常用的加密解密方法汇总,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-11-11
  • C# SQLite库使用技巧

    C# SQLite库使用技巧

    SQLite是一个开源、免费的小型RDBMS(关系型数据库),能独立运行、无服务器、零配置、支持事物,用C实现,内存占用较小,支持绝大数的SQL92标准。下面跟随小编一起看下C# SQLite库使用
    2022-01-01

最新评论