【Java】POI解析excel

一、相关介绍

POI技术

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

poi-ooxml能解析xls,xlsx。

poi能解析word、ppt、excel、xml等office软件

导入坐标:

XML 复制代码
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>3.17</version> 
</dependency>

二、使用案例

通过Poi操作Excel十分方便:

使用 WorkbookFactory类 的create()方法解析出excel所有数据

将一个Excel抽象为一个Workbook:

sheets 对象中保存了excel中所有的数据

一个表单页抽象为Sheet,表单中的一行抽象为Row,一行中的一个单元格可以抽象为Cell。

HSSFWorkbook对应的是97-03格式(.xls)
XSSFWorkbook对应的是07格式的(.xlsx)

Workbook的获取------可以通过WorkbookFactory

根据传入excel文件的类型来调用不同的实现类(子类):

WorkbookFactory------创建Workbook;

1、读:

java 复制代码
//Excel 解析 去读 写入 poi esaypoi

1、输入流加载excel文件
2、使用POI解析excel------ Workbook sheets = WorkbookFactory.create(fis)
    ------------ sheets 对象中保存了excel中所有的数据
3、获取指定sheet ------------ Sheet sheet = sheets.getSheetAt(0)
    ------------ getSheetAt------根据索引索取
4、获取所有row  ------------  Row row = sheet.getRow(3);//获取第四行
5、获取所有cell --------------- Cell cell = row.getCell(1);//获取第二列

  //getCell重载的方法【丢失单元格策略】:如果cell不是空,不做任何事;
  //如果单元格是空的,默认返回一个null,则new一个Cell()返回 保证不会报空指针
  Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);

6、获取所有cell中的内容------------ cell.getStringCellValue()

  cell.setCellType(CellType.STRING);//强行把cell的类型设置为String
  //防止报错:Cannot get a STRING value from a NUMERIC cell

2、写------回写 修改

回写------基于最大的sheets对象来回写 因为sheet、row、cell可能都有改动

回写可以写到已经有的文件或者不存在的文件:

如果是已经存在的文件,那么会清空再写进去,有风险

如果是不存在的文件,那么会新建

如果文件已经打开,那么写不进去

java 复制代码
public class WriteExcel {
    public static void main(String[] args) throws Exception {
      
        //2、修改excel
        //2.1创建流
        FileInputStream fis2 = new FileInputStream("src/test/resources/例子.xlsx");
        //2.2使用POI解析excel
        Workbook sheets = WorkbookFactory.create(fis2);
        fis2.close();
        //2.3 获取指定sheet
        Sheet sheet2 = sheets.getSheetAt(0);
        //2.4 获取指定row
        Row row2 = sheet2.getRow(3);
        //2.5 获取指定cell
        Cell cell2 = row2.getCell(1);
        //2.6 修改cell内容
        cell2.setCellValue("我安撕家");
        /*
        其实是把内容都拿到放在sheets里面,修改一个,再写进去,相当于删除掉重新写入
         */

        FileOutputStream fos2 = new FileOutputStream("src/test/resources/例子回写.xlsx");
        sheets.write(fos2);
    }
}

3、写------创建

java 复制代码
public class CreateExcelLearn {
//创建excel
0、在盘下创建一个文件夹
1、定义工作薄,创建HSSFWorkbook对象(excel的文档对象)
2、创建输出流
3、建立新的sheet对象(excel的表单)Sheet sheet = sheets.createSheet(sheet名称);
//        Row row = sheet.createRow(0);
//        Cell cell = row.createCell(0);
//        cell.setCellValue("具体要填写的内容");
4、将workbook写入流
5、关流

public static void main(String[] args) throws Exception {
/*
在盘下创建一个文件夹
*/
        String directory = "/Users..";
        File file = new File(directory);  // 创建文件夹对象
        if (!file.exists()) {// 如果不存在就创建
            file.mkdirs();
        }
            //HSSFWorkbook implements Workbook
            //1、定义工作薄,创建HSSFWorkbook对象(excel的文档对象)
            Workbook wb = new HSSFWorkbook();
            //2、创建输出流
            FileOutputStream fileout = new FileOutputStream("/Users/..创建.xls");

            // 3、建立新的sheet对象(excel的表单)
            Sheet sheet = wb.createSheet("Sheet页1");// 定义sheet页面
            // 4、在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一
            Row row = sheet.createRow(0);// 创建第一行
            Cell cell = row.createCell(0);// 创建一个单元格,第一列。
            cell.setCellValue("cy的第一行第一列");//设置值

            //5、设置第一行 第二列为3
            row.createCell(1).setCellValue(3);


            wb.createSheet("Sheet页2");// 定义sheet页面
            // 6、将workbook写入流
            wb.write(fileout);
            // 7、关闭输出流
       
            fileout.close();
    }
相关推荐
未若君雅裁35 分钟前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
cen__y1 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人1 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
阿维的博客日记2 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI2 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
郭涤生2 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS2 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言
卢锡荣2 小时前
单芯通吃,盲插标杆 —— 乐得瑞 LDR6020,Type‑C 全场景互联 “智慧芯”
c语言·开发语言·计算机外设
Xin_ye100862 小时前
C# 零基础到精通教程 - 第七章:面向对象编程(入门)——类与对象
开发语言·c#