セル内の「取り消し線で消された文字列」の削除を簡単にしてみた

2021年2月24日

どもです。
前回、C#/OpenXmlを用いて、エクセルのセル内の文字列から「打消し線で消されていない文字列のみを取得する方法」について書きました。
このエントリでは、xlsx形式のエクセルの内容、構成を解説することも目的としていました。
そのため、紹介したコードが長くなってしまいました。
そこで今回は、先のエントリで紹介したコードを、より単純でC#っぽく書き直してみました。

1.開発環境

今回の開発環境です。
前回のエントリから、一切の変更はありません。

項目 内容
OS Windows10 Pro(1909)
CPU i7-8700
メモリ 16GB
IDE VisualStudioCommnuity 2019
version 16.5.1
.NET Framework 4.7
OpenXml 2.11.3
Excel Office 2013

2.プログラムの変更点

今回のプログラムの変更は、主にセル内の情報の解析と、その結果の文字列の取得部分です。
実際の変更後のコードは、下記のようになります。

try
{
    var runElements = item.Elements();
    if (0 < runElements.Count())
    {
        /*
            * Check the format informations have strikethrough element
            * if one or more r element can be found.
            */
        foreach (var runElement in runElements)
        {
            var runPropertyElements = runElement.RunProperties;
            var strikeElements = runPropertyElements.Elements<Strike>();
            if (0 < strikeElements.Count())
            {
                continue;
            }
            else
            {
                cellInnerText += runElement.InnerText;
            }
        }
    }
    else
    {
        cellInnerText += item.InnerText;
    }
}
catch (Exception)
{
    cellInnerText += item.InnerText;
}

2.1.r要素の取得

まず、r要素の取得ですが、これはSharedStringItemのElementsメソッドを使用することで取得ができます。
具体的には、下記の1行で完了です。

var runElements = item.Elements();

また、r要素の有無については、上記コードの戻り値のcount()メソッドを使用して確認ができます。

2.2.rPr要素の取得と確認

次に、rPr要素ですが、RunオブジェクトのRunPropertiesプロパティから取得できます。
rPr要素の子要素、strike要素の有無については、r要素の場合と同様でElementsメソッドを使用して取得します。
具体的には、下記のコードで取得しています。

var runPropertyElements = runElement.RunProperties;
var strikeElements = runPropertyElements.Elements<Strike>();

strike要素の有無については、上記strikeElementsのcount()メソッドの戻り値で確認、判定ができます。
あとは、判定結果に従って文字列の取得/破棄を行えば完了です。

3.まとめ

今回紹介したコードは、機能的には全く同じです。
しかし、コード量は今回紹介したモノの方が、圧倒的に少ないです。
シンプルで分かり易いものになっているかと思います。
前回のコードとも比較して、その違いを確認、参考にしていただければ幸いです。

ではっ!

ex.公開しています

今回のコードは、GitHubで公開しています。
全体を確認する際には、リンク先のコードを参照してください。