使用EPPlus如何生成电子表格,其中的数字不是文字

我使用LoadFromArraysList<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,看起来像一个数字:

Excel输出

我创build了一个基于EPPlus LoadFromArray的扩展方法LoadFormulasFromArray 。 该方法假定列表中的所有对象都被视为公式(而不是LoadFromArray )。 重要的是ValueFormula属性都使用string而不是特定的Type。 我认为这是一个错误,因为没有办法区分string是Text还是Formula 。 实现一个Formulatypes将启用重载和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]; } }