dotnet OpenXML 文本删除线解析方法

article/2025/10/25 4:13:25

本文来告诉大家如何解析读取在 OpenXML 里面存放的文本删除线,本文使用 PowerPoint 作为例子来告诉大家如何读取然后在 WPF 应用里面显示

在开始之前,期望大家已了解如何在 dotnet 应用里面读取 PPT 文件,如果还不了解读取方法,请参阅 C# dotnet 使用 OpenXml 解析 PPT 文件

期望在阅读本文之前,先阅读 dotnet OpenXML 简单聊聊 PPT 文本解析

以下是本文效果

在 OpenXML 文档,将文本的删除线放在了文本的 Run 属性里面,大概内容如下

            <a:r><a:rPr lang="en-US" altLang="zh-CN" strike="sngStrike" dirty="0" smtClean="0" /><a:t>123123</a:t></a:r>

以上代码的 strike 表示的就是删除线的内容。和 WPF 的设计不同的是,在 WPF 里面,无论是下划线还是删除线等,都是属于文本装饰。但是在 PPT 里面,下划线是下划线,而删除线是删除线。同时下划线和删除线的样式也是特别多的

如删除线的 TextStrikeValues 的枚举,在 ECMA 376 的第 20.1.10.78 章可以了解到有单线条的删除线和双线条的删除线,在 OpenXML 里面的枚举如下

  /// <summary>/// Text Strike Type/// </summary>public enum TextStrikeValues{/// <summary>/// Text Strike Enum ( No Strike )./// <para>When the item is serialized out as xml, its value is "noStrike".</para>/// </summary>[EnumString("noStrike")]NoStrike,/// <summary>/// Text Strike Enum ( Single Strike )./// <para>When the item is serialized out as xml, its value is "sngStrike".</para>/// </summary>[EnumString("sngStrike")]SingleStrike,/// <summary>/// Text Strike Enum ( Double Strike )./// <para>When the item is serialized out as xml, its value is "dblStrike".</para>/// </summary>[EnumString("dblStrike")]DoubleStrike,}

下面开始在一个空 WPF 项目里面尝试去读取一个包含删除线文本的 PPT 文件,然后将文本在界面渲染

在开始之前,先读取 PPT 文件,代码如下

            var file = new FileInfo("Test.pptx");using var presentationDocument =DocumentFormat.OpenXml.Packaging.PresentationDocument.Open(file.FullName, false);

拿到第一个页面

            var slide = presentationDocument.PresentationPart.SlideParts.First().Slide;

接着获取文本元素的坐标

            var shape = slide.CommonSlideData.ShapeTree.GetFirstChild<Shape>();// 获取坐标var offset = shape.ShapeProperties.Transform2D.Offset;var x = new Emu(offset.X);var y = new Emu(offset.Y);

以上的 EMU 是通过 dotnetCampus.OpenXMLUnitConverter 开源仓库提供的,详细请看 Office Open XML 的测量单位

获取文本元素的文本内容,文本内容需要先读取段落,接着再获取文本属性和文本

            // 读取文本内容var textBody = shape.TextBody;// 读取段落var paragraph = textBody.GetFirstChild<Paragraph>();// 读取段落的文本var run = paragraph.GetFirstChild<Run>();// 读取删除线var strike = run.RunProperties.Strike;

转换为 WPF 的元素,代码如下

            // 创建元素var textBlock = new TextBlock(){TextDecorations = strike.Value == TextStrikeValues.NoStrike? new TextDecorationCollection():TextDecorations.Strikethrough,Text = run.Text.Text,Margin = new Thickness(){Left = x.ToPixel().Value,Top = y.ToPixel().Value,}};Canvas.Children.Add(textBlock);

以上代码的 Canvas 是放在 XAML 的控件,本文所有代码放在github 和 gitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin c7d8eb1b879f3e5ba418f8efba290081cd6263ae

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 Pptx 文件夹

如果要支持双删除线,可以使用如下代码

            var textBlock = new TextBlock(){TextDecorations = strike.Value switch{TextStrikeValues.NoStrike => new TextDecorationCollection(),TextStrikeValues.SingleStrike => TextDecorations.Strikethrough,TextStrikeValues.DoubleStrike => new TextDecorationCollection(){new TextDecoration(TextDecorationLocation.Strikethrough,new Pen(Brushes.Black,1), -1, TextDecorationUnit.Pixel, TextDecorationUnit.Pixel),new TextDecoration(TextDecorationLocation.Strikethrough,new Pen(Brushes.Black,1), 1, TextDecorationUnit.Pixel, TextDecorationUnit.Pixel)},_ => throw new ArgumentException()},Text = run.Text.Text,Margin = new Thickness(){Left = x.ToPixel().Value,Top = y.ToPixel().Value,}};

效果如下

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

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

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

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

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


http://chatgpt.dhexx.cn/article/5flUmmwD.shtml

相关文章

java openxml 操作 word,openxml word转成xml

word2007无法打开Office Open XML 文档 由于种种原因&#xff0c;如程序安装错误、注册表被修改&#xff0c;或系统被病毒侵害等。 有时候会造成WORD 2007无法打开.DOC文档的问题&#xff0c;常规的处理办法(右键选择“打开方式”)无效。 可以试试如下的方法 &#xff1a;1.打开…

java openxml word_C#采用OpenXml实现给word文档添加文字

本文实例讲述了C#采用OpenXml实现给word文档添加文字的方法&#xff0c;分享给大家供大家参考。具体方法如下&#xff1a; 一般来说&#xff0c;使用OpenXml给word文档添加文字&#xff0c;每个模块都有自己对于的属性以及内容&#xff0c;要设置样式就先声明属性对象&#xff…

vsto c# openxml操作excel

word ppt excel 后缀加rar 都可以解压看到资源文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using Syst…

java openxml word_OpenXml读取word内容的实例

OpenXml读取word内容注意事项 1、使用OpenXml读取word内容&#xff0c;word后缀必须是".docx"&#xff1b;如果word后缀是".doc"需要转成".docx"后&#xff0c;才可以读取&#xff1b; 2、需要引入相关dll&#xff1b;"WindowsBase.dll&quo…

C# + OpenXML 生成 Word 文档(VS2015)

本文是 Open XML SDK 的入门文章&#xff0c;将逐步讲解如何生成一个下面这样的 Word 文档&#xff1a; 有关 Open XML SDK 的详细内容&#xff0c;请参阅这个链接&#xff1a;欢迎使用 Open XML SDK 2.5 for Office 创建示例程序 启动 Visual Studio 2015&#xff0c;新建一…

c# openxml Excel部分学习之路

c# openxml Excel部分学习之路 Openxml学习工具 Openxml学习工具 Open XML SDK 2.5 Productivity Tool&#xff0c;使用本工具可以对比原文档和进行更改后的文档发生的变化&#xff0c;便于我们能够理解我们对文档所作的操作带来了什么改变。 比如我们新建了两个Excel文件在新…

mysql openxml_OpenXML SDK2.0初窥

让我们直奔主题吧! 下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyIdC6E744E5-36E9-45F5-8D8C-331DF206E0D0 官方论坛:http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/threads 其它资源:http://msdn.microsoft.com/en-us/librar 让我们直奔主题吧…

dotnet OpenXML PPT 动画框架入门

本文将从 OpenXML 方面聊 PPT 的动画框架&#xff0c;本文是属于编程方面而不是 PPT 动画制作教程 开始之前&#xff0c;还请掌握一些基础知识&#xff0c;如阅读以下博客 C# dotnet 使用 OpenXml 解析 PPT 文件Office 文档解析 文档格式和协议dotnet OpenXML 解析 PPT 页面元…

java openxml word_【转】【OpenXml】OpenXml操作Word的一些操作总结

OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势: 1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩溃的问题. 2.对比填满一张30多页的WORD来说(包含图,表等),用COM组件来生成会占用20秒,Openxml1秒. 3.MS Word软件太贵了,你的客户装的是开源WOR…

java openxml 操作 word_OpenXML操作word

OpenXML概述 项目中经常需要操作word,之前的方式是采用COM接口,这个接口很不稳定,经常报错。现在开始采用OpenXML。OpenXML(OOXML)是微软在Office 2007中提出的一种新的文档格式,Office 2007中的Word、Excel、PowerPoint默认均采用OpenXML格式 。 OpenXml相对于用MS提供的C…

openXMl

openXMl注意点 一、基础标签 w:pStyle 定义样式ID w:keepNext &#xff1a;段落是否在一个页面上 w:keepLines &#xff1a;此元素指定在页面视图中呈现该文档时&#xff0c;尽可能将该段落的所有行维护在单个页面上 w:widowControl &#xff1a;这个元素指定消费者是否应该通…

OpenXML库(office文档读写库)的安装

本体安装 OpenXml库是由微软维护的一个开源的Office文档读写库&#xff0c;其与其他类似用途的库的比较可以看到这篇文章。 在C#中使用OpenXml非常简单&#xff0c;只需要使用NuGet安装其程序包即可&#xff0c;流程如下(NuGet这东西真的是个神器啊&#xff01;)&#xff1a;…

java e.getmessage() null_Java e.getMessage 错误信息为null

解决方案&#xff1a;用e.printStackTrace() e.getMessage()为null也很正常&#xff0c;NullPointException的getMessage()就为null 我在抛出Exception时也可以直接 throw new MyException(); 这样getMessage()返回的就是null了 这几天做的项目&#xff0c;测试小组说测出来的…

java中getmessage函数_PeekMessage、GetMessage的区别

在Windows编程中经常使用这两个函数来处理消息&#xff0c;它们之间的区别就是GetMessage是阻塞的&#xff0c;PeekMessage是非阻塞的。 GetMessage原型如下&#xff1a;BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); PeekMessage原型如下&a…

java e.getmessage() null,Java 求助! 为什么我拿不到错误信息,e.getMessage()

Java 求助! 为什么我拿不到错误信息,e.getMessage() Java 求助! 为什么我拿不到错误信息,e.getMessage() 我明明打印了错误信息的啊? e.getMessage() 是空,为什么? 一声声带着惊讶,带着恐慌,带着质疑,带着无奈的话语,从某个角落里传出。 议论纷纷...... 似乎拿不到异…

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别常见的几种异常

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别 一、概述 在java异常体系中&#xff0c;要打印异常信息&#xff0c;可以通过&#xff1a;e.getMessage() 、 e.toString() e.printStackTrace() 等方法打印出 一些 异常信息。已知的是这些方法都可以打…

GetMessage以及消息循环说明

GetMessage以及消息循环说明 在创建窗口、显示窗口、更新窗口后&#xff0c;我们需要编写一个消息循环&#xff0c;不断地从消息队列中取出消息&#xff0c;并进行响应。要从消息队列中取出消息&#xff0c;我们需要调用GetMessage()函数&#xff0c;该函数的原型声明如下&…

redis使用配置文件的方式启动

文章目录 为什么用配置文件启动呢使用配置文件启动1.创建配置文件2.修改配置文件里面的参数3.以配置文件的方式启动4.查看日志文件 为什么用配置文件启动呢 因为在企业项目中不会只有单个redis实例&#xff0c;每个redis的config配置都可以能不一样&#xff0c;所以这个时候就需…

.NET Core使用Redis

环境Windows 首先安装Redis 1、下载最新版redis&#xff0c;选择.zip则是免安装的版本 下载地址&#xff1a;https://github.com/MicrosoftArchive/redis/releases 2、解压到指定目录&#xff0c;并运行cmd命令 3、在该文件夹下运行命令&#xff1a;redis-server.exe redis.…

flask使用redis

文章目录 前言一、环境二、使用步骤1.安装redis1.下载2.运行 2.安装并使用redis包1.安装2.使用 运行 前言 有人会有疑问&#xff0c;不是已经连上了mysql数据库了吗&#xff0c;为什么还要用redis数据库?有时候用户访问网页的时候&#xff0c;会产生一些临时性的数据&#xf…