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

简介: java操作Excel处理数字类型的精度损失问题验证: 场景: CELL_TYPE_NUMERIC-->CELL_TYPE_STRING--->CELL_TYPE_NUMERIC POI版本:poi-3.

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.333333
Type: CELL_TYPE_NUMERIC==>CELL_TYPE_STRING
CELL_TYPE_NUMERIC:99.333333
CELL_TYPE_STRING:99.333333
toDouble:99.333333
Type: CELL_TYPE_STRING==>CELL_TYPE_NUMERIC
CELL_TYPE_NUMERIC:99.333333
CELL_TYPE_STRING:99.333333
toDouble:99.333333
CELL_TYPE_NUMERIC:99.333333

结论:

此场景无精度损失。

 

相关文章
|
1月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
25 0
|
1月前
|
Java Apache
EasyPOI操作Excel从零入门
我们不造轮子,只是轮子的搬运工。(其实最好是造轮子,造比别人好的轮子)开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子,EasyPOI封装了Apache的POI技术,实现了基本的Excel导入、导出从此不再为Excel操作头疼~
20 2
EasyPOI操作Excel从零入门
|
1月前
|
Java
java中的泛型类型擦除
java中的泛型类型擦除
13 2
|
1月前
|
存储 数据处理 索引
Python操作Excel常用方法汇总
Python操作Excel常用方法汇总
34 0
|
1月前
|
存储 Java
JAVA字符串与其他类型数据的转换
JAVA字符串与其他类型数据的转换
28 4
|
1月前
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
24 2
|
1天前
|
数据采集 前端开发 测试技术
《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。
6 2
|
2天前
|
Web App开发 数据采集 Java
《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
【4月更文挑战第22天】本文介绍了在测试过程中可能会用到的两个功能:Actions类中的拖拽操作和划取字段操作。拖拽操作包括基本讲解、项目实战、代码设计和参考代码,涉及到鼠标按住元素并将其拖动到另一个元素上或指定位置。划取字段操作则介绍了如何在一段文字中随机选取一部分,包括项目实战、代码设计和参考代码。此外,文章还提到了滑动验证的实现,并提供了相关的代码示例。
31 2
|
3天前
|
存储 Java
JAVA变量类型
JAVA变量类型
11 0
|
8天前
|
存储 算法 安全
什么是Java泛型类型?
【4月更文挑战第13天】
12 0
什么是Java泛型类型?