本文來告訴大家如何決議讀取在 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 =https://www.cnblogs.com/lindexi/p/= 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://www.uj5u.com/net/294813.html
標籤:.NET Core
上一篇:設計模式之配接器
