Apache POI setCellType未正确设置数值的单元格类型

时间:2016-07-13 22:09:55

标签: java apache-poi

我正在尝试将一些数据导出到Excel文件中。我正在使用POI。

据我所知Cell.setCellType(double)设置了相应的excel等效数值。但这不会改变细胞的类型。

我打开生成的Excel文件时的列类型为General中的Home tab

Poi Generated Cell Type for Numeric value

以下是测试它的示例代码。

package com.example;

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TestExcelMain {
    public static void main(String[] args) throws Exception {
        System.out.println("started");

        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet();
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);

        cell.setCellValue(3.14159);

        workbook.write(new FileOutputStream("Test.xlsx"));

        System.out.println("finished");
    }
}

还有其他方法可以将细胞类型设置为合适的类型吗?

我也尝试了Cell.setCellType(Cell.CELL_TYPE_NUMERIC)完全相同的结果。

我期望的正确类型的单元格为Number

我也尝试使用此帖setCellType(HSSFCELL.CELL_TYPE_NUMERIC) is not working in apache poi

中建议的所有XSSF classess(下面的代码)
package com.example;

import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TestExcelMain {
    public static void main(String[] args) throws Exception {
        System.out.println("started");

        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet();
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);

        cell.setCellValue(3.14159);
        cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);

        workbook.write(new FileOutputStream("Test.xlsx"));

        System.out.println("finished");
    }
}

修改

正如Jim Garrison的回答,设置单元格样式确实会将类型更改为数字。以下是工作代码。

package com.example;

import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TestExcelMain {
    public static void main(String[] args) throws Exception {
        System.out.println("started");

        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet();
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);

        cell.setCellValue(3.14159);
        cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);

        XSSFDataFormat format = workbook.createDataFormat();
        XSSFCellStyle style = workbook.createCellStyle(); 
        style.setDataFormat(format.getFormat("0.0"));

        cell.setCellStyle(style);

        workbook.write(new FileOutputStream("Test.xlsx"));

        System.out.println("finished");
    }
}

1 个答案:

答案 0 :(得分:5)

来自setCellValue(double value)的Javadoc(强调我的):

  

value - 要设置此单元格的数值。对于公式,我们设置预先计算的值,对于数字我们将设置其值。 对于其他类型,我们会将单元格更改为数字单元格并设置其值。

因此,无论之前的细胞是什么,此方法都会将细胞类型更改为数字。

请注意"一般"与细胞类型无关,与细胞格式有关。要更改单元格的显示方式,请使用setCellStyle()