精华内容
下载资源
问答
  • poi 数字处理

    2013-09-03 08:46:52
    问题:excel导入的数字都是333.0的形式,且数字比较大时转换成了科学计数法形式。 代码: String str = row.getCell(0).toString(); 发现上面是先将字符串转成了数字又转成了字符串 改为: Cell cell=row....
    问题:excel导入的数字都是333.0的形式,且数字比较大时转换成了科学计数法形式。 
    
    代码:

    String str = row.getCell(0).toString();


    发现上面是先将字符串转成了数字又转成了字符串

    改为:

    
    Cell cell=row.getCell(0);
    cell.setCellType(Cell.CELL_TYPE_STRING);
    String str= cell.getStringCellValue();
    

    展开全文
  • poi 数字 读取问题

    2012-02-03 13:21:54
    请教个问题啊!!! 我导入数据库的时候!!! 在xsl中读取出来一个13位数字数字 如:1001001000321 读取到程序中就会是: 2147483647 啊!!!! 求解释
  • I have an application which reads xls sheet using apache poi. When the cell has numeric value, i read it by row.getCell(i).getNumericValue(). But it returns floating point digit. like if the cell val....

    I have an application which reads xls sheet using apache poi. When the cell has numeric value, i read it by row.getCell(i).getNumericValue(). But it returns floating point digit. like if the cell value is 1, it returns 1.0. Can i convert it to int ? Any helpwould be appreciated. I tried Integer.parseInt(value)- but it throws NumberFormat exception.Any help is appreciated.Here is the pseudo code:

    FileInputStream file = new FileInputStream(new File("C:\\test.xls"));

    HSSFWorkbook workbook = new HSSFWorkbook(file);

    HSSFSheet sheet = workbook.getSheetAt(0);

    Iterator rowIterator = sheet.iterator();

    while(rowIterator.hasNext()) {

    Row row = rowIterator.next();

    Iterator cellIterator = row.cellIterator();

    while(cellIterator.hasNext()) {

    Cell cell = cellIterator.next();

    switch(cell.getCellType()) {

    case Cell.CELL_TYPE_NUMERIC:

    String value= String.valueOf(cell.getNumericCellValue());

    int intVal = Integer.parseInt(value)-->>throws Exception

    解决方案

    You can read int value as string apache poi using simple steps

    First count rows in sheets using below method

    private int getRowCount(Sheet currentSheet) {

    int rowCount = 0;

    Iterator rowIterator = currentSheet.iterator();

    while(rowIterator.hasNext()) {

    Row row = rowIterator.next();

    if(row == null || row.getCell(0) == null || row.getCell(0).getStringCellValue().trim().equals("") || row.getCell(0).toString().trim().equals("")

    || row.getCell(0).getCellType()==Cell.CELL_TYPE_BLANK){

    break;

    }

    else

    rowCount=rowCount + 1;

    }

    return rowCount;

    }

    Then use below code in your method

    Workbook workbook = WorkbookFactory.create(new File("c:/test.xls");

    Sheet marksSheet = (Sheet) workbook.getSheet("Sheet1");

    int zoneLastCount = 0;

    if(marksSheet !=null ) {

    zoneLastCount = getRowCount(marksSheet);

    }

    int zone = zoneLastCount-1;

    int column=1

    for(int i = 0; i < zone; i++) {

    Row currentrow = marksSheet.getRow(i);

    double year = Double.parseDouble(currentrow.getCell(columnno).toString());

    int year1 = (int)year;

    String str = String.valueOf(year1);

    }

    展开全文
  • POI

    万次阅读 2021-01-17 17:10:20
    Poi(适合小数据量) Apache POI 官网:https://poi.apache.org/ POI是Apache软件基金会的,POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。 所以POI的主要功能是可以用Java操作...

    Poi(适合小数据量)

    Apache POI 官网:https://poi.apache.org/

    POI是Apache软件基金会的,POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。
    所以POI的主要功能是可以用Java操作Microsoft Office的相关文件,这里我们主要讲Excel

    小数据写

    1 .导入依赖

        <dependencies>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.17</version>
            </dependency>
         
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.17</version>
            </dependency>
    
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
                <version>2.10.1</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.1</version>
            </dependency>
    
        </dependencies>
    

    2 .开启读写操作,代码走起

    无非就是对api的充分认识,接下来我们先去了解他的api

     Workbook wordkbook =new HSSFWorkbook();//创建一个Workbook对象
     wordkbook.createSheet();//创建表名,如果不写参数,会有默认值
     Row row1=sheet.createRow(0);//根据里面的数字拿到对应的行,0默认为第一行
     Cell cell = row1.createCell(0);//根据行对象创建单元格,这里0为第一个
     cell.setCellValue("");//可以给单元格赋值
    

    写入一个Excel

    package com.kuang;
    
    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;
    import org.joda.time.DateTime;
    import org.junit.Test;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class ExcelWriteTest {
        //先要有个路劲
        static String path="D:\JAVA---EasyExcel\TEST";
        @Test
        public void testWrite03(String[] args) throws IOException {
            //1,创建一个工作薄
            Workbook wordkbook =new HSSFWorkbook();
            //表名
            Sheet sheet=wordkbook.createSheet("灰灰统计表");
            //创建行
            Row row1=sheet.createRow(0);
            //4.创建一个单元格
            Cell cell = row1.createCell(0);
            cell.setCellValue("今日新增观众");
            Cell cell2 = row1.createCell(1);
            cell2.setCellValue("卢本伟");
    
            //创建行
            Row row2=sheet.createRow(1);
            //4.创建一个单元格
            Cell cell3 = row2.createCell(0);
            cell3.setCellValue("统计时间");
            Cell cell24= row2.createCell(1);
            String time=new DateTime().toString("yyyy-MM-dd HH:mm:ss");
            cell24.setCellValue(time);
    
            //生成一张表 03是xls 07是xlsx
            FileOutputStream fileOutputStream = new FileOutputStream(path + "灰灰统计表03.xls");
            wordkbook.write(fileOutputStream);
    
            fileOutputStream.close();
            System.out.println("灰灰统计表03已生成");
        }
         @Test
        public void testWrite07() throws IOException {
            //1,创建一个工作薄
            Workbook wordkbook =new XSSFWorkbook();
            //表名
            Sheet sheet=wordkbook.createSheet("灰灰统计表");
            //创建行
            Row row1=sheet.createRow(0);
            //4.创建一个单元格
            Cell cell = row1.createCell(0);
            cell.setCellValue("今日新增观众");
            Cell cell2 = row1.createCell(1);
            cell2.setCellValue("卢本伟");
    
            //创建行
            Row row2=sheet.createRow(1);
            //4.创建一个单元格
            Cell cell3 = row2.createCell(0);
            cell3.setCellValue("统计时间");
            Cell cell24= row2.createCell(1);
            String time=new DateTime().toString("yyyy-MM-dd HH:mm:ss");
            cell24.setCellValue(time);
    
            //生成一张表 03是xls 07是xlsx
            FileOutputStream fileOutputStream = new FileOutputStream(path + "\灰灰统计表07.xlsx");
            wordkbook.write(fileOutputStream);
    
            fileOutputStream.close();
            System.out.println("灰灰统计表07已生成");
        }
    
    
    }
    

    上面写完后会在项目目录下生成一个表格

    03 | 07 版本的写,就是对象不同,方法一样的!

    大数据写

    HSSF

    缺点:最多只能处理65536行,否则会抛出异常

    java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0…65535)

    优点:过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快

    @Test
    public void testWrite03BigData() throws IOException {
        long begin = System.currentTimeMillis();
    
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();
        for (int rowNum = 0; rowNum < 65535; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 10; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }
        System.out.println("over");
        FileOutputStream outputStream = new FileOutputStream(path + "//testWrite03BigData");
        workbook.write(outputStream);
        outputStream.close();
        long end = System.currentTimeMillis();
        System.out.println((double) (end-begin)/1000);
    
    
    }
    

    XSSF

    缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条

    优点:可以写较大的数据量,如20万条

    @Test
    public void testWrite07BigData() throws IOException {
        long begin = System.currentTimeMillis();
    
      Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet();
        for (int rowNum = 0; rowNum < 655350; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 10; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }
        System.out.println("over");
        FileOutputStream outputStream = new FileOutputStream(path + "//testWrite03BigData.xlsx");
        workbook.write(outputStream);
        outputStream.close();
        long end = System.currentTimeMillis();
        System.out.println((double) (end-begin)/1000);
    
    
    }
    

    SXSSF

    优点:可以写非常大的数据量,如100万条甚至更多条,写数据速度快,占用更少的内存

    注意:

    过程中会产生临时文件,需要清理临时文件

    默认由100条记录被保存在内存中,如果超过这数量,则最前面的数据被写入临时文件 如果想自定义内存中数据的数量,可以使用new SXSSFWorkbook ( 数量 )

    @Test
    public void testWrite07BigDataS() throws IOException {
        long begin = System.currentTimeMillis();
    
        Workbook workbook = new SXSSFWorkbook();
        Sheet sheet = workbook.createSheet();
        for (int rowNum = 0; rowNum < 100000; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 10; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }
        System.out.println("over");
        FileOutputStream outputStream = new FileOutputStream(path + "//testWrite07BigDataS.xlsx");
        workbook.write(outputStream);
        outputStream.close();
        ((SXSSFWorkbook)workbook).dispose();//关闭临时文件
        long end = System.currentTimeMillis();
        System.out.println((double) (end-begin)/1000);
    
    
    }
    

    SXSSFWorkbook-来至官方的解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入 非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。

    请注意,仍然可能会消耗大量内存,这些内存基于您正在使用的功能,例如合并区域,注释…仍然只存 储在内存中,因此如果广泛使用,可能需要大量内存。

    读取单一类型的数据

    这个操作跟上述的写并没有什么不同,不同就是方法是get而不是set

     static String path="F:\\demo\\javapoi\\demopoi";
           @Test
        public void testRead03() throws IOException {
    
    
            //Sheet sheet=workbook.createSheet("统计表");
            //sheet操作表中元素
            FileInputStream fileInputStream = new FileInputStream(path + "\灰灰统计表03.xls");
            Workbook workbook=new HSSFWorkbook(fileInputStream);
            Sheet sheet = workbook.getSheetAt(0);
    //        Sheet sheet2 = workbook.getSheet("灰灰统计表");
            Row row = sheet.getRow(1);
            Cell cell = row.getCell(0);
            Cell cell2 = row.getCell(1);
            System.out.println(cell.getStringCellValue());
            System.out.println(cell2.getStringCellValue());
            fileInputStream.close();
        }
    
    

    这里值得注意的是,使用表格对象要注意三种创建方式

    • POI-HSSF
    • POI-XSSF
    • SXSSF

    **HSSF:*Excel97-2003版本,扩展名为.xls。一个sheet最大行数*65536,最大列数256。

    **XSSF:*Excel2007版本开始,扩展名为.xlsx。一个sheet最大行数*1048576,最大列数16384。

    SXSSF:**是在XSSF基础上,POI3.8版本开始提供的**支持低内存占用的操作方式,扩展名为.xlsx。

    Excel版本兼容性是向下兼容

    读取不同类型的数据

    在读取数据的时候我们需要先判断值类型,才能用对应API

    下面这个是先拿到表头那一行,相当于数据库的字段

    image-20200423152206977

            FileInputStream fileInputStream = new FileInputStream(path + "数据表07.xlsx");
            Workbook workbook=new XSSFWorkbook(fileInputStream);
            Sheet sheet = workbook.getSheetAt(0);
            Row rowTitle = sheet.getRow(0);
            if(rowTitle!=null){
                int cellCount=rowTitle.getPhysicalNumberOfCells();    //拿到第row行的那一行的总个数
                for (int i = 0; i <cellCount ; i++) {  //循环个数取出
                    Cell cell = rowTitle.getCell(i);
                    if(cell!=null){          //如果不等于空取出值
                        int cellType = cell.getCellType();   //这里是知道我们标题是String,考虑不确定的时候怎么取
                        String cellValue = cell.getStringCellValue();
                        System.out.print(cellValue+"|");
                    }
                }
                System.out.println();
            }
    

    下面接着读取对应的数据,这里就需要我们刚刚讲的类型判断

    int cellType=cell.getCellType();利用这个,然后判断它的XSSFCell类型再具体输出

      //获取表中内容
            int rowCount=sheet.getPhysicalNumberOfRows();
            for(int rowNum=1;rowNum<rowCount;rowNum++){
                Row rowData=sheet.getRow(rowNum); //取出对应的行
                if(rowData!=null){
                    int cellCount=rowTitle.getPhysicalNumberOfCells();
                    for(int cellNum=0;cellNum<cellCount;cellNum++){
                        System.out.print("["+(rowNum+1+"-"+(cellNum+1)+"]"));
                        Cell cell = rowData.getCell(cellNum);
                        //匹配数据类型
                        if(cell!=null){
                            int cellType=cell.getCellType();
                            switch (cellType){
                                case XSSFCell.CELL_TYPE_STRING: System.out.print("字符串:"+cell.getStringCellValue());break;
                                case XSSFCell.CELL_TYPE_BOOLEAN: System.out.print("布尔:"+cell.getBooleanCellValue());break;
                                case XSSFCell.CELL_TYPE_NUMERIC:
                                    if(HSSFDateUtil.isCellDateFormatted(cell)){
                                        System.out.println("日期格式:"+new DateTime(cell.getDateCellValue()).toString("yyyy-MM-dd HH:mm:ss"));break;
                                    }else
                                        cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                                    System.out.print("整形:"+cell.toString());break;
                                case XSSFCell.CELL_TYPE_BLANK: System.out.print("空");break;
                                case XSSFCell.CELL_TYPE_ERROR: System.out.print("数据类型错误");break;
             case Cell.CELL_TYPE_FORMULA:
                                    //拿到计算公式
                                    XSSFFormulaEvaluator FormulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);
                                    String formula=cell.getCellFormula();
                                    System.out.println("公式:"+formula);
    
                                    //
                                    CellValue evaluate = FormulaEvaluator.evaluate(cell);
                                    String cellValue=evaluate.formatAsString();
                                    System.out.println(cellValue);
                                    break;
                                default:break;
                            }
                        }
                    }
                }
            }
    
    
            fileInputStream.close();
    

    展开全文
  • POI之setCellType操作数字类型

    万次阅读 2016-11-29 10:14:46
    POI之setCellType操作数字类型 你以为你以为的就是你以为的吗

           使用POI读取数字单元格的数据有两种方式:

    1.通过setCellType将单元格类型设置为字符串,然后通过getRichStringCellValue读取该单元格数据,然后将读取到的字符串转换为响应的数字类型,比如BigDecimal,int等,如何转换这里不再赘述

    2.通过setCellType将单元格类型设置为数字类型,然后通过getNumericCellValue读取该单元格数据


           但这里需要注意的是:由于excel自身底层的问题,在你设置单元格类型为数字类型的时候,该单元格底层类型可能还是 保持着最初的字符串类型,这个时候通过通过第二种方式将获取到不正确的数据,修改该单元格样式后再按下回车键将会消除这个问题(关于这个可以参考我的另外一篇“POI通过getDateCellValue读取excel中自定义日期失败),这种单元格会有个特点,你把鼠标移动到该单元格,将会有如下提示:


    看到了么,0.345单元格左边有个黄色提示,点开你可以将该单元格设置为数字类型,这时才真正完成该单元格数据类型的切换,可惜的是最初字符串格式转日期类型却没有这种提示!!

    展开全文
  • poi读取Excel日期为数字的解决方法

    千次阅读 2020-12-30 09:41:59
    解决poi读取Excel读出数字的问题,完整代码及数据
  • org.apache.poi 读取数字问题

    千次阅读 2019-07-12 08:46:11
    poi的配置maven配置: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId...
  • poi文本导出为数字

    2019-09-24 14:02:42
    用户要求导出的金额格式为数字,不能导出为文本 POI导出工具类 import com.platform.park.model.vo.carRecords.ExportOutOfYardVO; import io.swagger.annotations.ApiModelProperty; import org.apache.poi.hssf....
  • apache poi读取百分比数字

    千次阅读 2019-01-24 18:40:34
    需求说明: 最近用户给了一些基础数据,需要做导入操作,是临时性的,导一次...之前设计表单的时候,原本打算让用户录数字的,还好当时字段类型设置的是varchar2,字段没有设置成number,不然还得改字段类型。 但...
  •  通过POI取出的数值默认都是double,即使excel单元格中存的是1,取出来的值也是1.0,这就造成了一些问题,如果数据库字段是int,那么就会wrong data type,所以需要对数值类型处理。   Cell cell = ...
  • poi读取excel单元格的数字格式化

    千次阅读 2018-03-16 16:29:16
    我的需求是,在excel显示的啥导入进来就是啥但实际poi导入后,数字经常会转换为科学计数法,或者是莫名多了很多位小数 public static Object getCellValue(org.apache.poi.ss.usermodel.Cell hssfCell) { ...
  • POI解析EXCLE中的数字

    千次阅读 2015-02-26 15:28:43
    使用POI在进行解析EXCLE文档的时候,单元格中有数字类型,该数字可能是整形,浮点型,也有可能是货币类型,那么这个时候我们如何处理呢?  Apache给我们提供了解析单元格的集中基本格式,其中我们用CELL_TYPE_NUMERIC来用...
  • POI导入数字.0与科学计数解决 HSSFCell num= hssfRow.getCell(0); NumberFormat nf = NumberFormat.getInstance(); //这种方法对于自动加".0"的数字可直接解决 String s = nf.format(num.getNumericCellValue()); /...
  • java poi导入纯数字等格式问题

    千次阅读 2017-12-28 14:06:23
    poi导出excel时候,如果单元格设置纯数字,输入的数据一旦过大就是自动显示成科学记数法,导致导入后的数据出错,解决方式,后台获取导出文件后,强制转换单元格属性,就能完美解决,也适用于其他单元格格式引起的...
  • 在使用poi解析Excel文件时,会发现,表格中的日期解析出来是一个数字,如下: 这是Excel表格的截图: 这是poi解析出来的这个日期的结果: 我们期望这个日期解析出来是:2015/8/21,而结果却是42237.什么原因呢?这个...
  • 高德POI又名高德兴趣点,来源于高德地图,高德是中国领先的数字地图内容、导航和位置服务解决方 案提供商。拥有导航电子地图甲级测绘资质、测绘航空摄影甲级资质和互联网地图服务甲级测绘资质“三甲”资质,其优质...
  • poi读取excel时数字会加.0和自定义时间类型会变成数字时,读取到的单元格类型是CELL_TYPE_NUMERIC,即数值类型, 这个时候如果直接取值的话会发现取到的值和表格中的值不一样, 这时应该先判断值是否是数值类型,再...
  • poi导入excel数字出现精度问题

    千次阅读 2019-05-21 10:13:28
    但是这又会带来一个问题,那就是poi会把数字都变成double型,比如4会变成4.0,导入就会报错了,这时候我想要不先用cell.getStringCellValue()返回字符串判断是否有小数点,如果有小数点那么再用cell....
  • 当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型。 而且无论数字是否小数,使用cell.getNumbericCellValue() 去获取值的时候,会...
  • poi

    2018-03-12 12:29:00
    1POI操作Excel 1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,...
  • POI读取Excel日期时变为数字

    千次阅读 2017-10-26 16:52:51
    POI读取Excel中日期格式时,会遇到看见Excel中明明是日期时,后台读取反而变成了一串数字。这是当POI把日期数据归类为Cell.CELL_TYPE_NUMERIC 数字类型,其中POI就进行了转换。所以显示了数字。  想要转换成...
  • poi 导出Excel Date日期为数字解决方案

    万次阅读 2018-09-02 20:24:48
    开发环境: POI版本: 3.17 jdk 1.8 在用poi导出Excel的时候,数据库字段里面存储的是如下图的yyyy-MM...通过查看poi的api 的注释发现,setCellValue如果传递的是日期的类型, 那么会把日期变为数字, 你需要在打开Ex...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,902
精华内容 5,560
关键字:

poi数字