質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1841閲覧

ClosedXMLのGetstringでユーザー書式が取得されてしまう

ntech-app

総合スコア19

ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/07/06 05:43

お世話になります。
ExcelのA1セルに"あいうえお"と書かれているのですが、ユーザー書式に"aaa"と書かれている場合…

Console.WriteLine(worksheet.Cell(1, 1).GetString());

上記でテキストを表示するとaaaと表示されてしまいます。

Console.WriteLine(worksheet.Cell(1, 1).Value.ToString());
Console.WriteLine(worksheet.Cell(1, 1).RichText.ToString());

…でも同様の結果です。
このようなユーザー定義であっても C# ClosedXML で正しく"あいうえお"を取得する方法はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

確かに発生しますね。
色々、調べてみたのですがこれといった回避策が見つからないのと仕様なのかどうかも見つけれませんでした。
私なりの回避策としては

■方法1
リフレクションを使って無理やり値を取得

C#

1private static string GetRawCellValue(IXLCell cell) { 2 3 var field = cell.GetType().GetField("_cellValue", 4 System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 5 6 return field.GetValue(cell) as string; 7 8}

かなり無理やりです...
どこにも保証はないので正直、推奨はしません。
※クイックウォッチで元の値がないか調べてたどり着いた程度です

■方法2
バージョンダウン
質問者さんがClosedXmlのバージョンを書いてないのでわかりませんが0.96より低いバージョンだと思います。
※0.96だとRichTextプロパティが無くなってGetRichTextメソッドを使用するようです。

そこでvsのnugetに表示されてる一番古いバージョン(0.64)にしたところ、"あいうえお"は取得できました。
この方法なら今使ってるバージョンにより近いバージョンで探してみるといった感じです。
ただ、バージョンを落とすことになるので古いバグ等が復帰してしまいます。


どちらにしろ0.96でも0.64でも質問者さんの内容からすると曜日の日本語表記だと思いますが、セルに日付として正しい値を設定してもValueプロパティやRichTextから書式設定された値は取得できませんでした。

そのあたりを考え、ユーザー書式を「ddd」にすると曜日も"あいうえお"も正しく取得できました。
そうなると「aaa」という書式が日本語独自という扱いで、ClosedXml側に何らかの書式設定系の追加実装を行わないと無理なのかもしれません。
※そこまで調べる元気がなくなりました...

投稿2022/07/07 14:17

dekaaki

総合スコア292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ntech-app

2022/07/07 23:01

dekaakiさま、ご回答ありがとうございます。 こちらのClosedXMLのバージョンは 0.95.4 です。 方法1を試してみましたが正しく取得することが出来ました。 ありがとうございます、大変助かります。 このExcelブックはお客様のもので、本来は"aaa"は曜日なのだと思いますが、普通にテキスト項目に適用されています。 書式の指定を頼んでも、たらい回しされるうちに適当なセルをコピーされて今回のように書式が不適切なものを使用されることがあります。 ご回答いただいた方法1と GetString() を併用して凌いでいこうと思います。 誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問