C# dotnet WPF 使用 OpenXml 解析 Excel 文件

2023-10-28 10:30

本文主要是介绍C# dotnet WPF 使用 OpenXml 解析 Excel 文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 2013 微软开源了 OpenXml 解析库,在微软的 Excel 文档,使用的文档格式就是国际规范的 OpenXml 格式。这个格式有很多版本,详细请看百度。因为表格文稿使用的是 OpenXml 在 .NET 开发可以非常简单将 Excel 文档进行解析,大概只需要两句话

本文通过一个简单的 WPF 程序告诉大家如何解析,这个简单的 WPF 程序简单到仅有一个按钮,在点击按钮时自动解析 Excel 文档的内容

用 OpenXML 能做什么?其实可以做的东西很多,例如在 WPF 或 UWP 或 Xamarin 等里面使用 OpenXML 解析读取 Excel 文件内容,读取 PPT 和 Word 等文档的内容,只要符合 OpenXML 格式就能进行读取

通过 NuGet 安装 Openxml 库,这个库支持跨平台,因为只是解析数据

然后在按钮点击的代码里面添加下面代码解析

using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, false)){}
}

大概这样就解析完成了,上面代码的 fileName 就是传入的文件,如下面代码

string fileName = @"f:\lindexi\FurlalloganarBerkojelfarwiwa.xlsx";

在 Excel 里面有多个标签,下面代码是获取第一个标签

WorkbookPart workbookPart = doc.WorkbookPart;
SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
SharedStringTable sst = sstpart.SharedStringTable;WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
Worksheet sheet = worksheetPart.Worksheet;

如果读取格子里面内容,可以使用下面代码

var cells = sheet.Descendants<Cell>();
var rows = sheet.Descendants<Row>();Debug.WriteLine("Row count = {0}", rows.LongCount());
Debug.WriteLine("Cell count = {0}", cells.LongCount());// One way: go through each cell in the sheet
foreach (Cell cell in cells)
{if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString)){int ssid = int.Parse(cell.CellValue.Text);string str = sst.ChildElements[ssid].InnerText;Debug.WriteLine("Shared string {0}: {1}", ssid, str);}else if (cell.CellValue != null){Debug.WriteLine("Cell contents: {0}", cell.CellValue.Text);}
}// Or... via each row
foreach (Row row in rows)
{foreach (Cell c in row.Elements<Cell>()){if ((c.DataType != null) && (c.DataType == CellValues.SharedString)){int ssid = int.Parse(c.CellValue.Text);string str = sst.ChildElements[ssid].InnerText;Debug.WriteLine("Shared string {0}: {1}", ssid, str);}else if (c.CellValue != null){Debug.WriteLine("Cell contents: {0}", c.CellValue.Text);}}
}

如果想要了解解析的每个对象的内容,我推荐在对应的代码添加断点,如想要了解 row 的值等,可以如下图添加一个断点,然后通过局部变量窗口就可以看到每个变量的值

代码放在 github 欢迎小伙伴访问

如何添加断点请看 VisualStudio 断点调试详解

除了使用 OpenXML SDK 这个免费的库之外,还可以使用 EPPlus 这个收费或 LGPL 的库

更多请看 Office 使用 OpenXML SDK 解析文档博客目录

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。


http://www.taodudu.cc/news/show-8076195.html

相关文章:

  • 03.web静态页面学习,以百度为例
  • python有什么好玩的库_Python 社区里有趣且实用的库有哪些?
  • 2.wifi开发,SDK目录结构研究,SDK的API,如何生成可烧录代码,Freertos在esp8266使用,实验:wifi打印/点灯,实验:wifi入网/自建网,补充:查找已连接wifi密码
  • Vue基础学习以及Vue指令介绍
  • php 如何写入、读取word,excel文档
  • poi操作word文档,以07版本为参考,将word文档中图片替换为文本(替换文本也一样),读图片可选文字内容
  • Android如何通过代码方式打开微博 微信等应用.
  • 51CTO微博开通、使用须知
  • 测一测程序员的知识广度?
  • 程序员必考卷(文史综合卷)
  • 程序员的文史综合题你能做几题
  • 从鲁迅大撤退谈起中国文化
  • 1.3 运算符和表达式
  • day03——运算符与三码
  • 【Java基础】Java的运算符——21天学习计划打卡第四天
  • 【Java基础】运算符
  • day03-java基础-运算符
  • day03-Java运算符和表达式
  • 03-运算符
  • 【十二天学java】day03java基础语法
  • springBoot中常用接口的分析
  • 网易2016研发工程师编程题-----炮台攻击
  • 算法刷题
  • 赛码网练习——黑默丁格的炮台
  • 我们总在危难中发现珍贵与唾弃
  • 如此病毒营销,必将导致唾弃!
  • 少年碎碎念:《我要亮》
  • 苹果剔除中国供应链企业被市场唾弃,iPad的出货量暴跌三成
  • 你、我和世界
  • 我赢职场告诉你为什么凤姐会逆袭成励志姐?
  • 这篇关于C# dotnet WPF 使用 OpenXml 解析 Excel 文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/292586

    相关文章

    nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

    《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

    C#连接SQL server数据库命令的基本步骤

    《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

    MyBatis中$与#的区别解析

    《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

    使用Python删除Excel中的行列和单元格示例详解

    《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

    深入理解Go语言中二维切片的使用

    《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

    prometheus如何使用pushgateway监控网路丢包

    《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

    Python通用唯一标识符模块uuid使用案例详解

    《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

    SpringBoot中如何使用Assert进行断言校验

    《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

    Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

    《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

    java使用protobuf-maven-plugin的插件编译proto文件详解

    《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件