Java的poi工具类操作Excel

265 阅读4分钟

Apache-poi

POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API

Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

所以POI的主要功能是可以用Java操作Microsoft Office的相关文件

但是一般我们都是用来操作Excel相关文件。

但是一般我们都是用来操作Excel相关文件。

  1. HSSF一读写Microsoft Excel XLS
  2. XSSF一读写Microsoft Excel OOXML XLSX
  3. HWPF一读写Microsoft Word DOC
  4. HSLF一提供读写Microsoft PowerPoint

操作Excel文件区分版本: 2003版本(包含2003)以前的扩展名为.xls需要用HSSFWorkbook类操作 2007版本(包含2007)以后的扩展名为.xlsx需要用XSSFWorkbook类操作

image.png

工具类介绍

一个Excel文件。我们可以分为

image.png

POI中对应的操作类

操作类描述
XSSFWorkBook表示一个Excel文件,这个类主要操作后缀XLSX的excel文件
XSSFSheet表示一个Excel下的,一个工作页
Row表示一个工作页下的,一行数据
Cell表示一个行数据下的,一个单元格数据

操作类

这里只是展示部分,更多的操作,可以查看poi的官方文档

XSSFWorkBook(工作薄)

方法描述
new XSSFWorkBook()构造函数,根据传入 字符串:文件路径文件流:文件File,等获取一个Excel整体
getSheetAt(0);根据下标获取,工作薄下的工作表Sheet对象
getSheet("");根据 工作表名称 获取,工作薄下的工作表Sheet对象

Sheet(工作表)

方法描述
getLastRowNum()获取最后一个存在数据的行号,下标从0开始计算的。可以用于便利for-i循环
getRow()根据下表获取行对象 Row
直接forEache可以快速的循环遍历操作 for(Row row : sheet )

Row(行数据)

方法描述
直接forEache可以快速的循环遍历操作 for(Cell cell: row)
getCell()根据下表获取Cell对象,单元格数据
getRowNum()获取行号

Cell(单元格对象)

方法描述
getStringCellValue()获取单元格数据,返回String类型的
setCellType(CellType.STRING)设置单元格类型
getRow()获取所在行

读取操作

引入依赖

 <!--用于解析Excel文件-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

展示我的Excel文件内容

image.png

展示代码

​
public class ReadExcelPoi {
​
    public static void main(String[] args) {
​
        readExcel("E:\TestFile\poiTest.xlsx");
    }
​
    /**
     * 指定Excel文件路径打印文件内容
     *
     * @param excelPath excel的文件路径
     */
    public static void readExcel(String excelPath) {
​
        try {
            File file = new File(excelPath);
            //获得该文件的输入流
            FileInputStream stream = new FileInputStream(file);
​
            // 获取Excel 工作薄
            Workbook sheets = new XSSFWorkbook(stream);
            //获取一个工作表(sheet页),下标从0开始
            Sheet sheet = sheets.getSheetAt(0);
​
            // 遍历工作表中的所有行数据
            for (int i = 0; i <= sheet.getLastRowNum(); i++) {
                // 获取行数
                Row row = sheet.getRow(i);
                // 遍历工作表中的所有单元格数据
                for (Cell cell : row) {
​
                    //  如果单元格是数值类型默认 会是 number 类型。所以这里设置单元格都是String类型
                    cell.setCellType(CellType.STRING);
                    // 打印所有的单元格数据
                    System.out.print(cell.getStringCellValue());
                    System.out.print(" ");
                }
                System.out.println();
            }
            //关流
            sheets.close();
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
​

image.png

异常

Excel中的单元格是数值类型,默认是number类型

设置所有的单元格数据格式为 String类型

// 设置单元格类型为String类型 
cell.setCellType(CellType.STRING);

image.png

写入操作

展示代码

public class ReadExcelPoi {
​
    public static void main(String[] args) {
        importExcel();
    }
​
    /**
     * 将数据插入到指定Excel文件中
     */
    public static void importExcel() {
        try {
            //创建工作簿 类似于创建Excel文件
            XSSFWorkbook workbook = new XSSFWorkbook();
            //创建 sheetname页名
            XSSFSheet sheet = workbook.createSheet("员工信息");
            sheet.setColumnWidth(3, 20 * 256);//给第3列设置为20个字的宽度
            sheet.setColumnWidth(4, 20 * 256);//给第4列设置为20个字的宽度
            //创建一行,下标从0开始
            XSSFRow row = sheet.createRow(0);
            //创建这行中的列,下标从0开始 (表头)
            XSSFCell cell = row.createCell(0);
            // 给cell 0下表赋值
            cell.setCellValue("姓名");
            //创建这行中的列,并给该列直接赋值
            row.createCell(1).setCellValue("年龄");
            row.createCell(2).setCellValue("性别");
            row.createCell(3).setCellValue("生日");
            row.createCell(4).setCellValue("手机号");
            // 设置表里内容
            row = sheet.createRow(1);
            row.createCell(0).setCellValue("T");
            row.createCell(1).setCellValue("保密");
            row.createCell(2).setCellValue("男");
            row.createCell(3).setCellValue("保密");
            row.createCell(4).setCellValue("12121212121");
​
            row = sheet.createRow(2);
            row.createCell(0).setCellValue("T");
            row.createCell(1).setCellValue("18");
            row.createCell(2).setCellValue("女");
            row.createCell(3).setCellValue("2000-01-01");
            row.createCell(4).setCellValue("12121212122");
            //设定 路径
            File file = new File("E:\TestFile\info.xlsx");
            FileOutputStream stream = new FileOutputStream(file);
            // 需要抛异常
            workbook.write(stream);
            //关流
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​

image.png

异常

这里选中的文件需要已存在

image.png

文件被其他进程使用,比如被工具打开,就会出现占用

image.png

重复操作,该操作是覆盖原Excel数据。不属于接着文件内容输入

重复操作,该操作是覆盖原Excel数据。不属于接着文件内容输入

关于文件的字符串 /

        // 因为指定文件  \ 这个字符 属于java的转义符号
        // 我们可以使用
        String path = "E:\TestFile\info.xlsx";
        String path1 = "E:/TestFile/info.xlsx";