NPOI:使用SXSSFWorkbook格式化为十进制的Excel列?

时间:2017-11-01 20:30:33

标签: asp.net excel npoi

我正在使用ASP.net开发一个网站(VS2015 C#)。

我需要将包含大量数据(500000多行和100列)的MySql表格导出为ex​​cel(xlsx),格式为。

尝试了很多选项后,NPOI(v 3.20)库允许使用使用流式传输的类型(SXSSFWorkbook& SXSSFSheet)进行导出。

如果我使用XSSFWorkbook,我会在内存中填充行。

使用SXSSFWorkbook我能够使用不同的字体和颜色格式化xlsx,但我遇到了导出数据类型的问题:

  • 日期类型确定
  • Int types ok
  • 文字确定
  • 十进制输入,如100.35 - >问题,我得到一个文本专栏。我需要一个像数字100,35的输出。

我用来格式化数据的代码是:

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;);

我尝试过不同的类型:

  • &#34; ##&#34;
  • &#34;#,## 0.000&#34;
  • &#34;###&#34;
  • 等等...

在某些情况下,我会得到一个数字,但没有所需的格式。

所以...流媒体类型不允许这种格式化?

2 个答案:

答案 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