我有一个由第三方创建的.XLSX。我可以在Excel中很好地阅读它,但是,如果尝试使用EPPlus进行阅读,则会收到以下异常:
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
at OfficeOpenXml.Style.ExcelStyle..ctor(ExcelStyles styles, ChangedEventHandler ChangedEvent, Int32 positionID, String Address, Int32 xfsId)
at OfficeOpenXml.Style.XmlAccess.ExcelNamedStyleXml..ctor(XmlNamespaceManager NameSpaceManager, XmlNode topNode, ExcelStyles styles)
at OfficeOpenXml.ExcelStyles.LoadFromDocument()
at OfficeOpenXml.ExcelStyles..ctor(XmlNamespaceManager NameSpaceManager, XmlDocument xml, ExcelWorkbook wb)
at OfficeOpenXml.ExcelWorkbook.get_Styles()
at OfficeOpenXml.ExcelWorkbook.get_MaxFontWidth()
at OfficeOpenXml.ExcelWorksheet.get_DefaultColWidth()
at OfficeOpenXml.ExcelWorksheet.LoadColumns(XmlReader xr)
at OfficeOpenXml.ExcelWorksheet.CreateXml()
at OfficeOpenXml.ExcelWorksheet..ctor(XmlNamespaceManager ns, ExcelPackage excelPackage, String relID, Uri uriWorksheet, String sheetName, Int32 sheetID, Int32 positionID, eWorkSheetHidden hide)
at OfficeOpenXml.ExcelWorksheets..ctor(ExcelPackage pck, XmlNamespaceManager nsm, XmlNode topNode)
at OfficeOpenXml.ExcelWorkbook.get_Worksheets()
如果我在Excel中打开文件,然后将其另存为新文件,则EPPlus可以正常读取文件。显然,对于我系统的最终用户来说,这不是一个合理的解决方案。
如果需要,我可以将文件发送给开发人员,或者如果需要且可用,我可以提供更多诊断信息。
我将与另一个应用程序的开发人员联系,以尝试确定他们使用什么API来生成.XLSX。
代码:
using (var package = new ExcelPackage(importEquipmentFile.InputStream))
{
foreach (var ws in package.Workbook.Worksheets.Where(ws => ws.Hidden == eWorkSheetHidden.Visible))
...
这个简化的东西也炸毁了:
using (var package = new ExcelPackage(importEquipmentFile.InputStream))
{
foreach (var ws in package.Workbook.Worksheets)
...
这是问题所在。在以下代码中
positionID = -1和_styles.CellStyleXfs列表为空,因此“其他”被调用
internal ExcelStyle(ExcelStyles styles, OfficeOpenXml.XmlHelper.ChangedEventHandler ChangedEvent, int positionID, string Address, int xfsId) :
base(styles, ChangedEvent, positionID, Address)
{
Index = xfsId;
ExcelXfs xfs;
if (positionID > -1)
{
xfs = _styles.CellXfs[xfsId];
}
else
{
xfs = _styles.CellStyleXfs[xfsId];
}
并引发异常,因为调用的代码无法处理空列表。
public T this[int PositionID]
{
get
{
return _list[PositionID]; // <<<--- this blows up because _list has no members
}
}
我将代码调整为这样,它可以正常工作,但是我不确定处理该列表为空的最佳方法:
if (positionID > -1 || _styles.CellStyleXfs.Count == 0)