当前位置: 首页 > news >正文

使用 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. 高效处理大文件

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

. 优化性能

为了优化性能,您可以

  • 流式传输文件:使用流式传输技术分部分处理文件,而不是将整个文件加载到内存中。
  • 并行处理:如果您的应用程序允许,您可以并行处理文件的不同部分。
  • 高效的数据结构:使用高效的数据结构来存储和处理数据。

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

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 文档,这使其成为任何开发人员工具包中的重要工具。

http://www.lryc.cn/news/390400.html

相关文章:

  • 【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点
  • 重采样(上采样或下采样)是什么?
  • AI与Python共舞:如何利用深度学习优化推荐系统?(2)
  • ChatGPT:Java中的对象引用实现方式
  • 云渗透实战手册:云API攻防之云服务端点侦查
  • PHP 爬虫之使用 Curl库抓取淘宝商品列表数据网页的方法
  • Python基础小知识问答系列-可迭代型变量赋值
  • 主流 Canvas 库对比:Fabric.js、Konva.js 和 Pixi.js
  • backbone是什么?
  • 四十篇:内存巨擘对决:Redis与Memcached的深度剖析与多维对比
  • HTML5的多线程技术:Web Worker API
  • Java | Leetcode Java题解之第206题反转链表
  • 660错题
  • GAMES104:04游戏引擎中的渲染系统1:游戏渲染基础-学习笔记
  • Visual Studio 中的键盘快捷方式
  • K8S中的某个容器突然出现内存和CPU占用过高的情况解决办法
  • Pointnet++改进即插即用系列:全网首发GLSA聚合和表示全局和局部空间特征|即插即用,提升特征提取模块性能
  • 如何选择适合自己的虚拟化技术?
  • Spring动态代理详解
  • Java微服务架构中的消息总线设计
  • 51单片机项目-点亮第一个LED灯(涉及:进制转换表、创建项目、生成HEX文件、下载程序到单片机、二极管区分正负极)
  • 安全管理中心测评项
  • word 转pdf 中图片不被压缩的方法
  • Springboot+Vue3开发学习笔记《1》
  • grpc编译
  • echarts-wordcloud:打造个性化词云库
  • VMware虚拟机安装CentOS7.9 Oracle 11.2.0.4 RAC+单节点RAC ADG
  • iOS 视图实现渐变色背景
  • hive命令和参数
  • 『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?