从EPPLUS的列表中导出到Excel
从EPPLUS的列表中导出到Excel
我正在尝试使用EPPLUS将一个列表导出到C#中的Excel,当我执行程序时没有出现错误,但是当我打开Excel时发现数据不正确,它将项目名称+对象名称放置在列表中的每个对象上:
对象的代码:
class Stock { public string Nif; public string Proveedor; public string Coodigo; public string descripcion; public string Catalogo; public string Estadistico; public decimal StockOn; }
当列表(lstStock)填充完毕后,我创建了一个Excel并使用了loadfromcollection选项:
System.IO.FileInfo f = new System.IO.FileInfo("D:\\stock_termos.xlsx"); if (f.Exists) f.Delete(); using (ExcelPackage ep = new ExcelPackage(f)) { ExcelWorksheet hoja = ep.Workbook.Worksheets.Add("TOTAL OBSOLETOS"); hoja.Cells[1, 1].Value = "NIF"; ; hoja.Cells[1, 2].Value = "Proveedor"; hoja.Cells[1, 3].Value = "Código"; hoja.Cells[1, 4].Value = "Descripción"; hoja.Cells[1, 5].Value = "Catálogo"; hoja.Cells[1, 6].Value = "Cod.Estadístico"; hoja.Cells[1, 7].Value = "Stock On"; hoja.Cells[2, 1].LoadFromCollection(lstStock); }
问题是,当我在VisualStudio中调试应用程序时,我可以看到列表被正确填充:
所以我认为错误发生在我尝试使用LoadFromCollection方法将数据导出到Excel时,但我看不出错在哪里,请帮助。
问题的原因是EPPlus版本的问题。EPPlus的4.1.0版本会抛出错误,而4.0.4版本则不会。具体来说,问题出现在LoadFromCollection
方法的最后一个重载上。这个方法的签名是public ExcelRangeBase LoadFromCollection<T>(IEnumerable<T> Collection, bool PrintHeaders, TableStyles TableStyle, BindingFlags memberFlags, MemberInfo[] Members)
。从这个方法的签名中可以看出,EPPlus只会查看MemberInfos
而不会查看Fields
。因此,如果将Stock
对象修改为以下形式:
class Stock { public string Nif { get; set; } public string Proveedor { get; set; } public string Coodigo { get; set; } public string descripcion { get; set; } public string Catalogo { get; set; } public string Estadistico { get; set; } public decimal StockOn { get; set; } }
,问题将得到解决。
另外,EPPlus的4.0.4版本没有抛出异常也是一个有趣的发现。相比之下,4.1版本至少能够在测试时提示出现了问题。