セル内の「取り消し線で消された文字列」の削除を簡単にしてみた
どもです。
前回、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で公開しています。
全体を確認する際には、リンク先のコードを参照してください。
ディスカッション
コメント一覧
まだ、コメントがありません