使用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零
任何想法?
源行中有一个属性将为"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();