使用EPPlus如何生成电子表格,其中的数字不是文字
我使用LoadFromArrays
从List<object[]>
创build一个电子表格
数组的第一个条目是标题,其他条目可能是数字,文本或date(但对列表中的每个数组都是相同的)。
生成的Excel工作表具有绿色三angular形警告,数字被格式化为文本。
我循环遍历所有单元格,并将其格式设置为Number,如下所示: ws.Cells[i, j].Style.Numberformat.Format = "0";
然而,问题仍然存在,我仍然看到绿色的警告,即使数字格式设置为编号时,我看Format Cell...
对话框。
我在这里有什么select? 我可以更多地了解每列中的types,但是如何设置列标题?
有没有比EPPlus更好的解决scheme? 或者我可以在下载之前做一些更多的电子表格处理?
由于您使用的是对象数组,所以它们可以包含数字和string,这些数字和string看起来像数字,您必须通过每个对象并确定其types:
[TestMethod] public void Object_Type_Write_Test() { //http://stackoverflow.com/questions/31537981/using-epplus-how-can-i-generate-a-spreadsheet-where-numbers-are-numbers-not-text var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); if (existingFile.Exists) existingFile.Delete(); //Some data var list = new List<Object[]> { new object[] { "111.11", 111.11, DateTime.Now } }; using (var package = new ExcelPackage(existingFile)) { var ws = package.Workbook.Worksheets.Add("Sheet1"); ws.Cells[1, 1, 2, 2].Style.Numberformat.Format = "0"; ws.Cells[1, 3, 2, 3].Style.Numberformat.Format = "[$-F400]h:mm:ss\\ AM/PM"; //This will cause numbers in string to be stored as string in excel regardless of cell format ws.Cells["A1"].LoadFromArrays(list); //Have to go through the objects to deal with numbers as strings for (var i = 0; i < list.Count; i++) { for (var j = 0; j < list[i].Count(); j++) { if (list[i][j] is string) ws.Cells[i + 2, j + 1].Value = Double.Parse((string) list[i][j]); else if (list[i][j] is double) ws.Cells[i + 2, j + 1].Value = (double)list[i][j]; else ws.Cells[i + 2, j + 1].Value = list[i][j]; } } package.Save(); } }
有了上面的内容,你可以看到下面的图像是输出注意左上angular的单元格是绿色箭头,因为它是一个由LoadFromArray
写成的string,看起来像一个数字:
我创build了一个基于EPPlus LoadFromArray
的扩展方法LoadFormulasFromArray
。 该方法假定列表中的所有对象都被视为公式(而不是LoadFromArray
)。 重要的是Value
和Formula
属性都使用string
而不是特定的Type。 我认为这是一个错误,因为没有办法区分string是Text
还是Formula
。 实现一个Formula
types将启用重载和types检查,从而可以始终做正确的事情。
// usage: ws.Cells[2,2].LoadFormulasFromArrays(MyListOfObjectArrays) public static class EppPlusExtensions { public static ExcelRangeBase LoadFormulasFromArrays(this ExcelRange Cells, IEnumerable<object[]> Data) { //thanx to Abdullin for the code contribution ExcelWorksheet _worksheet = Cells.Worksheet; int _fromRow = Cells.Start.Row; int _fromCol = Cells.Start.Column; if (Data == null) throw new ArgumentNullException("data"); int column = _fromCol, row = _fromRow; foreach (var rowData in Data) { column = _fromCol; foreach (var cellData in rowData) { Cells[row, column].Formula = cellData.ToString(); column += 1; } row += 1; } return Cells[_fromRow, _fromCol, row - 1, column - 1]; } }