• Apache POI实现Excel导入读取数据和写入数据并导出


    Apache POI

    POI介绍

    Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。

    maven坐标:

    <dependency>
      <groupId>org.apache.poigroupId>
      <artifactId>poiartifactId>
      <version>3.14version>
    dependency>
    <dependency>
      <groupId>org.apache.poigroupId>
      <artifactId>poi-ooxmlartifactId>
      <version>3.14version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    POI结构:

    HSSF - 提供读写Microsoft Excel XLS格式档案的功能
    XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能
    HWPF - 提供读写Microsoft Word DOC格式档案的功能
    HSLF - 提供读写Microsoft PowerPoint格式档案的功能
    HDGF - 提供读Microsoft Visio格式档案的功能
    HPBF - 提供读Microsoft Publisher格式档案的功能
    HSMF - 提供读Microsoft Outlook格式档案的功能
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    入门案例

    ExcelTest .java文件

    从Excel文件读取数据
    package tech.niua.common.utils;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.ss.usermodel.DataFormatter;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    import java.io.IOException;
    
    public class ExcelTest {
        public static void main(String[] args) throws IOException {
            //创建工作簿
            XSSFWorkbook workbook = new XSSFWorkbook("E:\\qcby_software\\测试数据\\test.xlsx");
            //获取工作表,既可以根据工作表的顺序获取,也可以根据工作表的名称获取
            XSSFSheet sheet = workbook.getSheetAt(0);
            //设置单元格类型,不设置有些number数据会报错
            sheet.setCellType(CellType.STRING);
            //遍历工作表获得行对象
            for (Row row : sheet) {
                //遍历行对象获取单元格对象
                for (Cell cell : row) {
                    //获得单元格中的值
                    String value = cell.getStringCellValue();
                    System.out.print(value +"  ");
                }
                System.out.println();
            }
            workbook.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    上面的入门案例可以看到,POI操作Excel表格封装了几个核心对象:

    XSSFWorkbook:工作簿
    XSSFSheet:工作表
    Row:行
    Cell:单元格
    
    • 1
    • 2
    • 3
    • 4

    上面案例是通过遍历工作表获得行,遍历行获得单元格,最终获取单元格中的值。

    还有一种方式就是获取工作表最后一个行号,从而根据行号获得行对象,通过行获取最后一个单元格索引,从而根据单元格索引获取每行的一个单元格对象,代码如下:

    package tech.niua.common.utils;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.ss.usermodel.DataFormatter;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    import java.io.IOException;
    
    public class ExcelTest {
        public static void main(String[] args) throws IOException {
            //创建工作簿
            XSSFWorkbook workbook = new XSSFWorkbook("E:\\qcby_software\\测试数据\\test.xlsx");
            //获取工作表,既可以根据工作表的顺序获取,也可以根据工作表的名称获取
            XSSFSheet sheet = workbook.getSheetAt(0);
            //设置单元格类型,不设置有些number数据会报错
            sheet.setCellType(CellType.STRING);
            //获取当前工作表最后一行的行号,行号从0开始
            int lastRowNum = sheet.getLastRowNum();
            for(int i=0;i<=lastRowNum;i++){
                //根据行号获取行对象
                XSSFRow row = sheet.getRow(i);
                short lastCellNum = row.getLastCellNum();
                for(short j=0;j<lastCellNum;j++){
                    String value = row.getCell(j).getStringCellValue();
                    System.out.print(value +"  ");
                }
                System.out.println();
            }
            workbook.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    注意:4.1.2版本的poi已经不在使用sheet.setCellType(CellType.STRING);这种对于读取到数据设置为String类型的这种形式,将不再支持

    <dependency>
    	<groupId>org.apache.poigroupId>
    	<artifactId>poiartifactId>
    	<version>4.1.2version>
    dependency>
    <dependency>
    	<groupId>org.apache.poigroupId>
    	<artifactId>poi-ooxmlartifactId>
    	<version>4.1.2version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    改为DataFormatter 来修改数据格式

    DataFormatter formatter = new DataFormatter();
    String value = formatter.formatCellValue(rowValue.getCell(j));
    
    • 1
    • 2

    修改后

    package tech.niua.common.utils;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.ss.usermodel.DataFormatter;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    import java.io.IOException;
    
    public class ExcelTest {
        public static void main(String[] args) throws IOException {
            //创建工作簿
            XSSFWorkbook workbook = new XSSFWorkbook("E:\\qcby_software\\测试数据\\test.xlsx");
            //获取工作表,既可以根据工作表的顺序获取,也可以根据工作表的名称获取
            XSSFSheet sheet = workbook.getSheetAt(0);
            //获取当前工作表最后一行的行号,行号从0开始
            int lastRowNum = sheet.getLastRowNum();
            for(int i=0;i<=lastRowNum;i++){
                //根据行号获取行对象
                XSSFRow row = sheet.getRow(i);
                short lastCellNum = row.getLastCellNum();
                for(short j=0;j<lastCellNum;j++){
                    DataFormatter formatter = new DataFormatter();
                    String value = formatter.formatCellValue(row.getCell(j));
                    System.out.print(value +"  ");
                }
                System.out.println();
            }
            workbook.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    运行效果

    image-20220726155346113

    image-20220726155512712

    在实际开发过程中,可以改造这个工具类,通过把excel上传后的地址传递给工具类来进行读取,读取后的值可以用集合的形式接收,或者以集合对象的形式接收,这样就能够对于读取到的数据做一个操作处理。

    向Excel文件写入数据

    使用POI可以在内存中创建一个Excel文件并将数据写入到这个文件,最后通过输出流将内存中的Excel文件下载到磁盘

    package tech.niua.common.utils.uuid;
    
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class ExcelTest2 {
        public static void main(String[] args) throws IOException {
            //在内存中创建一个Excel文件
            XSSFWorkbook workbook = new XSSFWorkbook();
            //创建工作表,指定工作表名称
            XSSFSheet sheet = workbook.createSheet("TEST表");
            //创建行,0表示第一行
            XSSFRow row = sheet.createRow(0);
            //创建单元格,0表示第一个单元格
            row.createCell(0).setCellValue("编号");
            row.createCell(1).setCellValue("名称");
            row.createCell(2).setCellValue("年龄");
    
            XSSFRow row1 = sheet.createRow(1);
            row1.createCell(0).setCellValue("1");
            row1.createCell(1).setCellValue("小明");
            row1.createCell(2).setCellValue("10");
    
            XSSFRow row2 = sheet.createRow(2);
            row2.createCell(0).setCellValue("2");
            row2.createCell(1).setCellValue("小王");
            row2.createCell(2).setCellValue("20");
    
            //通过输出流将workbook对象下载到磁盘
            FileOutputStream out = new FileOutputStream("E:\\qcby_software\\测试数据\\TEST表.xlsx");
            workbook.write(out);
            out.flush();
            out.close();
            workbook.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    测试结果

    image-20220726155920462

    image-20220726155938876

  • 相关阅读:
    Steam流用法:将list集合中具有相同属性的对象放入到一个新的list
    宝塔nginx搭建Ftp文件服务器
    linux安装Zookeeper3.5.7详解
    梯度提升算法和 XGBoost 使用
    业内人士真心话:只会测试没有前途的,我慌了......
    基于SSM+Vue的舞蹈网站
    从零实现的浏览器Web脚本
    Failed to start The nginx HTTP and reverse proxy server.
    C++学习---动态内存
    全国大数据与计算智能挑战赛:面向低资源的命名实体识别基线方案,排名13/64,组织单位:(大数据与决策实验室)
  • 原文地址:https://blog.csdn.net/m0_61820867/article/details/125996962