1

Excel スプレッドシートから値を読み取り、その値をデータベースに保存する必要があります。現時点で問題があると思われるのは、行オブジェクトの列の個々の値にアクセスすることです

http://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.cellvalue.aspx

var cellValues = from cell in row.Descendants<Cell>()
                                                     select (cell.DataType != null && cell.DataType.HasValue && cell.DataType == CellValues.SharedString
                                                       && int.Parse(cell.CellValue.InnerText) < sharedString.ChildElements.Count 
                                                        ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText 
                                                        : cell.CellValue.InnerText);

残念ながら、上記のコードは実行時に例外をスローするため、機能していないようです。そのため、OpenXML を使用して Excel の行オブジェクトに含まれる値にアクセスする方法について最善のアイデアを探しています。

+$exception {"オブジェクト参照がオブジェクトのインスタンスに設定されていません。"} System.Exception {System.NullReferenceException}

結果のスタック トレース

   at MOC.Import.Products.<ProcessRows>b__0(Cell cell) in c:\Development\CFrontEnd\MOC.Import\Products.cs:line 37
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
   at MOC.Import.Products.ProcessRows(IEnumerable`1 dataRows, SharedStringTable sharedString) in c:\Development\CFrontEnd\MOC.Import\Products.cs:line 45
4

1 に答える 1

1

参照しているオブジェクトの 1 つが null です。問題の原因となっている特定のオブジェクトを見つける最も簡単な方法は、LINQ 式からフィルター処理と書式設定のコードを取り出し、セルを反復処理することです。

var cellValues = from cell in row.Descendants<Cell>()
                    select cell;

foreach (var cell in cellValues)
{
    if(cell.DataType != null 
        && cell.DataType.HasValue 
        && cell.DataType == CellValues.SharedString
        && int.Parse(cell.CellValue.InnerText) < sharedString.ChildElements.Count)
    {
        DoSomething(sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText);
    }
    else
    {
        DoSomething(cell.CellValue.InnerText);
    }
}

この構造を使用すると、デバッガーで問題を検出しやすくなります。このコードをさらに巻き戻し、null に対するガードを追加して、コードをより堅牢にすることもできます。一言で言えば、あなたの問題は、読んでいるドキュメントの構造について無効な仮定をしていることです。原則として、特に完全に制御できない入力に関する仮定である場合は、仮定は良くありません。

于 2012-09-26T22:13:58.110 に答える