# java基础知识—POI的使用

java基础知识—POI

i.POI-Excel写操作

1.新建一个maven项目
2.添加依赖坐标
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<!--03(xls)-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>
<!--07(xlsx)-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>
<!--时间格式化依赖-->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.5</version>
</dependency>
3.代码实现
i.03版本
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\"; 
@Test
    public void testWrite03(){
        //1.创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //2.工作簿中创建一张表
        Sheet sheet = workbook.createSheet();
        //3.表中创建一个行,索引从零开始
        //第一行
        Row row1 = sheet.createRow(0);
        //4.行中创建一个单元格
        Cell cell1 = row1.createCell(0);
        cell1.setCellValue("qzp");
        Cell cell2 = row1.createCell(1);
        cell2.setCellValue("你加油啊!");
        Cell cell = row1.createCell(2);
        String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
        cell.setCellValue(time);
        //第二行
        Row row2 = sheet.createRow(1);
        //4.行中创建一个单元格
        Cell cell3 = row2.createCell(0);
        cell3.setCellValue("中国");
        Cell cell4 = row2.createCell(1);
        cell4.setCellValue("加油");
        Cell cell5 = row2.createCell(2);
        cell5.setCellValue(time);
         OutputStream outputStream = null;
        try {
            //生成一张表,使用IO流传输,03版本使用.xls结尾!
            outputStream = new FileOutputStream(basepath+"qzp工作表03.xls");
            //将数据写出到输出流中
            workbook.write(outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(outputStream!=null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
ii.07版本
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite07(){
    //1.创建一个工作簿
    Workbook workbook = new XSSFWorkbook();
    //2.工作簿中创建一张表
    Sheet sheet = workbook.createSheet();
    //3.表中创建一个行,索引从零开始
    //第一行
    Row row1 = sheet.createRow(0);
    //4.行中创建一个单元格
    Cell cell1 = row1.createCell(0);
    cell1.setCellValue("qzp");
    Cell cell2 = row1.createCell(1);
    cell2.setCellValue("你加油啊!");
    Cell cell = row1.createCell(2);
    String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
    cell.setCellValue(time);
    //第二行
    Row row2 = sheet.createRow(1);
    //4.行中创建一个单元格
    Cell cell3 = row2.createCell(0);
    cell3.setCellValue("中国");
    Cell cell4 = row2.createCell(1);
    cell4.setCellValue("加油");
    Cell cell5 = row2.createCell(2);
    cell5.setCellValue(time);
     OutputStream outputStream = null;
        try {
            //生成一张表,使用IO流传输,07版本使用.xlsx结尾!
            outputStream = new FileOutputStream(basepath+"qzp工作表07.xlsx");
            //将数据写出到输出流中
            workbook.write(outputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(outputStream!=null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
} 

ii.POI-Excel批量数据导入操作

1.03版本大文件写HSSFWorkbook
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite03BigData(){
    long begin = System.currentTimeMillis();
    //1.创建一个工作簿
    Workbook workbook = new HSSFWorkbook();
    //2.工作簿中创建一张表
    Sheet sheet = workbook.createSheet();
    //3.使用for循环模拟大量数据写入
    for (int rowNum = 0; rowNum < 65535; rowNum++) {
        //4.创建行
        Row row = sheet.createRow(rowNum);
        for (int cellNum = 0; cellNum < 10; cellNum++) {
            //5.创建单元格
            Cell cell = row.createCell(cellNum);
            //6.填写数据
            cell.setCellValue("第"+(cellNum+1)+"格");
        }
    }
    System.out.println("数据填写完成");
    OutputStream outputStream = null;
    try {
        //生成一张表,使用IO流传输,03版本使用.xls结尾!
        outputStream = new FileOutputStream(basepath+"qzp批量数据操作工作表03.xls");
        //将数据写出到输出流中
        workbook.write(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        if(outputStream!=null){
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    long end = System.currentTimeMillis();
    System.out.println("填写数据完毕的时间"+(end-begin));
}

缺点:最多只能处理65535行数据,否则就报异常信息

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

优点:过程中数据全部写入缓存,不操作磁盘,最有一次性写入到磁盘中,速度快

2.07版本大文件写XSSFWorkbook
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite07BigData(){
    long begin = System.currentTimeMillis();
    //1.创建一个工作簿
    Workbook workbook = new XSSFWorkbook();
    //2.工作簿中创建一张表
    Sheet sheet = workbook.createSheet();
    //3.使用for循环模拟大量数据写入
    for (int rowNum = 0; rowNum < 1000000; rowNum++) {
        //4.创建行
        Row row = sheet.createRow(rowNum);
        for (int cellNum = 0; cellNum < 10; cellNum++) {
            //5.创建单元格
            Cell cell = row.createCell(cellNum);
            cell.setCellValue("第"+(cellNum+1)+"格");
        }
    }
    System.out.println("数据填写完成");
    OutputStream outputStream = null;
    try {
        //生成一张表,使用IO流传输,07版本使用.xlsx结尾!
        outputStream = new FileOutputStream(basepath+"qzp批量数据操作工作表03.xlsx");
        //将数据写出到输出流中
        workbook.write(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        if(outputStream!=null){
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    long end = System.currentTimeMillis();
    System.out.println("填写数据完毕的时间"+(end-begin));
}

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

优点:可以写入较大的数据量

3.07版本升级版大文件写SXSSFWorkbook
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite07BigDataPlus(){
    long begin = System.currentTimeMillis();
    //1.创建一个工作簿
    Workbook workbook = new SXSSFWorkbook();
    //2.工作簿中创建一张表
    Sheet sheet = workbook.createSheet();
    //3.使用for循环模拟大量数据写入
    for (int rowNum = 0; rowNum < 1000000; rowNum++) {
        //4.创建行
        Row row = sheet.createRow(rowNum);
        for (int cellNum = 0; cellNum < 10; cellNum++) {
            //5.创建单元格
            Cell cell = row.createCell(cellNum);
            //6.填写数据
            cell.setCellValue("第"+(cellNum+1)+"格");
        }
    }
    System.out.println("数据填写完成");
    OutputStream outputStream = null;
    try {
        //生成一张表,使用IO流传输,07版本使用.xlsx结尾!
        outputStream = new FileOutputStream(basepath+"qzp批量数据操作工作表03.xlsx");
        //将数据写出到输出流中
        workbook.write(outputStream);
        //清除临时文件
        ((SXSSFWorkbook) workbook).dispose();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        if(outputStream!=null){
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    long end = System.currentTimeMillis();
    System.out.println("填写数据完毕的时间"+(end-begin));
}

优点:

  • 可以写入较大的数据量,如100万条数据甚至更多,写的速度非常块,占用更少内存
  • 可以自定义数据量的大小,使用new SXSSFWorkbook(数据量大小)

缺点:

  • 过程中会产生临时文件,需要及时清理临时文件
  • 默认上限写100条记录被保存到内存中,如果超过这数量,则之前写入的文件会被写入到临时文件中
  • 注意,可能会消耗大量内存,这些内存基于你正在使用的功能,如合并区域,注释…仍然只存储在内存中,广泛使用,可能需要大量内存

注意事项:

  • 03版和07版的文件后缀不一样,03版本使用.xls结尾,07版本使用.xlsx结尾!
  • 03版和07版的创建工作簿对象不一样
  • 03版行数有限制,只有65535行,07版行数限制(1048575)

iii.POI-Excel读操作

代码实现

i.03版本
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void test03Read(){
    //1.创建读取文件的流对象
    FileInputStream fileInputStream = null;
    try {
        //2.将表中数据加载到流对象中
        fileInputStream = new FileInputStream(basepath + "qzp工作表03.xls");
        // 3.创建一个工作簿,将流中的表加入到工作簿中
        Workbook Workbook = new HSSFWorkbook(fileInputStream);
        //4.获取表,通过下标获取,也可以通过表名
        Sheet sheet = Workbook.getSheetAt(0);
        //5.获取表中的行
        Row row = sheet.getRow(0);
        //6.获取行中的单元格
        Cell cell = row.getCell(0);
        //7.获取单元格的内容,需要根据单元格的数据的类型进行对应的数据获取,否则类型异常
        String value = cell.getStringCellValue();
        System.out.println(value);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(fileInputStream != null){
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
ii.07版本
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void test07Read(){
    //1.创建读取文件的流对象
    FileInputStream fileInputStream = null;
    try {
        //2.将表中数据加载到流对象中
        fileInputStream = new FileInputStream(basepath + "qzp工作表07.xlsx");
        // 3.创建一个工作簿,将流中的表加入到工作簿中
        Workbook Workbook = new XSSFWorkbook(fileInputStream);
        //4.获取表,通过下标获取,也可以通过表名
        Sheet sheet = Workbook.getSheetAt(0);
        //5.获取表中的行
        Row row = sheet.getRow(0);
        //6.获取行中的单元格
        Cell cell = row.getCell(0);
        //7.获取单元格的内容,需要根据单元格的数据的类型进行对应的数据获取,否则类型异常
        String value = cell.getStringCellValue();
        System.out.println(value);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(fileInputStream != null){
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

iv.POI-Excel批量数据导出操作

代码实现

//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testCellType(){
    //1.创建读取文件的流对象
    FileInputStream fileInputStream = null;
    try {
        //2.将表中数据加载到流对象中
        fileInputStream = new FileInputStream(basepath + "qzp.xlsx");
        // 3.创建一个工作簿,将流中的表加入到工作簿中
        Workbook Workbook = new XSSFWorkbook(fileInputStream);
        //4.获取表的标题内容,通过下标获取,也可以通过表名
        Sheet sheet = Workbook.getSheetAt(0);
        //5.获取表中的行的总数
        int rowCount = sheet.getPhysicalNumberOfRows();
        for (int rowNum = 0; rowNum < rowCount; rowNum++) {
            //6.获取每一行的数据
            Row row = sheet.getRow(rowNum);
            if(row != null){
                //6.读取一整行数据中的列数总合
                int cellCount = row.getPhysicalNumberOfCells();
                for (int cellNum = 0; cellNum < cellCount; cellNum++) {
                    //7.获取每一个单元格
                    Cell cell = row.getCell(cellNum);
                    //System.out.println("【"+(rowNum+1)+"-"+(cellNum+1)+"】");
                    if (cell != null) {
                        int cellType = cell.getCellType();
                        String cellValue = "";
                        switch (cellType){
                            case HSSFCell.CELL_TYPE_STRING://-字符串
                                System.out.print("【String】");
                                cellValue = cell.getStringCellValue();
                                break;
                            case HSSFCell.CELL_TYPE_BOOLEAN://-布尔
                                System.out.print("【Boolean】");
                                cellValue = cell.getStringCellValue();
                                break;
                            case HSSFCell.CELL_TYPE_BLANK://-空
                                System.out.print("【Blank】");
                                break;
                            case HSSFCell.CELL_TYPE_NUMERIC://-数字(包含日期,普通数字)
                                System.out.print("【Number】");
                                if(HSSFDateUtil.isCellDateFormatted(cell)){
                                    System.out.print("【Date】");//-日期
                                    Date dateCellValue = cell.getDateCellValue();
                                    cellValue = new DateTime(dateCellValue).toString("yyyy-MM-dd");
                                }else {
                                    //避免数字过长,无法显示,故转化成字符串
                                    System.out.print("【数字需要转换成字符串输出】");
                                    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                                    cellValue = cell.toString();
                                }
                                break;
                            case HSSFCell.CELL_TYPE_ERROR://-错误
                                System.out.print("【Error】");
                                break;
                        }
                        System.out.println(cellValue);
                    }
                }
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(fileInputStream != null){
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

v.计算公式

//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testFormuls(){
    //1.创建读取文件的流对象
    FileInputStream fileInputStream = null;
    try {
        //2.将表中数据加载到流对象中
        fileInputStream = new FileInputStream(basepath + "qzp计算公式.xls");
        // 3.创建一个工作簿,将流中的表加入到工作簿中
        Workbook workbook = new HSSFWorkbook(fileInputStream);
        //4.获取表,通过下标获取,也可以通过表名
        Sheet sheet = workbook.getSheetAt(0);
        //5.获取表中的索引指代的行
        Row row = sheet.getRow(4);
        //6.获取当前的单元格
        Cell cell = row.getCell(0);
        //7.获取到计算公式
        FormulaEvaluator formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) workbook);
        //8.获取单元格的内容的类型
        int cellType = cell.getCellType();
        System.out.println(cellType);
        switch (cellType){
            case Cell.CELL_TYPE_FORMULA://公式
                String cellFormula = cell.getCellFormula();
                System.out.println(cellFormula);

                //计算
                CellValue evaluate = formulaEvaluator.evaluate(cell);
                String cellvalue = evaluate.formatAsString();
                System.out.println(cellvalue);
                break;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(fileInputStream != null){
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QZP51ZX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值