• Java使用apache poi进行excel相关操作


    一.基本介绍

    1.1、Apache POI介绍

      Apache POI是一个可以进行微软的文档进行开源库,可以操作的文档类型包括word、ppt、excel、visio、outlook....

      本文主要针对Apache POI对excel的操作进行介绍,主要包括如何创建一个excel、录入数据、读取excel数据的方式。

      参考官方文档:

      1.首页:https://poi.apache.org/

      2.Excel文档介绍使用方式

    1.2、HSSF和XSSF

      在POI中,如果要操作Excel,可以有两种操作“模式”,分别是HSSF和XSSF,其中HSSF可以处理win97以及低于2007的excel,而XSSF可以用于处理2007以及更高的版本excel,所以我们一般都会使用XSSF。

      有一个很重要的术语:工作薄,其实可以理解为“文档”,excel、word,都属于工作簿,英文workbook。

    1.3、引入依赖

      只需要导入poi-ooxml这个库即可。

    <dependencies>
        <!-- poi库 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
    
        <!-- 示例以单元测试的形式,所以需要导入junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
    </dependencies>
    

    二.利用poi库创建excel

    2.1、创建一个空excel

      下面的代码运行后

    package cn.ganlixin.poi;
    
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.junit.Test;
    
    import java.io.*;
    
    public class CreateExcelTest {
    
        /**
         * 创建一个空的Excel文件
         */
        @Test
        public void testCreateEmptyExcel() throws IOException {
            // 创建文件
            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("data.xlsx"));
    
            // 创建工作簿类(所有要写入excel的数据,都将保存在workbook中)
            XSSFWorkbook workbook = new XSSFWorkbook();
    
            // 将workbook中的数据写入到文件中。
            workbook.write(outputStream);
    
            // 关闭
            workbook.close();
            outputStream.close();
        }
    }
    

      

    2.2、简单演示写入excel内容

      下面演示创建一个data.xlsx,并在“my-sheet-1”sheet内的第5行第3列写入一个“hello world”:

    package cn.ganlixin.poi;
    
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.junit.Test;
    
    import java.io.*;
    
    public class CreateExcelTest {
    
        /**
         * 简单演示如何写入数据内容
         */
        @Test
        public void testCreateSimpleWorkbook() throws IOException {
            // 指定创建的excel文件名称
            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("data.xlsx"));
    
            // 定义一个工作薄(所有要写入excel的数据,都将保存在workbook中)
            XSSFWorkbook workbook = new XSSFWorkbook();
    
            // 创建一个sheet
            XSSFSheet sheet = workbook.createSheet("my-sheet-1");
    
            // 开始写入数据流程,2大步:1、定位到单元格,2、写入数据;定位单元格,需要通过行、列配合指定。
            // step1: 先选择第几行(0表示第一行),下面表示在第6行
            XSSFRow row = sheet.createRow(5);
            // step2:选择第几列(0表示第一列),注意,这里的第几列,是在上面指定的row基础上,也就是第6行,第3列
            XSSFCell cell = row.createCell(2);
            // step3:设置单元格的数据(写入数据)
            cell.setCellValue("hello world");
    
            // 执行写入操作
            workbook.write(outputStream);
            workbook.close();
            outputStream.flush();
            outputStream.close();
        }
    }
    

      运行后,下面是生成的excel:

      

     2.3、通常的写入数据流程

      一般写入excel的数据都是结构化的(类似于数据库表的结构),下面是一个示例,创建一个users.xlsx文档:

    package cn.ganlixin.poi;
    
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.junit.Test;
    
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class CreateExcelTest {
    
        private static class User {
            private Integer id;
            private String name;
            private Integer age;
            private String addr;
    
            // 避免占用篇幅,所以省略了构造方法、getter、setter
        }
    
        /**
         * 写入结构化的用户信息数据
         */
        @Test
        public void testCreateUsersExcel() throws IOException {
    
            List<User> userList = new ArrayList<>();
            userList.add(new User(1, "abc", 99, "北京"));
            userList.add(new User(2, "lol", 77, "上海"));
            userList.add(new User(3, "qaq", 88, "深圳"));
            userList.add(new User(4, "owo", 66, "杭州"));
    
            // 指定创建的excel文件名称
            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("users.xlsx"));
    
            // 定义一个工作薄(所有要写入excel的数据,都将保存在workbook中)
            XSSFWorkbook workbook = new XSSFWorkbook();
    
            // 创建一个sheet
            XSSFSheet sheet = workbook.createSheet("my-sheet");
    
            // 第一行,为表头,需要单独写入,下面是错误方式,因为在反复的创建第1行(rowNumber为0)
            /*
            sheet.createRow(0).createCell(0).setCellValue("编号");
            sheet.createRow(0).createCell(1).setCellValue("姓名");
            sheet.createRow(0).createCell(2).setCellValue("年龄");
            sheet.createRow(0).createCell(3).setCellValue("城市");
             */
            // 正确方式
            XSSFRow head = sheet.createRow(0);
            head.createCell(0).setCellValue("编号");
            head.createCell(1).setCellValue("姓名");
            head.createCell(2).setCellValue("年龄");
            head.createCell(3).setCellValue("城市");
    
            // 接下来遍历要录入的数据(建议使用for,并且从第2行开始,也就是rowNumber为1,因为表头占了一行)
            for (int rowNumber = 1, index = 0; index < userList.size(); index++, rowNumber++) {
                User user = userList.get(index);
    
                // 写入数据流程,1、定位到单元格,2、写入数据;定位单元格,需要通过行、列配合指定。
                XSSFRow row = sheet.createRow(rowNumber);
                row.createCell(0).setCellValue(user.getId());
                row.createCell(1).setCellValue(user.getName());
                row.createCell(2).setCellValue(user.getAge());
                row.createCell(3).setCellValue(user.getAddr());
            }
    
            // 执行写入操作
            workbook.write(outputStream);
            workbook.close();
            outputStream.flush();
            outputStream.close();
    
        }
    }
    

      生成的excel如下:

      

    三.使用POI读取Excel内容

    3.1、读取excel示例

      下面针对上面创建的users.xlsx进行读取并打印

    package cn.ganlixin.poi;
    
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.junit.Test;
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class ReadExcelTest {
    
        @Test
        public void testReadUsersExcel() throws IOException {
            // 指定excel文件,创建缓存输入流
            BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("users.xlsx"));
    
            // 直接传入输入流即可,此时excel就已经解析了
            XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
    
            // 选择要处理的sheet名称
            XSSFSheet sheet = workbook.getSheet("my-sheet");
    
            // 第一行表头,单独处理
    
            // 迭代遍历sheet剩余的每一行
            for (int rowNum = 0; rowNum < sheet.getPhysicalNumberOfRows(); rowNum++) {
                if (rowNum == 0) { // 读取第一行(表头)
                    XSSFRow head = sheet.getRow(rowNum);
                    String headColumn_1 = head.getCell(0).getStringCellValue();
                    String headColumn_2 = head.getCell(1).getStringCellValue();
                    String headColumn_3 = head.getCell(2).getStringCellValue();
                    String headColumn_4 = head.getCell(3).getStringCellValue();
                    String headStr = String.format("%s	%s	%s	%s", headColumn_1, headColumn_2, headColumn_3, headColumn_4);
                    System.out.println(headStr);
    
                } else { // 非表头(注意读取的时候要注意单元格内数据的格式,要使用正确的读取方法)
                    XSSFRow row = sheet.getRow(rowNum);
                    int id = (int) row.getCell(0).getNumericCellValue();
                    String name = row.getCell(1).getStringCellValue();
                    int age = (int) row.getCell(2).getNumericCellValue();
                    String addr = row.getCell(3).getStringCellValue();
                    String rowContent = String.format("%s	%s	%s	%s", id, name, age, addr);
                    System.out.println(rowContent);
                }
            }
    
            workbook.close();
            inputStream.close();
        }
    }
    

      运行输出如下:

      

  • 相关阅读:
    CSP 训练赛0925
    赛道修建 NOIP 2018
    C
    B
    游戏得分 建立反图SPFA / bellman
    肥宅快乐树 换根+树形DP/dfs
    组合数例题
    龙珠雷达 双指针+DP
    面试-restful规范
    django-中间件
  • 原文地址:https://www.cnblogs.com/-beyond/p/12764501.html
Copyright © 2020-2023  润新知