使用openXML从excel导入时出现异常

时间:2011-10-12 14:18:43

标签: c# excel openxml

我想将excel文件中的所有数据反序列化为列表。

我正在使用此代码

class ExcelImport
{
    Workbook workBook;
    SharedStringTable sharedStrings;
    IEnumerable<Sheet> workSheets;
    WorksheetPart custSheet;
    WorksheetPart orderSheet;
    string FilePath;
    ExcelStorage provider;
    Stiker[] ans;
    List<Stiker> StikerList;

    public ExcelImport(string fp)
    {
        FilePath = fp;


    }




    public List<Stiker> dothejob()
    {
        using (SpreadsheetDocument document =
    SpreadsheetDocument.Open(FilePath, true))
        {
            StikerList= new List<Stiker>();
            workBook = document.WorkbookPart.Workbook;
            workSheets = workBook.Descendants<Sheet>();
            sharedStrings = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
            StikerList = Stiker.LoadStiker(custSheet.Worksheet, sharedStrings);
            return StikerList;
        }
    }

但是从某些共鸣中我得到了例外:sharedStrings = document.WorkbookPart.SharedStringTablePart.SharedStringTable;

“对象引用未设置为对象的实例。”。

经过上述消化后发现

if (sharedStringTablePart == null)
{
// report a problem
}

重新出现空白

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

源代码行中的一个属性将为“null”且没有值。

您需要使用调试器来解决这个问题(在线上设置断点并将鼠标悬停在每个属性上),或者将该行分解为单独的语句。类似的东西:

var workBookPart = document.WorkbookPart;

if (workBookPart == null)
{
    // do something to report a problem
}

var sharedStringTablePart = workBookPart.SharedStringTablePart;
if (sharedStringTablePart == null)
{
    // report a problem
}

sharedStrings = sharedStringTablePart.SharedStringTable;

通过这种方式,您的代码可以在运行时确定是否存在问题:在处理由您自己以外的某个系统创建的数据时,这种“防御”的想法通常是个好主意。

答案 1 :(得分:1)

在解析2007年,2010年,2013年并转换一些2003-&gt; 2007并解析它们半天后,我得到了一种解析excel的方法,在某些情况下发布了SharedStringTable

 var link = document.WorkbookPart.SharedStringTablePart;
           Func<Cell, string> selector = (cell) => cell.InnerText;

          if (link != null)
           {
               SharedStringTable sharedStringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
               selector = (cell) => cell.DataType == null ? cell.InnerText : cell.DataType == CellValues.SharedString ? sharedStringTable.ElementAt(Int32.Parse(cell.InnerText)).InnerText : cell.InnerText;

          }

         var values = wsPart.Worksheet.Descendants<Cell>().Select(cell =>selector(cell) ).ToArray();