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 选择中,您有一个条件cell.CellValue != null,如果 false 导致内联 if of((cell.CellValue.InnerText != null)?cell.CellValue.InnerText:cell.CellValue.Text) 但如果cell.CellValue != null为 falsecell.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 回答