0

Excel シートの各行から値を読み取り、含まれている値を順番に計算する必要があります。値にアクセスする際に問題が発生したようです。以下のコードのデバッグにご協力いただければ幸いです。

      public void ProcessRows(IEnumerable<Row> dataRows, SharedStringTable sharedString)
    {
        try
        {
            //Extract the information for each row 
            foreach (Row row in dataRows)
            {
                var cellValues = from cell in row.Descendants<Cell>()
                                 select ((cell.CellValue != null && cell.DataType!=null && cell.DataType.HasValue  )
                                 && (sharedString.HasChildren  && int.Parse(cell.CellValue.InnerText) < sharedString.ChildElements.Count)
                                           ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
                                           : ((cell.CellValue.InnerText != null)?cell.CellValue.InnerText:cell.CellValue.Text));


                //Check to verify the row contained data.
                if (cellValues != null && cellValues.Count() > 0)
                {
                    //Create a productdetail object and add it to the list.
                    var values = cellValues.ToArray();
                    ProductItemDetail itemdetail = new ProductItemDetail();
                    itemdetail.RecordID = SessionRecordID;
                    if (values[0] != null)
                        itemdetail.Source = values[0].Trim();
                    if (values[1] != null)
                        itemdetail.Sourcename = values[1].Trim();
                    if (values[2] != null)
                        itemdetail.URLHomePage = values[2].Trim();


                }
            {

    Catch(Exception ex)
    {

        throw ex;
             }

}

コードでこの行を実行すると問題が発生するようです

if (cellValues != null & cellValues.Count() > 0) { . . . . . }

オブジェクト参照がオブジェクト インスタンスに設定されていません。

4

1 に答える 1

1

LINQ の select には、 false の場合はcell.CellValue != nullインラインの if of((cell.CellValue.InnerText != null)?cell.CellValue.InnerText:cell.CellValue.Text) が発生するが、 cell.CellValue != nullfalseの場合はcell.CellValue.InnerText != nullエラーになるという条件があります。

してみてください:

public void ProcessRows(IEnumerable<Row> dataRows, SharedStringTable sharedString)
{
    try
    {
        //Extract the information for each row 
        foreach (Row row in dataRows)
        {
            var cellValues = from cell in row.Descendants<Cell>()
                select ((cell.CellValue != null && cell.DataType!=null && cell.DataType.HasValue  )
                    && (sharedString.HasChildren  && int.Parse(cell.CellValue.InnerText) < sharedString.ChildElements.Count)
                    ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
                    : ((cell.CellValue != null && cell.CellValue.InnerText != null)?cell.CellValue.InnerText:cell.CellValue.Text));


            //Check to verify the row contained data.
            if (cellValues != null && cellValues.Count() > 0)
            {
                //Create a productdetail object and add it to the list.
                var values = cellValues.ToArray();
                ProductItemDetail itemdetail = new ProductItemDetail();
                itemdetail.RecordID = SessionRecordID;
                if (values[0] != null) { itemdetail.Source = values[0].Trim(); }
                if (values[1] != null) { itemdetail.Sourcename = values[1].Trim(); }
                if (values[2] != null) { itemdetail.URLHomePage = values[2].Trim(); }
            }
        }
    }
    Catch(Exception ex)
    {
        throw ex;
    }
}
于 2012-09-26T22:25:38.760 に答える