POI操作Excel

发布于:2023-04-27 ⋅ 阅读:(235) ⋅ 点赞:(0)

一、什么是POI

Apache POI 是一种流行的API,可以使用Java读写MS Excel文件,可以使用Java读写MS Word和MS PowerPoint文件。

POI主要模块

模块名字 描述
HSSF 提供读写Microsoft Excel XLS格式(Microsoft Excel 97 (-2003))档案的功能
XSSF 提供读写Microsoft Excel OOXML XLSX格式(Microsoft Excel XML (2007+))档案的功能
SXSSF 提供低内存占用量读写Microsoft Excel OOXML XLSX格式档案的功能
HWPF 提供读写Microsoft Word DOC97格式(Microsoft Word 97 (-2003))档案的功能
XWPF 提供读写Microsoft Word DOC2003格式(WordprocessingML (2007+))档案的功能
HSLF/XSLF 提供读写Microsoft PowerPoint格式档案的功能
HDGF/XDGF 提供读Microsoft Visio格式档案的功能
HPBF 提供读Microsoft Publisher格式档案的功能
HSMF 提供读Microsoft Outlook格式档案的功能

二、操作Excel常用类

HSSFWorkbook excel文档对象

HSSFSheet excel的sheet

HSSFRow excel的行

HSSFCell excel的单元格

HSSFFont excel字体

HSSFName 名称

HSSFDataFormat 日期格式

HSSFHeader sheet头

HSSFFooter sheet尾

HSSFCellStyle cell样式

HSSFDateUtil 日期

HSSFPrintSetup 打印

HSSFErrorConstants 错误信息表

三、操作Excel

3.1、搭建环境

  • 创建Maven项目
    在这里插入图片描述
  • 导入依赖
 <dependencies>
   <!--easyexcel-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.0-beta2</version>
        </dependency>
        <!--        xls03版本-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <!--        xlsx07版本-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <!--        日期格式化工具-->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>
 </dependencies>

3.2、写操作

3.2.1、Excel.xls(03)版本写

  • 创建测试方法
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;

import java.io.FileOutputStream;

public class TestWrite {
    //生成的文档的地址为桌面
    String path = "C:\\Users\\彬彬\\Desktop\\";
    /**
     * 测试Excel.xls03版本
     */
    @Test
    public void writeXls03 () throws Exception {
        //创建文档对象
        Workbook wk =new HSSFWorkbook();

        //通过文档对象创建工作簿
        Sheet sheet = wk.createSheet();

        //通过工作簿对象创建行 0代表第一行
        Row row=sheet.createRow(0);
        //通过行对象创建列(单元格),0代表第一列
        Cell cell = row.createCell(0);
        cell.setCellValue("这是第一行第一列");
        Cell cell1 = row.createCell(1);
        cell1.setCellValue("这是第一行第二列");

        Row row1 = sheet.createRow(1);
        //通过行对象创建列(单元格),0代表第一列
        Cell cell2 = row1.createCell(0);
        cell2.setCellValue("这是第二行第一列");
        Cell cell13 = row1.createCell(1);
        cell13.setCellValue("这是第二行第二列");

        //通过流输出文档对象
        FileOutputStream fos = new FileOutputStream(path+"test.xls");

        //向文档对象传入流对象进行写操作
        wk.write(fos);
        System.out.println("写操作成功!!!");
        //关闭流
        fos.close();

    }
}

  • 执行代码后查看桌面是否生成xls(Excel03版本)文件
    在这里插入图片描述
  • 生成文件成功点击查看
    在这里插入图片描述
    xls文档有内容说明操作成功

大数据批量写操作(Excel.xls 03版本)

注意:03版本最多支持65536行数据,最大列256列

 /**
     * 03版 批量写
     * @throws Exception
     */
    @Test
    public void writeXls03d () throws Exception {
        //获得写操作开始时间
        long start=System.currentTimeMillis();

        //创建文档对象
        Workbook wk =new HSSFWorkbook();

        //通过文档对象创建工作簿
        Sheet sheet = wk.createSheet("测试表1");

        for (int rowNum = 0; rowNum <65535 ; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum <10 ; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }


        //通过流输出文档对象
        FileOutputStream fos = new FileOutputStream(path+"test1.xls");

        //向文档对象传入流对象进行写操作
        wk.write(fos);
        //获得写操作结束的时间
        long end = System.currentTimeMillis();
        System.out.println("批量写操作成功!!!");
        System.out.println("批量写操作总共用时:"+(double)(end-start)/1000+"秒");
        //关闭流
        fos.close();

    }
批量写操作成功!!!
批量写操作总共用时:2.43
  • 批量写成功

在这里插入图片描述

3.2.2、Excel.xls(07)版本写

当写的数量大于65536,我们可以使用XSSFWorkbook对象操作Excel.xlsx(07),最大数量可以写到1048576行,最大列数为16384列。

  • XSSFWorkbook对象实现少数量写
@Test
    public void writePoI07 () throws IOException {
        //row --行从0开始0代表第一行
        //cell --列 0开始,0代表第一列
        //创建工作簿
        Workbook wk = new XSSFWorkbook();
        //创建工作表
        Sheet sh = wk.createSheet("周先生统计表");
        //创建行(1,1)
        Row row = sh.createRow(0);
        //创建单元格
        Cell cell = row.createCell(0);
        //写数据
        cell.setCellValue("姓名");
        Cell cell1 = row.createCell(1);
        cell1.setCellValue("周彬彬");

        Row row2=sh.createRow(1);
        Cell cells=row2.createCell(0);
        cells.setCellValue("注册日期");
        Cell cell2 = row2.createCell(1);
        String date = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
        cell2.setCellValue(date);

        //创建文件流,生存一张表
        FileOutputStream fos = new FileOutputStream(path + "666.xlsx");
        //把文件写入工作簿中
        wk.write(fos);
        //关闭流
        fos.close();
        System.out.println("输出完毕!!!!!!");


    }

  • 少数量写成功

在这里插入图片描述

在这里插入图片描述

07版本大数量写

 @Test
    public void writeXls07d () throws Exception {
        //获得写操作开始时间
        long start=System.currentTimeMillis();

        //创建文档对象
        Workbook wk =new XSSFWorkbook();

        //通过文档对象创建工作簿
        Sheet sheet = wk.createSheet("07大数据写");

        for (int rowNum = 0; rowNum <100000 ; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum <10 ; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }


        //通过流输出文档对象
        FileOutputStream fos = new FileOutputStream(path+"testS.xls");

        //向文档对象传入流对象进行写操作
        wk.write(fos);
        //获得写操作结束的时间
        long end = System.currentTimeMillis();
        System.out.println("批量写操作成功!!!");
        System.out.println("批量写操作总共用时:"+(double)(end-start)/1000+"秒");
        //关闭流
        fos.close();

    }

批量写操作成功!!!
批量写操作总共用时:13.365

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

3.2.3、SXSSFWorkbook(07)写

如果像读写操作速度效率更高可以使用,SXSSFWorkbook对象。

 @Test
    public void writeXls07dS () throws Exception {
        //获得写操作开始时间
        long start=System.currentTimeMillis();

        //创建文档对象
        Workbook wk =new SXSSFWorkbook();

        //通过文档对象创建工作簿
        Sheet sheet = wk.createSheet("07大数据写");

        for (int rowNum = 0; rowNum <1000000 ; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum <10 ; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }


        //通过流输出文档对象
        FileOutputStream fos = new FileOutputStream(path+"testSS.xls");

        //向文档对象传入流对象进行写操作
        wk.write(fos);
        //获得写操作结束的时间
        long end = System.currentTimeMillis();
        System.out.println("批量写操作成功!!!");
        System.out.println("批量写操作总共用时:"+(double)(end-start)/1000+"秒");
        //关闭流
        fos.close();

    }

批量写操作成功!!!
批量写操作总共用时:11.427

在这里插入图片描述

3.3、读操作

3.3.1、Excel.xls(03)和Excel.xls(07)版本读

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;

public class ReadPol07 {
    String path ="C:\\Users\\彬彬\\Desktop\\666.xlsx";
    //读取不同类型的数据
    //07版本读
    @Test
    public void  readPOIs07Type() throws IOException {
        //获取文件流
        FileInputStream fis = new FileInputStream(path);

        // 创建一个工作簿。 使用excel能操作的这边他都可以操作!
        Workbook workbook = new XSSFWorkbook(fis);
        Sheet sheet = workbook.getSheetAt(0);
        // 获取标题内容
        Row rowTitle = sheet.getRow(0);
        if (rowTitle != null) {
            // 一定要掌握
            int cellCount = rowTitle.getPhysicalNumberOfCells(); // 拿到列数
            for (int cellNum = 0; cellNum < cellCount; cellNum++) { // 遍历
                Cell cell = rowTitle.getCell(cellNum);
                if (cell != null) {
                    int cellType = cell.getCellType();
                    String cellValue = cell.getStringCellValue();
                    System.out.print(cellValue + " | ");
                }
            }
            System.out.println();
        }
        // 获取表中的内容
        int rowCount = sheet.getPhysicalNumberOfRows(); //多少行
        for (int rowNum = 1; rowNum < rowCount; rowNum++) {
            Row rowData = sheet.getRow(rowNum);
            if (rowData != null) {
                // 读取列
                int cellCount = rowTitle.getPhysicalNumberOfCells();
                for (int cellNum = 0; cellNum < cellCount; cellNum++) {
                    System.out.print("[" + (rowNum + 1) + "-" + (cellNum + 1) + "]");
                    Cell cell = rowData.getCell(cellNum);
                    // 匹配列的数据类型
                    if (cell != null) {
                        int cellType = cell.getCellType();
                        String cellValue = "";
                        switch (cellType) {
                            case HSSFCell.CELL_TYPE_STRING: // 字符串
                                System.out.print("【String】");
                                cellValue = cell.getStringCellValue();
                                break;
                            case HSSFCell.CELL_TYPE_BOOLEAN: // 布尔
                                System.out.print("【BOOLEAN】");
                                cellValue = String.valueOf(cell.getBooleanCellValue());
                                break;
                            case HSSFCell.CELL_TYPE_BLANK: // 空
                                System.out.print("【BLANK】");
                                break;
                            case HSSFCell.CELL_TYPE_NUMERIC: // 数字(日期、普通数字)
                                System.out.print("【NUMERIC】");
                                if (HSSFDateUtil.isCellDateFormatted(cell)) { // 日期
                                    System.out.print("【日期】");
                                    Date date = cell.getDateCellValue();
                                    cellValue = new DateTime(date).toString("yyyy-MM-dd");
                                } else {
                                    // 不是日期格式,防止数字过长!
                                    System.out.print("【转换为字符串输出】");
                                    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                                    cellValue = cell.toString();
                                }
                                break;
                            case HSSFCell.CELL_TYPE_ERROR:
                                System.out.print("【数据类型错误】");
                                break;
                        }
                        System.out.println(cellValue);
                    }
                }
            }
        }
        fis.close();
    }
}



//03版本读把文档对象换成HSSFWorkbook,读取的文件类型改成.xls

Workbook workbook = new HSSFWorkbook();

String path ="C:\\Users\\彬彬\\Desktop\\666.xls";


四、EasyPOI

easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板语言(熟悉的表达式语法),完成以前复杂的写法.

参照官网学习:EasyPOI

本文含有隐藏内容,请 开通VIP 后查看