我正在使用ASP.net开发一个网站(VS2015 C#)。
我需要将包含大量数据(500000多行和100列)的MySql
表格导出为excel(xlsx
),格式为。
尝试了很多选项后,NPOI(v 3.20)库允许使用使用流式传输的类型(SXSSFWorkbook
& SXSSFSheet
)进行导出。
如果我使用XSSFWorkbook
,我会在内存中填充行。
使用SXSSFWorkbook
我能够使用不同的字体和颜色格式化xlsx
,但我遇到了导出数据类型的问题:
我用来格式化数据的代码是:
SXSSFWorkbook wb = new SXSSFWorkbook(); SXSSFSheet sh = (SXSSFSheet)wb.CreateSheet("Sheet 1"); sh.SetRandomAccessWindowSize(100); ICellStyle testStyleHeader = wb.CreateCellStyle(); ICellStyle testStyleRow = wb.CreateCellStyle(); // Header Style testStyleHeader.FillForegroundColor = NPOI.SS.UserModel.IndexedColors.RoyalBlue.Index; testStyleHeader.FillPattern = FillPattern.SolidForeground; // Double style (with 2 decimals like 453.65) ICellStyle cellStyleDouble = wb.CreateCellStyle(); cellStyleDouble.DataFormat = wb.CreateDataFormat().GetFormat("0.00"); // Font XSSFFont hFontBlack = (XSSFFont)wb.CreateFont(); hFontBlack.FontHeightInPoints = 11; hFontBlack.FontName = "Calibri"; hFontBlack.Color = NPOI.SS.UserModel.IndexedColors.Black.Index; testStyleHeader.SetFont(hFontBlack); IRow row = sh.CreateRow(0); int j = 0; ICell cell = row.CreateCell(j); // Fill Header row cell.SetCellValue("XXXX"); cell.CellStyle = testeStyleHeader; j++; cell = row.CreateCell(j); cell.SetCellValue("YYYY"); cell.CellStyle = testeStyleHeader; j++; cell = row.CreateCell(j); cell.SetCellValue("ZZZZ"); cell.CellStyle = testeStyleHeader; j++; cell = row.CreateCell(j); cell.SetCellValue("WWWW"); cell.CellStyle = testeStyleHeader; j++; cell = row.CreateCell(j); // Fill Rows int i = 1; // row Number IRow row2; // No Header Row ICell cell2; // No Header cell while (dr.Read()) // dr is the DataReader { row2 = sh.CreateRow(i); for (int cont = 0; cont < NumColumns; cont++) { if (cont == 0) // This column is a date { …. // code for date format } else if (cont == 3) // Double column with 2 decimals¡! (values samples 100.45 5654.80 etc.) { ICell cell3 = row2.CreateCell(j, NPOI.SS.UserModel.CellType.Numeric); cell3.CellStyle = cellStyleDouble; cell3.SetCellValue(Convert.ToDouble(dr[cont])); } else {…. // code for tex format, int format etc. } } i++;
}
使用此代码,在十进制列(cont == 3)中,我得到一个文本列。
但是,使用相同的代码,如果我声明没有流式传输类型:
XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sh = (SSFSheet)wb.CreateSheet("Sheet 1");
只有通过这些更改,我才能获得完美的数字列3 ...
对于这一行:
cellStyleDouble.DataFormat = wb.CreateDataFormat()。GetFormat(&#34; 0.00&#34;);
我尝试过不同的类型:
在某些情况下,我会得到一个数字,但没有所需的格式。
所以...流媒体类型不允许这种格式化?
答案 0 :(得分:1)
只需将文化信息更改为en-US
即可 Thread.CurrentThread.CurrentCulture = new CultureInfo("en-Us");
ISheet worksheet = Workbook.CreateSheet(dt.TableName);
IRow HeaderRow = worksheet.CreateRow(0);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell HeaderCell = HeaderRow.CreateCell(i);
HeaderCell.SetCellValue(dt.Columns[i].ColumnName);
}
for (int j = 0; j < dt.Rows.Count; j++)
{
IRow Row = worksheet.CreateRow(j + 1);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell Cell = Row.CreateCell(i);
if (dt.Columns[i].DataType.IsOfType(typeof(decimal)) && dt.Rows[j][i] != DBNull.Value)
{
Cell.SetCellType(CellType.Numeric);
Cell.SetCellValue((double)dt.Rows[j][i]);
}
else
Cell.SetCellValue(dt.Rows[j][i].ToString());
}
}
Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-Br");
对我有用!
答案 1 :(得分:0)
您可以根据以下代码段尝试格式化吗?我正在使用这种方法来格式化电话号码。
XSSFCellStyle currencyCellStyle = (XSSFCellStyle)workbook.CreateCellStyle();
XSSFDataFormat currencyDataFormat = (XSSFDataFormat)workbook.CreateDataFormat();
currrencyCellStyle.SetDataFormat(currencyDataFormat.GetFormat("00000.00")); //Formats: #####.##, 00000##.##
有时在NPOI中找到确切的格式很棘手:)。请尝试以下方法
ICellStyle CellStyle = workbook.CreateCellStyle();
CellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("number"); // or Number
或
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(wb.getCreationHelper().createDataFormat().getFormat("#.#")); // or #####.## or number