C#使用OpenXml读取Word、PPT、Excel文档内容

DocumentFormat.OpenXml是微软官方推出的一个操作Excel、Word、PPT文件的开源组件,因此它是免费的。以下是一些关于DocumentFormat.OpenXml的详细信息:

  1. 开源性质:DocumentFormat.OpenXml是一个开源项目,这意味着其源代码是公开的,并且允许开发者自由地使用、修改和分发。
  2. 功能:DocumentFormat.OpenXml提供了对Excel、Word、PPT等Office文档的底层操作能力,允许开发者以编程的方式对这些文档进行创建、编辑和修改。
  3. 版本:DocumentFormat.OpenXml有多个版本,其中最新的稳定版本是3.0.2。
  4. 性能与特点:虽然DocumentFormat.OpenXml提供了底层的操作能力,但使用它可能会比较复杂,因为它涉及到更多的底层细节和顺序限制。此外,由于其底层操作的特性,它并不总是能提供最高的性能。然而,对于那些需要精确控制文档结构和格式的开发者来说,DocumentFormat.OpenXml可能是一个不错的选择。

下面只做简单的对这几种格式的文件读取显示

使用NuGet搜索添加引用

DocumentFormat.OpenXml

运行调试代码(ppt或者word改下类名)

List<string> list = MyExcelByOpenXml.Read(@"E:\资料\文档\xxx.xlsx");
if (list != null)
{for (int i = 0; i < list.Count; i++)Console.WriteLine(list[i]);
}

读取Excel

using System;
using System.Collections.Generic;
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;public class MyExcelByOpenXml
{public static List<string> Read(string filePath){List<string> list = new List<string>();using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false)){// 获取工作表集合WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;Sheets sheets = workbookPart.Workbook.Descendants<Sheets>().FirstOrDefault();foreach (Sheet sheet in sheets.Elements<Sheet>()){// 获取工作表内容WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);// 获取工作表中的单元格var cells = worksheetPart.Worksheet.Descendants<Cell>();foreach (var cell in cells){// 获取单元格的值string cellValue = GetCellValue(cell, workbookPart);if (cellValue != null && cellValue != "")list.Add(cellValue);Console.WriteLine(cellValue);}}}return list;}private static string GetCellValue(Cell cell, WorkbookPart workbookPart){string value = string.Empty;if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString){int sharedStringIndex = int.Parse(cell.InnerText);value = workbookPart.SharedStringTablePart.SharedStringTable.ChildElements[sharedStringIndex].InnerText;}else if (cell.CellValue != null){value = cell.CellValue.Text;}return value;}
}

读取Word

using System;
using System.Collections.Generic;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;class MyWord
{// 读取所有内容,以段落分割public static List<string> Read(string fileName){try{List<string> list = new List<string>();// 打开现有的Word文档using (WordprocessingDocument doc = WordprocessingDocument.Open(fileName, false)){// 获取文档的主体部分Body body = doc.MainDocumentPart.Document.Body;// 遍历所有段落并输出文本foreach (Paragraph para in body.Elements<Paragraph>()){if (para.InnerText != null || para.InnerText != ""){list.Add(para.InnerText);Console.WriteLine(para.InnerText);}}}return list;}catch (Exception ex){Console.WriteLine("读取Word失败:" + ex.Message);return null;}}
}

读取PPT

using System;
using System.Collections.Generic;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;class MyPPT
{// 读取所有内容,以段落分割public static List<string> Read(string fileName){try{List<string> list = new List<string>();// 打开现有的ppt文档using (PresentationDocument ppt = PresentationDocument.Open(fileName, false)){// 获取文档的主体部分foreach (SlideId slideId in ppt.PresentationPart.Presentation.SlideIdList.Elements<SlideId>()){// 获取幻灯片内容SlidePart slidePart = (SlidePart)ppt.PresentationPart.GetPartById(slideId.RelationshipId);// 获取幻灯片中的文本框var textBoxes = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Drawing.Text>();foreach (var textBox in textBoxes){Console.WriteLine(textBox.Text);list.Add(textBox.Text);}}}return list;}catch (Exception ex){Console.WriteLine("读取Word失败:" + ex.Message);return null;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript内置方法 操作数组和字符串

在JavaScript中&#xff0c;数组和字符串是非常常见的数据类型&#xff0c;它们各自有一套强大的内置方法。以下是一些常用的数组和字符串方法&#xff0c;以及它们的实例和注意事项&#xff1a; 数组操作方法&#xff1a; 1. push() / pop() push()&#xff1a;向数组的末尾…

禁用PS/Photoshop等一系列Adobe旗下软件联网外传用户数据操作

方案一&#xff1a; 下载火绒杀毒&#xff0c;在联网请求上禁用Adobe软件的联网请求&#xff0c;甚至还可以额外发现哪些是它要想要偷偷摸摸干的。 方案二&#xff1a; 最后注意&#xff1a; 用盗版软件只是获得了使用权&#xff01;

Docker系列.Docker Desktop中如何启用Kubernetes

Docker技术概论 Docker Desktop中如何启用Kubernetes - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.…

Linux编辑器 vim使用 (解决普通用户无法进行sudo提权问题)

文章目录 一.vim是什么命令模式底行模式 二.关于vim暂停问题三.注释批量化注释批量化去注释 四.解决普通用户无法进行sudo提权问题五.vim的配置 一.vim是什么 用过VS的都知道&#xff0c;拥有着编辑器编译器调试.编写C&#xff0c;C&#xff0c;python等的功能。就是集成 Linu…

骤旱(Flash drought)相关小结

1. 简介 2. 数据集 3. 识别算法 待更新

1606 - 求一个两位数倒序的结果

问题描述 请输出一个两位的整数 n&#xff0c;倒过来的数&#xff0c;也就是输出这个两位数个位和十位颠倒的结果。 比如&#xff1a;整数 23 倒过来是 32&#xff0c;整数 18 倒过来是 81 &#xff0c;整数 20 倒过来是 2。 输入 两位整数 n。 输出 n 倒过来的整数。 样…

LeetCode | 434.字符串中的单词数

这道题直接使用语言内置的 split 函数可直接分离出字符串中的每个单词&#xff0c;但是要注意区分两种情况&#xff1a;1、空串&#xff1b;2、多个空格连续&#xff0c;分割后会出现空字符的情况&#xff0c;应该舍弃 class Solution(object):def countSegments(self, s):&qu…

java算法:选择排序

文章标题 概述与基本实现优缺点尝试优化 概述与基本实现 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的基本思想是每次从待排序的元素中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;放置在已排序的部分的末尾&#xff0c;直到…

JAVA系列---函数式接口

函数式接口的定义 一个函数式接口有且仅有一个抽象方法(SAM&#xff0c;single abstract method)。对于接口来说抽象方法必须重写&#xff0c;默认方法可选重新&#xff0c;静态方法不可重新。Object 类中的 public abstract method 不会被视为单一的抽象方法。这些方法对于函…

java技术专家面试指南100问【java学习+面试宝典】(四)

如何避免“伪共享”&#xff1f; 字节填充&#xff08;创建变量时&#xff0c;使用字段对其进行填充&#xff0c;避免多个变量被分派到同一个缓存行里&#xff09;。JDK8提供了一个Contended注解来解决伪共享。 Netty 的应用场景了解么&#xff1f; Netty 主要用来做网络通信…

数据结构学习笔记-树

1.树的存储结构 &#xff08;1&#xff09;双亲表示法 顺序存储结点数据&#xff0c;结点中保存父节点在数组中的下标。 优点&#xff1a;找父节点方便&#xff1b;缺点&#xff1a;找孩子不方便 #define MAX_TREE_SIZE 100 //树中最多结点数 typedef struct{ //树的…

微信小程序点击打开关联企业微信客服

wx.openCustomerServiceChat({extInfo: {url: https://work.weixin.qq.com/kfid/kfc****},corpId: *****,})

磁盘性能概述与磁盘调度算法

目录 1. 磁盘性能概述 1. 数据传输速率 2. 寻道时间 3. 旋转延迟 4. 平均访问时间 2. 早期的磁盘调度算法 1. FIFO&#xff08;First-In-First-Out&#xff09;调度算法 2. SSTF&#xff08;Shortest Seek Time First&#xff09;调度算法 3. SCAN&#xff08;Elevator…

Dubbo3 服务原生支持 http 访问,兼具高性能与易用性

作者&#xff1a;刘军 作为一款 rpc 框架&#xff0c;Dubbo 的优势是后端服务的高性能的通信、面向接口的易用性&#xff0c;而它带来的弊端则是 rpc 接口的测试与前端流量接入成本较高&#xff0c;我们需要专门的工具或协议转换才能实现后端服务调用。这个现状在 Dubbo3 中得…

SVN 报错Error: Unable to connect to a repository at URL解决方法

1. 报错背景&#xff1a; 使用ssh 用svn拉取仓库代码时&#xff0c;出现如下报错&#xff1a; Can’t create session: Unable to connect to a repository at URL svn://127.0.0.1 …. Can’t connect to host ‘127.0.0.1’: Connection refused at C:/Program Files/Git/mi…

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分&#xff0c;不仅可以方便地连接手机&#xff0c;还能轻松连接电脑&#xff0c;让我们在工作和娱乐时享受无线的自由。然而&#xff0c;对于一些用户来说&#xff0c;将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…

从大型语言模型到大脑语言理解:探索话语理解的神经机制

随着科技的飞速发展&#xff0c;人工智能领域取得了令人瞩目的成就。在这其中&#xff0c;大型语言模型&#xff08;LLMs&#xff09;以其卓越的性能和广泛的应用前景&#xff0c;成为了当前研究的热点。然而&#xff0c;尽管LLMs在文本生成、语言翻译等领域展现出了惊人的能力…

镭速如何做到数据同步文件及文件夹的ACL属性?

数据文件同步时&#xff0c;除了要同步文件的内容&#xff0c;还要对文件的属性做同步。权限属性作为一个重要的文件属性&#xff0c;是属性同步的重中之重&#xff0c;控制着不同用户与用户组对文件和文件夹的访问权限。不同的操作系统有着自己不同的权限控制机制&#xff0c;…

2786. 访问数组中的位置使分数最大 Medium

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。 你 一开始 在数组的位置 0 处&#xff0c;你可以按照下述规则访问数组中的其他位置&#xff1a; 如果你当前在位置 i &#xff0c;那么你可以移动到满足 i < j 的 任意 位置 j 。 对于你访问的位置 i &#xff0c;…

C++ C_style string overview and basic Input funcitons

write in advance 最近在做题&#xff0c;遇到一个简单的将console的输入输出到文件中的简单题目&#xff0c;没有写出来。悔恨当初没有踏实地总结string 相关的 I/O 以及与文件的操作。这篇文章旨在记录基础的字符I/O, 简单常用的文件I/O操作函数。 当然&#xff0c;你会说C…