SpringBoot使用poi或EasyExcel导入导出Excel文件

使用poi导入导出Excel

首先引入poi依赖包

03版本的Excel和07版本的Excel所需要的依赖不同,都需要导入。

记录问题

        最初导入的poi包为3.6版本。WorkBook类和Sheet类不能通过下面这种方法直接创建

        //1.创建工作簿
        Workbook workbook = new XSSFWorkbook();
        //2.创建一个工作表--sheet
        Sheet sheet =workbook.createSheet("自测sheet");

         需要通过下面这种方法细分,而这种方法创建的文件生成xlsx(07版)的文件时会导致文件损坏,将版本升值3.9后就可使用上面的方法创建工作簿,并可任意生成xls或xlsx文件而不损坏。

         //1.创建工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        //2.创建一个工作表--sheet
        HSSFSheet sheet =workbook.createSheet("自测sheet");
        <!-- 03版本Excel导入 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <!-- 07版本Excel导入 -->
        <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.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
            <version>4.12</version>
        </dependency>

poi导入导出Excel是先将数据全部写入内存中,再进行后续操作。因此可能会导致内存泄漏。

简单的创建一个表格

String path="D:\\Work\\IdeaProject\\boot05-web-admin";
        //1.创建工作簿(03版为HSSFWorkbook,07版为XSSFWorkbook 但好像可以混用(待确认))
        Workbook workbook = new XSSFWorkbook();
        //2.创建一个工作表--sheet
        Sheet sheet =workbook.createSheet("自测sheet");
        //3.创建一个行
        Row row=sheet.createRow(0);
        //4.创建一个单元格(1,1)
        Cell cell=row.createCell(0);
        cell.setCellValue("芜湖");
        //(1,2)
        Cell cell2=row.createCell(1);
        cell2.setCellValue("houbu");

        //创建第二行
        Row row2=sheet.createRow(1);
        Cell cell21=row2.createCell(0);
        cell21.setCellValue("起飞");

        Cell cell22=row2.createCell(1);
        cell22.setCellValue(2234);

        //生成一张表,使用07版本 使用xls结尾
        FileOutputStream fo=new FileOutputStream(path+"/ceshi.xlsx");
        workbook.write(fo);
        //关闭流
        fo.close();

        System.out.println("生成完毕");

Excel写入的几种方法

@Override
    public void BigDataWrite03() throws IOException{
        //03版的Excel写入
        long begin = System.currentTimeMillis();
        Workbook wb=new HSSFWorkbook();
        Sheet sheet=wb.createSheet();
        for (int i = 0; i < 65536; i++) {
            Row row=sheet.createRow(i);
            for (int i1 = 0; i1 < 10; i1++) {
                 Cell cell=row.createCell(i1);
                 cell.setCellValue(i1);
            }
        }
        FileOutputStream fo=new FileOutputStream(path+"/bigExcel03.xls");
        wb.write(fo);
        fo.close();
        long end = System.currentTimeMillis();

        System.out.println((long)(end-begin)/1000);
    }

    @Override
    public void BigDataWrite07() throws IOException {
        //07版方法速度慢,但可以写入更多数据
        long begin = System.currentTimeMillis();
        Workbook wb=new XSSFWorkbook();
        Sheet sheet=wb.createSheet();
        for (int i = 0; i < 100000; i++) {
            Row row=sheet.createRow(i);
            for (int i1 = 0; i1 < 10; i1++) {
                Cell cell=row.createCell(i1);
                cell.setCellValue(i1);
            }
        }
        FileOutputStream fo=new FileOutputStream(path+"/bigExcel07.xlsx");
        wb.write(fo);
        fo.close();
        long end = System.currentTimeMillis();
        System.out.println((long)(end-begin)/1000);
    }

    @Override
    public void BigDataWrite07S() throws IOException {
        //SXSSFWorkbook类是更快的07版本操作类,但在操作时会产生临时文件,记得删除
        long begin = System.currentTimeMillis();
        Workbook wb=new SXSSFWorkbook();
        Sheet sheet=wb.createSheet();
        for (int i = 0; i < 100000; i++) {
            Row row=sheet.createRow(i);
            for (int i1 = 0; i1 < 10; i1++) {
                Cell cell=row.createCell(i1);
                cell.setCellValue(i1);
            }
        }
        FileOutputStream fo=new FileOutputStream(path+"/bigExcel07s.xlsx");
        wb.write(fo);
        //删除写入时产生的临时文件
        ((SXSSFWorkbook)wb).dispose();
        fo.close();
        long end = System.currentTimeMillis();
        System.out.println((long)(end-begin)/1000);
    }

简单的读取Excel内容

 public void simpleExcelRead() throws IOException {
        //通过io读取文件
        FileInputStream io=new FileInputStream("D:\\Work\\IdeaProject\\boot05-web-admin\\ceshi.xlsx");
        //创建一个07版工作簿,excel的操作它都可以操作
        Workbook wb=new XSSFWorkbook(io);
        //得到表
        Sheet sheet= wb.getSheetAt(0);
        //得到列
        Row row = sheet.getRow(0);
        //得到行
        Cell cell=row.getCell(0);

        System.out.println(cell.getStringCellValue());
    }

读取Excel中的内容并判断其数据类型

 public void ExcelRead() throws IOException{
        FileInputStream io= new FileInputStream(path+"/Insert.xlsx");
        Workbook wb=new XSSFWorkbook(io);
        //获取第一个sheet页
        Sheet sheet=wb.getSheetAt(0);
        //获取第一行(一般是表头)
        Row rowTitle=sheet.getRow(0);
        if(rowTitle != null){
            //获取这行的cell数量
            int cellCount=rowTitle.getPhysicalNumberOfCells();
            //遍历获取表头内容
            for (int cellNum =0;cellNum<cellCount;cellNum++){
                Cell cell=rowTitle.getCell(cellNum);
                if(cell != null){
                    int cellType=cell.getCellType();
                    String value=cell.getStringCellValue();
                    System.out.println(cellType+"==>"+value);
                }
            }
            //获取当前sheet页中的总行数
            int rowCount=sheet.getPhysicalNumberOfRows();
            //遍历所有行的内容
            for(int rowNum=1;rowNum<rowCount;rowNum++){
                //跳过表头,从第二行开始获取
               Row row=sheet.getRow(rowNum);
               if(row != null){
                   //获取当前行的总列数
                    cellCount=row.getPhysicalNumberOfCells();
                    //遍历当前行的所有列的信息
                    for (int cellNum=0;cellNum<cellCount;cellNum++){
                        //拿取当前列
                        Cell cell=row.getCell(cellNum);
                        if(cell != null){
                            //获取列中内容的类型
                            int cellType=cell.getCellType();
                            String cellValue="";
                            //判断类型
                            switch (cellType){
                                case HSSFCell.CELL_TYPE_STRING://字符串
                                    cellValue=cell.getStringCellValue();
                                    System.out.println(cellNum+"这是字符串"+cellValue);
                                    break;
                                case HSSFCell.CELL_TYPE_BOOLEAN://boolean类型
                                    cellValue=String.valueOf(cell.getBooleanCellValue());
                                    System.out.println(cellNum+"boolean类型"+cellValue);
                                    break;
                                case HSSFCell.CELL_TYPE_NUMERIC://这是数字类型,但是包含数字和日期
                                    if (HSSFDateUtil.isCellDateFormatted(cell)){
                                        System.out.println("是日期");
                                        cellValue=String.valueOf(cell.getDateCellValue());
                                    }
                                    cellValue=String.valueOf(cell.getNumericCellValue());
                                    System.out.println(cellNum+"数字类型"+cellValue);
                                    break;
                                case HSSFCell.CELL_TYPE_BLANK://为空
                                    break;
                                case HSSFCell.CELL_TYPE_ERROR://错误
                                    System.out.println("数据类型错误");
                                    break;
                            }
                        }
                    }
               }
            }
        }
        io.close();
    }

使用EasyExcel进行操作:

导入依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.10</version>
        </dependency>

详情可参照官方文档:EasyExcel · 语雀

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值