POI-OOXML入门

前面学习了word操作用到的POI-TL:
POI-TL入门

既然学了java对word的操作,那么excel也不能落下。
在这里插入图片描述

一、POI-OOXML定义

对excel处理的框架,处理excel2007版本以上的文档,是poi的升级版本,处理的单页数据量也是百万级别的。

二、使用POI-OOXML

2.1 依赖注入

<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.12</version>
</dependency>

2.2 基础操作

2.2.1 创建工作簿

Workbook workbook = new HSSFWorkbook();

2.2.2 新建sheet页

/**
* @sheetName : sheet页面 
**/
new Workbook.createSheet(String sheetName);
/**
* 以sheet+[n]增序的形式创建sheet页面 
**/
Sheet sheet = new Workbook.createSheet();

示例:

public void createSheetPage(String file) throws IOException {
        //新建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //创建sheet页
        //创建sheet页
        workbook.createSheet("测试页");
        workbook.createSheet("第二页");
        FileOutputStream fout = new FileOutputStream(file);

        workbook.write(fout);
        fout.close();
        workbook.close();
 }

效果:

模板结果
在这里插入图片描述在这里插入图片描述

注意
sheet页不会自动插入原有页之后,而是按顺序自动覆盖

2.2.3 新建行和列

创建的行和列都是从索引0开始,而且需先创建sheet页先。

//创建第n行
Row row = sheet.createRow(int n);
//新建第n个单元格
Cell cell = row.createCell(int n);
//设置单元格的值
cell.setCellValue("这是第一个单元格");

示例:

public void createRowAndCell(String file) throws IOException{
        //新建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //创建sheet页
        Sheet sheet =workbook.createSheet();
        //创建第一行
        Row row = sheet.createRow(0);
        //新建单元格
        Cell cell = row.createCell(0);
        cell.setCellValue("这是第一个单元格");

        FileOutputStream fout = new FileOutputStream(file);
        workbook.write(fout);
        fout.close();
        workbook.close();
    }

效果:
在这里插入图片描述

2.2.4 单元格格式化

除了单纯的文本单元格,有的时候我们还需要一些特殊的单元格,例如时间单元格。通过以下两个类即可实现:

CreationHelper :创建工具类
CellStyle : 单元格样式类
示例

public void createFormatCell(String file) throws IOException{
        //新建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //创建sheet页
        Sheet sheet =workbook.createSheet();
        //创建第一行
        Row row = sheet.createRow(0);
        //新建单元格
        Cell cell = row.createCell(0);
        cell.setCellValue(new Date());
        //获取工具类
        CreationHelper creationHelper = workbook.getCreationHelper();
        //单元格样式类
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
        cell.setCellStyle(cellStyle);
        FileOutputStream fout = new FileOutputStream(file);
        workbook.write(fout);
        fout.close();
        workbook.close();
    }

效果:
在这里插入图片描述

2.2.5 获取工作表

/**
* inputStream : 输入流
* */
HSSFWorkbook workbook = new HSSFWorkbook(InputStream inputStream)

2.2.6 获取sheet页

//获取第几页
workbook.getSheetAt(int page);

2.2.7 获取行

//获取第几行
sheet.getRow(rowNum);
//获取第一条数据的行数
sheet.getFirstRowNum();
//获取表格数据总行数
sheet.getPhysicalNumberOfRows()

示例 :

//获取sheet页
public void getRow(String fileName) throws IOException{
    File file = new File(fileName);
    if(!file.exists()){
        throw new IOException("文件不存在");
    }
    FileInputStream fin = new FileInputStream(file);
    //获取工作簿
    HSSFWorkbook workbook = new HSSFWorkbook(fin);
    //获取页
    HSSFSheet sheet = workbook.getSheetAt(0);
    //获取行
    HSSFRow row = sheet.getRow(0);
    System.out.println("第一行数据在第:"+sheet.getFirstRowNum()+"行");
    System.out.println("总行数:"+sheet.getPhysicalNumberOfRows());
}

效果:

在这里插入图片描述在这里插入图片描述

2.2.8 获取单元格

这个是获取excel数据的重点,要注意的是根据数据类型的不同,使用对应的转换数据方法。

  • 使用getCellType()获取单元格数据类型
数据类型
数字NUMERIC(CellType.NUMERIC)
字符串STRING(CellType.STRING)
布尔BOOLEAN(CellType.BOOLEAN)
  • 根据不同类型使用不同方法获取
getNumericCellValue();//获取数字类型单元格的值,返回double类型
getBooleanCellValue();//获取布尔类型单元格的值
getStringCellValue();//获取字符串类型单元格的值

excel中的日期数据会被识别为:NUMERIC类型,需要先根据格式判断,然后进行格式化处理

if(cell.getCellStyle().getDataFormatString().equals("yyyy-MM-dd HH:mm:ss")){
    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
}

示例:

//获取sheet页
public void getCellValue(String fileName) throws IOException{
    File file = new File(fileName);
    if(!file.exists()){
        throw new IOException("文件不存在");
    }
    FileInputStream fin = new FileInputStream(file);
    //获取工作簿
    HSSFWorkbook workbook = new HSSFWorkbook(fin);
    //获取第一页
    HSSFSheet sheet = workbook.getSheetAt(0);
    for ( int i = sheet.getFirstRowNum();i<=sheet.getLastRowNum();i++){
        //获取行
        HSSFRow row = sheet.getRow(i);
        if(row==null)
            continue;
        for(int j = row.getFirstCellNum();j<=row.getLastCellNum();j++){
            HSSFCell cell = row.getCell(j);
            if(cell==null)
                continue;
            Object object = null;
            switch (cell.getCellType()){
                case NUMERIC :
                    System.out.print("当前单元格为:数字类型,值为:");
                    if(cell.getCellStyle().getDataFormatString().equals("yyyy-MM-dd HH:mm:ss")){
                        object = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                    }else{
                        object = cell.getNumericCellValue();
                    }
                    break;
                case BOOLEAN:
                    System.out.print("当前单元格为:布尔类型,值为:");
                    object = cell.getBooleanCellValue();
                    break;
                default:
                    System.out.print("当前单元格为:字符串类型,值为:");
                    object = cell.getStringCellValue();
            }
            System.out.println(object);

        }
    }
}

效果:

在这里插入图片描述在这里插入图片描述

三、使用案例

3.1 导入示例

将文档的学生信息导入
在这里插入图片描述

public List<Student> getImportStudent(String fileName) throws IOException{
    File file = new File(fileName);
    if(!file.exists()){
        throw new IOException("文件不存在");
    }
    FileInputStream fin = new FileInputStream(file);
    //获取工作簿
    HSSFWorkbook workbook = new HSSFWorkbook(fin);
    //获取sheet页
    HSSFSheet sheet = workbook.getSheetAt(0);

    List<Student> students= new ArrayList<>();
    //取第一行的下一行
    for ( int i = sheet.getFirstRowNum()+1;i<=sheet.getLastRowNum();i++){
        //获取行
        HSSFRow row = sheet.getRow(i);
        if(row==null)
            continue;
        Student student = new Student();
        student.setName(row.getCell(0).getStringCellValue());
        student.setAge((int)row.getCell(1).getNumericCellValue());
        students.add(student);
    }
    return students;
}

3.2 导出示例

将数据写入到excel中

public void exportStudent(String fileName,List<Student> students) throws IOException{
        if(students.size()<=0){
            return ;
        }
        //新建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //创建sheet页
        Sheet sheet =workbook.createSheet();
        for(int i =0;i<students.size();i++){
            Row row = sheet.createRow(i);
            Cell cell1 = row.createCell(0);
            cell1.setCellValue(students.get(i).getName());
            Cell cell2 = row.createCell(1);
            cell2.setCellValue(students.get(i).getAge());
        }

        FileOutputStream fout = new FileOutputStream(fileName);
        workbook.write(fout);
        fout.close();
        workbook.close();
    }

效果:
在这里插入图片描述


补充

两个示例只是非常简单的演示了很基础的导入和导出,实际开发绝对没这么简单。

好了,基本就是这样,等后面有学习到新的知识再说。
在这里插入图片描述

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【poi-ooxml-***.jar中文文档.zip】 中包含: 中文文档:【poi-ooxml-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【poi-ooxml-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【poi-ooxml-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【poi-ooxml-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【poi-ooxml-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: poi-ooxml-***.jar中文文档.zip,java,poi-ooxml-***.jar,org.apache.poi,poi-ooxml,***,org.apache.poi.ooxml,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,apache,poi,ooxml,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【poi-ooxml-***.jar中文文档.zip】,再解压其中的 【poi-ooxml-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '***' Gradle (Short): implementation 'org.apache.poi:poi-ooxml:***' Gradle (Kotlin): implementation("org.apache.poi:poi-ooxml:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` org.apache.poi.ooxml org.apache.poi.ooxml.dev org.apache.poi.ooxml.extractor ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` org.apache.poi.ooxml.POIXMLDocument org.apache.poi.ooxml.POIXMLDocumentPart org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart ...... ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值