C# Excelを読み込んだ後、ReoGridのセルの値を取得したい

タグの編集
投稿者 えんぴー  (社会人) 投稿日時 2022/11/2 17:05:44
ExcelのA1に「2022/11/1」
ExcelのA2に「2022/11/1」をセル書式[d]に設定し「1」と表示させています。
(Excelでセルを選択して確認すると、2022/11/1と表示されます)

ExcelファイルをReoGridに読ませた後
ReoGridの値と日付が同じか確認する作業があります。


CalSheet→ReoGridの特定シート。
DummyData→セル内容が空になったら抜けたい
RealCount→セルが入っている行の数を数える(途中に空白セルは挟まない)

どうやったらセルの見かけ上データではなく
中身を取得できるのでしょうか。

以下の例で行くと、
CalSheet.Cells[0, i].Data→A1
CalSheet.Cells[0, i].Data.toString()→「1」
DateTime NowData = DateTime.Parse(CalSheet.Cells[1, i].Data.ToString());→値が1のためエラーになる

            string ?DummyData;
            for (var i=0; i<CalSheet.ColumnCount;i++) {
                Console.Write(CalSheet.Cells[0, i].Data);
                Console.Write(CalSheet.Cells[0, i].Data.ToString());
                DateTime NowData = DateTime.Parse(CalSheet.Cells[1, i].Data.ToString());
                if (NowData.ToString("yyyy年MM月d日") == Today.ToString("yyyy年MM月d日"))
                {
                    TodayCell = new RangePosition(3, i, 1, 1);
                }
                RealCount++;
                DummyData = CalSheet.Cells[0, i].Data.ToString();
                if (DummyData == null) break;
            }
投稿者 えんぴー  (社会人) 投稿日時 2022/11/2 17:55:25
A1、A2、A3には同じ日付データが入っており、
書式設定としてはA1は「yyyy年MM月」、A2は「d」、A3は「ddd」 として
ReoGridのExcel2007形式で保存しました。
普通に出力でき、Excel上では普通に見れていることを確認。
そのReoGridで出力したExcel形式のファイルをReoGridで読み込み
再度ReoGridでかき出してみたら
1行目「2022年00月」  2行目「1」  3行目「土」
となっていました。どうやら文字列として出力されているようです。

書き出す時も読み込むときも、同じように出力しています。

reoGridControl2.Save(fbd.SelectedPath + "\\filetest.xlsx", unvell.ReoGrid.IO.FileFormat.Excel2007);
reoGridControl1.Load(openFileDialog1.FileName , unvell.ReoGrid.IO.FileFormat.Excel2007);

            CalSheet.SetRangeDataFormat("1:1", CellDataFormatFlag.DateTime,
              new DateTimeDataFormatter.DateTimeFormatArgs()
              {
                  Format = "yyyy年MM月",
              });
            CalSheet.SetRangeDataFormat("2:2", CellDataFormatFlag.DateTime,
              new DateTimeDataFormatter.DateTimeFormatArgs()
              {
                  Format = "d",
              });
            CalSheet.SetRangeDataFormat("3:3", CellDataFormatFlag.DateTime,
              new DateTimeDataFormatter.DateTimeFormatArgs()
              {
                  Format = "ddd",
              });


フォーマットを決めているのがダメなのでしょうか?うーん。
投稿者 るきお  (社会人) 投稿日時 2022/11/2 21:48:03
ReoGridを使っている人がものすごく少ないと思うので、ほとんど回答は期待できないと思いますよ。

私ははじめてReoGridを使ってみました。


> どうやったらセルの見かけ上データではなく
> 中身を取得できるのでしょうか。
ちょっと試した感じでは Cellクラスの Dataプロパティ で セルに実際に設定されているデータを取得できるようでした。
Windows フォーム(.NET 6)で次のプログラムで試しました。

var sheet = reoGridControl1.CurrentWorksheet;
sheet.Cells[0, 0].DataFormat = unvell.ReoGrid.DataFormat.CellDataFormatFlag.Number;
sheet.Cells[0, 0].DataFormatArgs =
    new unvell.ReoGrid.DataFormat.NumberDataFormatter.NumberFormatArgs()
    {
        UseSeparator = true, //3桁区切りのカンマ
        DecimalPlaces = 2 //小数点桁数2
    };

//画面表示は 1,234.57 になりました。
sheet.Cells[0, 0].Data = "1234.5678";

//1234.5678 と出力されました。
System.Diagnostics.Debug.WriteLine(sheet.Cells[0, 0].Data);


書式を設定しているので画面表示は 1,234.57 と表示されますが、Dataプロパティは実際に設定している値の1234.5678を返しました。


> 以下の例で行くと、
> CalSheet.Cells[0, i].Data→A1
> CalSheet.Cells[0, i].Data.toString()→「1」
> DateTime NowData = DateTime.Parse(CalSheet.Cells[1, i].Data.ToString());→値が1のためエラーになる
ごめんなさい。意味がくみとれませんでした。

> CalSheet.Cells[0, i].Data→A1
Dataプロパティが"A1"という文字列を返すので、期待した値と違うという意味なのかなと思いました。
が、そうだとしても実際に何がセットされていて何を返すことを期待されているかわからず…。"A1"という値が設定されているのか、しかし、次の行の「1」の方が鍵かっこ付になっているのに比べて A1 は引用符がついていないので文字列のことではないのか。

DataプロパティはObject型なので、文字列や数値のように単純な型でないものを設定している場合、確認方法の方に問題があるのかもしれませんよ。

DateTime.Parseとあるので、日付をセットしているのか。

もっとサンプルを単純化することをお勧めします。
投稿者 えんぴー  (社会人) 投稿日時 2022/11/7 13:28:38
るきお様

回答ありがとうございます。
ExcelのA1に「2022/11/1」のデータが入っており、
データの表示書式は「d」になっています。(表示上は1です)

それを
reoGridControl1.Load(openFileDialog1.FileName , unvell.ReoGrid.IO.FileFormat.Excel2007);
のようにreoGridControl1に読み込み
CalSheet.Cells[0,0].Data.ToString() と実行すると
「1」と表示されます。
「2022/11/1」という元の値を取得したいのです。

ググッても説明サイトがあまりないですし、
利用者が少なそうですね。使い勝手がよさそうかなと思ったのですが
不具合があっても対応できなさそうだし利用やめるのも検討します。
投稿者 えんぴー  (社会人) 投稿日時 2022/11/7 16:58:57
LoadRGF、SaveRGFを利用することで良化しました。

るきお様、およびほかに回答準備いただいていた皆様
ありがとうございました。