使用Java语言,引入依赖apache-poi中的Excel文档操作

前言:

|-------|--------------------|-------|
| HSSF | 针对于excel03之前版本 | .xls |
| XSSF | 针对于excel07之后版本 | .xlsx |
| SXSSF | 针对于excel07之后版本,升级版 | .xlsx |

apache-poi官网图片

首先引入相关文档:

java 复制代码
    <dependencies>
        <!--    03- 版本的excel .xls    -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!--   07+ 版本的excel .xlsx   -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
    </dependencies>

一、读取操作

目标excel文档如下:

  1. 获取通过文件流读取Excel的工作簿Workbook
  2. 通过workbook 获取工作表
  3. 通过sheet获取row行
  4. 通过row获取cell单元格
  5. 使用cell.getStringCellValue()获取单元格的值
java 复制代码
public static void main(String[] args) throws Exception {
        readExcel07();
//        readExcel07All();
    }

    /**
     * 使用文件流读取.xlsx中的某个数据
     * @throws Exception
     */
    public static void readExcel07() throws Exception{
        //1.通过文件流读取Excel工作部
        FileInputStream inputStream = new FileInputStream("./测试.xlsx");
        //2.获取工作簿
        Workbook workbook = new XSSFWorkbook(inputStream);
        //3.获取工作表
        Sheet sheet = workbook.getSheet("07xlsx版本");
        //4.获取行
        Row row = sheet.getRow(0);
        //5.获取列
        Cell cell = row.getCell(0);
//        RichTextString cellValue = cell.getRichStringCellValue();
        String cellValue = cell.getStringCellValue();
        System.out.println(cellValue);

        //关闭资源
        workbook.close();
        inputStream.close();

    }

    /**
     * 读取文件中所有的非空数据
     * @throws Exception
     */
    public static void readExcel07All() throws Exception{
        //1.通过文件流读取Excel工作部
        FileInputStream inputStream = new FileInputStream("./测试.xlsx");
        //2.获取工作簿
        Workbook workbook = new XSSFWorkbook(inputStream);
        //3.获取工作表
        Sheet sheet = workbook.getSheet("07xlsx版本");
        //4.获取行
        Row row = sheet.getRow(0);
        if(row!=null){
            for (int i = 0; i < row.getRowNum(); i++) {
                //5.获取列
                Cell cell = row.getCell(i);
                if(cell!=null){
                    System.out.print(cell.getStringCellValue() + "/t");
                }
            }
        }
        //关闭资源
        workbook.close();
        inputStream.close();

    }

运行结果如下:

二、使用依赖向excel中写入相关数据

java 复制代码
 public static void main(String[] args) throws Exception {
//        createDemoXLS();
        createDemoXLSX();
    }

    public static void createDemoXLS() throws Exception {
        //首先创建工作簿
        Workbook workbook = new HSSFWorkbook();
        //创建工作表
        Sheet sheet = workbook.createSheet("03xls版本");
        //创建第一行
        Row row = sheet.createRow(0);
        //创建单元格
        Cell cell0 = row.createCell(0);
        cell0.setCellValue("序号");
        Cell cell1 = row.createCell(1);
        cell1.setCellValue("商品名称");

        //创建第二行
        Row row1 = sheet.createRow(1);
        Cell cell10 = row1.createCell(0);
        cell10.setCellValue("0");
        Cell cell11 = row1.createCell(1);
        cell11.setCellValue("电脑");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream("./测试.xls");
        workbook.write(fileOutputStream);

        //关闭输出流
        workbook.close();
        fileOutputStream.close();

    }

    public static void createDemoXLSX() throws Exception {
        //首先创建工作簿
        Workbook workbook = new XSSFWorkbook();
        //创建工作表
        Sheet sheet = workbook.createSheet("07xlsx版本");
        //创建第一行
        Row row = sheet.createRow(0);
        //创建单元格
        Cell cell0 = row.createCell(0);
        cell0.setCellValue("序号");
        Cell cell1 = row.createCell(1);
        cell1.setCellValue("商品名称");

        //创建第二行
        Row row1 = sheet.createRow(1);
        Cell cell10 = row1.createCell(0);
        cell10.setCellValue("0");
        Cell cell11 = row1.createCell(1);
        cell11.setCellValue("平板");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream("./测试.xlsx");
        workbook.write(fileOutputStream);

        //关闭输出流
        workbook.close();
        fileOutputStream.close();

    }

三、批量插入

java 复制代码
    public static void main(String[] args) throws Exception {
//        BatchXlsInsert();
//        BatchXlsxInsert();
        BatchXlsxBigInsert();
    }

    //大内存插入数据 .xls 03-
    public static void BatchXlsInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new HSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("03测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./03BatchInsert.xls");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建03.xls耗时 ====> "+(end-start)/1000 + "s");
    }

    //大内存插入问题 07+ .xlsx
    public static void BatchXlsxInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new XSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("07测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./07BatchInsert.xlsx");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建07.xls耗时 ====>"+(end-start)/1000 + "s");
    }

    //大内存插入问题 07+ .xlsx 升级版
    public static void BatchXlsxBigInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new SXSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("07测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./07BatchBigInsert.xlsx");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建07.xls耗时 ====>"+(end-start)/1000 + "s");
    }
    public static void rowOriginSheet(Sheet sheet){
        //创建行
//        for (int i = 0; i < 65536; i++) {
        for (int i = 0; i < 1045536; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 20; j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue(j+1);
            }
        }
    }

其中,HSSFWorkbook只能插入少于65536行的数据,而XSSFWorkbook可以插入少于1045536条数据,但是其插入的速度较慢,因此使用SXSSF进行了升级,插入的速度更快。

相关推荐
淮北枳丶20 小时前
Apache POI 操作Word常用方法
java·word·apache
jessezappy1 天前
让Apache正确处理不同编码的文件避免中文乱码
中文乱码·apache·defaultcharset
Aloudata2 天前
从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?
大数据·apache·数据血缘·主动元数据·数据链路
小钱c72 天前
Mac下安装Apache JMeter并启动
jmeter·macos·apache
FserSuN4 天前
Apache Calcite - 查询优化之自定义优化规则
apache·calcite
黑风风4 天前
Ubuntu 22 安装 Apache Doris 3.0.3 笔记
笔记·ubuntu·apache
网络安全指导员4 天前
常见网络安全设备默认口令
服务器·网络·安全·web安全·php·apache
Mr_Xuhhh5 天前
Linux第一个小程序-进度条
linux·运维·visualstudio·小程序·编辑器·apache
风口上的吱吱鼠6 天前
20241031 Apache2修改日志里面的时间格式
服务器·apache
小刘同学++6 天前
在 Ubuntu 22.04 上部署Apache 服务, 访问一张照片
linux·ubuntu·apache