首页 > 代码库 > java操作Excel处理数字类型的精度损失问题验证

java操作Excel处理数字类型的精度损失问题验证

java操作Excel处理数字类型的精度损失问题验证:

场景:

CELL_TYPE_NUMERIC-->CELL_TYPE_STRING--->CELL_TYPE_NUMERIC

POI版本:
poi-3.10.1
poi-3.9

Code:

package poi;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import org.apache.poi.hssf.usermodel.HSSFWorkbook;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;public class DoubleWithStringNumeric {    private static final String excelName="DoubleWithStringNumberic.xls";    public static void main(String[] args) throws IOException {        int double_idx=0;        int double2String_idx=1;        int string2double_idx=2;        Workbook wb=new HSSFWorkbook();        Sheet sheet=wb.createSheet("DoubleWithStringNumberic");        Row row=sheet.createRow(1);        Cell cell=row.createCell(double_idx);        cell.setCellType(Cell.CELL_TYPE_NUMERIC);        cell.setCellValue(99.333333);                persistWorkbook(wb);                travelSheet();                System.out.println("Type: CELL_TYPE_NUMERIC==>CELL_TYPE_STRING");        InputStream s=new FileInputStream(excelName);        wb=new HSSFWorkbook(s);        sheet=wb.getSheetAt(0);        row=sheet.getRow(1);        cell=row.getCell(0);        Double d=cell.getNumericCellValue();                cell=row.createCell(double2String_idx);        cell.setCellType(Cell.CELL_TYPE_STRING);        cell.setCellValue(String.valueOf(d));                persistWorkbook(wb);        s.close();                travelSheet();                System.out.println("Type: CELL_TYPE_STRING==>CELL_TYPE_NUMERIC");        s=new FileInputStream(excelName);        wb=new HSSFWorkbook(s);        sheet=wb.getSheetAt(0);        row=sheet.getRow(1);        cell=row.getCell(double2String_idx);        String double2String=cell.getStringCellValue();        cell=row.createCell(string2double_idx);        cell.setCellType(Cell.CELL_TYPE_NUMERIC);        cell.setCellValue(Double.parseDouble(double2String));        persistWorkbook(wb);        s.close();                travelSheet();            }    private static void travelSheet() throws FileNotFoundException, IOException {        Workbook wb;        Sheet sheet;        InputStream s=new FileInputStream(excelName);        wb=new HSSFWorkbook(s);        sheet=wb.getSheetAt(0);        for (Row row_temp : sheet) {            for (Cell cell_temp : row_temp) {                getCellValue(cell_temp);            }        }        s.close();    }    private static void getCellValue(Cell cell) {        switch (cell.getCellType()) {        case Cell.CELL_TYPE_NUMERIC:            System.out.println("CELL_TYPE_NUMERIC:"+cell.getNumericCellValue());            break;        case Cell.CELL_TYPE_STRING:            String stringCellValue = cell.getStringCellValue();            System.out.println("CELL_TYPE_STRING:"+stringCellValue);            System.out.println("toDouble:"+Double.parseDouble(stringCellValue));            break;        default:            System.out.println("error");            break;        }            }    private static void persistWorkbook(Workbook wb)            throws FileNotFoundException, IOException {        OutputStream stream=new FileOutputStream(excelName);        wb.write(stream);        stream.flush();        stream.close();    }}

Output:

CELL_TYPE_NUMERIC:99.333333Type: CELL_TYPE_NUMERIC==>CELL_TYPE_STRINGCELL_TYPE_NUMERIC:99.333333CELL_TYPE_STRING:99.333333toDouble:99.333333Type: CELL_TYPE_STRING==>CELL_TYPE_NUMERICCELL_TYPE_NUMERIC:99.333333CELL_TYPE_STRING:99.333333toDouble:99.333333CELL_TYPE_NUMERIC:99.333333

结论:

此场景无精度损失。

 

java操作Excel处理数字类型的精度损失问题验证