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

相关文章:

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

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

【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点

我们现在继续对于群体遗传学进行统计建模&#xff0c;书接上回&#xff0c;我们讨论了孤雌生殖的物种违反哈代温伯格遗传比例的例子&#xff0c;那我们现在来看多于两个等位基因的情况的计算。 如果没有看过之前文章的同学&#xff0c;可以先去看一下之前的文章&#xff1a; …...

重采样(上采样或下采样)是什么?

重采样&#xff08;Resampling&#xff09;是在数据处理中常用的一种技术&#xff0c;主要用于处理数据集中的不平衡问题。具体来说&#xff0c;重采样可以分为上采样&#xff08;Oversampling&#xff09;和下采样&#xff08;Undersampling&#xff09;&#xff0c;它们分别是…...

AI与Python共舞:如何利用深度学习优化推荐系统?(2)

推荐系统的前世今生 推荐系统的历史可以追溯到20世纪90年代&#xff0c;从最初的基于内容过滤和协同过滤&#xff0c;到现在融合了机器学习甚至是深度学习的混合型推荐&#xff0c;其目标始终如一&#xff1a;更精准、更个性化地为用户推荐内容。随着Python的普及&#xff0c;…...

ChatGPT:Java中的对象引用实现方式

ChatGPT&#xff1a;Java中的对象引用实现方式 如果使用句柄的话&#xff0c;那么 Java 堆中将会划分出一块内存来作为句柄池&#xff0c;reference 中存储的就是对象的句柄地址&#xff0c;而句柄中包含了对象实例数据与对象类型数据各自的具体地址信息。 你提到的句柄机制是…...

云渗透实战手册:云API攻防之云服务端点侦查

在云计算环境中的渗透&#xff0c;与传统渗透相比&#xff0c;新增加了许多新的攻击面&#xff0c;同时也因为云计算的特点我们需要转变渗透的思维&#xff0c;用云计算的方式去思考云渗透。 基础知识 在云渗透开始之前&#xff0c;我们需要首先阐述标题中提到的云服务端点概…...

PHP 爬虫之使用 Curl库抓取淘宝商品列表数据网页的方法

使用 PHP 的 cURL 库来抓取淘宝商品列表数据网页需要谨慎&#xff0c;因为淘宝等电商平台通常会有反爬虫机制&#xff0c;以防止数据被滥用。然而&#xff0c;如果你只是出于学习目的&#xff0c;并且了解并遵守了淘宝的robots.txt文件和相关的使用条款&#xff0c;你可以尝试使…...

Python基础小知识问答系列-可迭代型变量赋值

1. 问题&#xff1a; 怎样简洁的把列表中的元素赋值给单个变量&#xff1f; 当需要列表中指定几个值时&#xff0c;剩余的变量都收集在一起&#xff0c;该怎么进行变量赋值&#xff1f; 当只需要列表中指定某几个值&#xff0c;其他值都忽略时&#xff0c;该怎么…...

主流 Canvas 库对比:Fabric.js、Konva.js 和 Pixi.js

在前端开发中&#xff0c;HTML5 Canvas 是一个强大的工具&#xff0c;可以用来创建图形、动画和各种视觉效果。为了简化和增强 Canvas 的使用&#xff0c;社区中出现了许多库。本文将对比三种主流的 Canvas 库&#xff1a;Fabric.js、Konva.js 和 Pixi.js&#xff0c;分析它们的…...

backbone是什么?

在深度学习中&#xff0c;特别是计算机视觉领域&#xff0c;"backbone"&#xff08;骨干网络&#xff09;是指用于提取特征的基础网络。它通常是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;其任务是从输入图像中提取高层次特征&#xff0c;这些特征然后被用…...

四十篇:内存巨擘对决:Redis与Memcached的深度剖析与多维对比

内存巨擘对决&#xff1a;Redis与Memcached的深度剖析与多维对比 1. 引言 在现代的系统架构中&#xff0c;内存数据库已经成为了信息处理的核心技术之一。这类数据库系统的高效性主要来源于其对数据的即时访问能力&#xff0c;这是因为数据直接存储在RAM中&#xff0c;而非传统…...

HTML5的多线程技术:Web Worker API

Web Workers API 是HTML5的一项技术&#xff0c;它允许在浏览器后台独立于主线程运行脚本&#xff0c;即允许进行多线程处理。这对于执行密集型计算任务特别有用&#xff0c;因为它可以防止这些任务阻塞用户界面&#xff0c;从而保持网页的响应性和交互性。Web Workers在自己的…...

Java | Leetcode Java题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead reverseList(head.next);head.next.next head;head.next null;return newHead;} }...

660错题

不能局部求导,局部洛必达...

GAMES104:04游戏引擎中的渲染系统1:游戏渲染基础-学习笔记

文章目录 概览&#xff1a;游戏引擎中的渲染系统四个课时概览 一&#xff0c;渲染管线流程二&#xff0c;了解GPUSIMD 和 SIMTGPU 架构CPU到GPU的数据传输GPU性能限制 三&#xff0c;可见性Renderable可渲染对象提高渲染效率Visibility Culling 可见性裁剪 四&#xff0c;纹理压…...

Visual Studio 中的键盘快捷方式

1. Visual Studio 中的键盘快捷方式 1.1. 可打印快捷方式备忘单 1.2. Visual Studio 的常用键盘快捷方式 本部分中的所有快捷方式都将全局应用&#xff08;除非另有指定&#xff09;。 “全局”上下文表示该快捷方式适用于 Visual Studio 中的任何工具窗口。 生成&#xff1…...

K8S中的某个容器突然出现内存和CPU占用过高的情况解决办法

当K8S中的某个容器突然出现内存和CPU占用过高的情况时&#xff0c;可以采取以下步骤进行处理&#xff1a; 观察和分析&#xff1a; 使用kubectl top pods命令查看集群中各个Pod的CPU和内存占用情况&#xff0c;找出占用资源高的Pod。使用kubectl describe pod <pod-name>…...

Pointnet++改进即插即用系列:全网首发GLSA聚合和表示全局和局部空间特征|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入GLSA,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理论介…...

如何选择适合自己的虚拟化技术?

虚拟化技术已成为现代数据中心和云计算环境的核心组成部分。本文将帮助您了解如何选择适合自己需求的虚拟化技术&#xff0c;以实现更高的效率、资源利用率和灵活性。 理解虚拟化技术 首先&#xff0c;让我们了解虚拟化技术的基本概念。虚拟化允许将一个物理服务器划分为多个虚…...

Spring动态代理详解

一&#xff0c;动态代理 我发现Spring框架中的动态代理是一种非常强大的机制&#xff0c;它可以在运行时为接口或类创建动态代理&#xff0c;然后通过这些代理在方法调用前后添加额外的行为。在后续Spring的AOP&#xff08;面向切面编程&#xff09;支持中扮演了关键角色。 二…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...