Apache-poi
POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API
Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
所以POI的主要功能是可以用Java操作Microsoft Office的相关文件
但是一般我们都是用来操作Excel相关文件。
但是一般我们都是用来操作Excel相关文件。
- HSSF一读写Microsoft Excel XLS
 - XSSF一读写Microsoft Excel OOXML XLSX
 - HWPF一读写Microsoft Word DOC
 - HSLF一提供读写Microsoft PowerPoint
 
操作Excel文件区分版本: 2003版本(包含2003)以前的扩展名为.xls需要用HSSFWorkbook类操作 2007版本(包含2007)以后的扩展名为.xlsx需要用XSSFWorkbook类操作
工具类介绍
一个Excel文件。我们可以分为
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文件内容
展示代码
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();
        }
    }
}
异常
Excel中的单元格是数值类型,默认是number类型
设置所有的单元格数据格式为 String类型
// 设置单元格类型为String类型 
cell.setCellType(CellType.STRING);
写入操作
展示代码
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();
        }
    }
异常
这里选中的文件需要已存在
文件被其他进程使用,比如被工具打开,就会出现占用
重复操作,该操作是覆盖原Excel数据。不属于接着文件内容输入
重复操作,该操作是覆盖原Excel数据。不属于接着文件内容输入
关于文件的字符串 /
        // 因为指定文件  \ 这个字符 属于java的转义符号
        // 我们可以使用
        String path = "E:\TestFile\info.xlsx";
        String path1 = "E:/TestFile/info.xlsx";