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

本文关键字:异常 导入 openXML excel 使用 | 更新日期: 2023-09-27 18:11:08

我想将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
}

rerurn零

任何想法?

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

源行中有一个属性将为"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;

这样你的代码就可以在运行时确定是否有问题:当处理由其他系统创建的数据时,这种"防御"的想法通常是一个好主意。

经过半天的分析2007,2010,2013和转换一些2003->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();