使用Javapoi将Excel表格一行拆分成两行的指南

在日常的数据处理工作中,我们常常需要对Excel表格进行各种操作。特别是,当我们需要将一行数据拆分成两行时,尤其是在数据格式不一致或者需要进一步处理的情况下,合理地使用Apache POI库可以大大简化这一过程。本文将详细介绍如何使用Javapoi来实现这一操作,并提供实际的代码示例以帮助读者理解。

1. Apache POI简介

Apache POI是一个强大的Java库,它允许开发人员从Java程序中读写Microsoft Office格式的文件,包括Excel、Word等。对于Excel,POI支持XLS(HSSF)和XLSX(XSSF)格式,极大地方便了Excel文件的操作。

优点

  • 开源免费:Apache POI是一个开源项目,可自由使用。
  • 跨平台:兼容Java平台,适用于多种环境。
  • 功能强大:支持各种复杂的Excel操作,诸如读取、写入、格式设置等。

2. 问题描述

假设我们有一个Excel文件,其中某些行包含合并的单元格或需要按特定规则拆分的数据。我们想要将某一行中的信息拆分成两行,以便更好地处理数据。

例如,假设我们的源数据如下:

姓名 年龄
张三 30
李四,王五 35

我们希望将“李四,王五”所在的行拆分成两行,最终结果如下:

姓名 年龄
李四 35
王五 35

3. 实现步骤

3.1 准备工作

首先,您需要在项目中引入Apache POI的相关依赖。使用Maven的项目可以在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version> <!-- 请检查最新版本 -->
</dependency>

3.2 代码实现

接下来我们将编写Java代码,将Excel表格的特定行拆分。以下是完整的代码示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelRowSplitter {

    public static void main(String[] args) {
        String inputFilePath = "input.xlsx";
        String outputFilePath = "output.xlsx";

        try {
            FileInputStream fis = new FileInputStream(new File(inputFilePath));
            Workbook workbook = new XSSFWorkbook(fis);
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

            for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                Row row = sheet.getRow(rowIndex);
                if (row != null) {
                    Cell nameCell = row.getCell(0);
                    Cell ageCell = row.getCell(1);
                    
                    // 检查是否需要拆分
                    if (nameCell != null && nameCell.getCellType() == CellType.STRING && nameCell.getStringCellValue().contains(",")) {
                        String[] names = nameCell.getStringCellValue().split(",");
                        int age = (int) ageCell.getNumericCellValue();

                        // 删除原行
                        sheet.removeRow(row);

                        // 插入新行
                        for (String name : names) {
                            Row newRow = sheet.createRow(rowIndex++);
                            newRow.createCell(0).setCellValue(name.trim());
                            newRow.createCell(1).setCellValue(age);
                        }
                    }
                }
            }

            FileOutputStream fos = new FileOutputStream(new File(outputFilePath));
            workbook.write(fos);
            fos.close();
            workbook.close();
            fis.close();

            System.out.println("行拆分成功,输出到: " + outputFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.3 代码解析

  • 读取Excel文件:通过FileInputStream读取指定路径的Excel文件。
  • 行遍历与拆分:循环遍历每一行,检查姓名单元格是否包含逗号。如果包含,则将其拆分,并将新的名字和年龄写入新行。
  • 写入新的Excel文件:通过FileOutputStream将修改后的工作簿保存为新的Excel文件。

4. 运行效果

运行以上代码后,您将在指定的输出路径找到拆分后的Excel文件,其内容与我们期望的结果一致。

5. 序列图

下面是使用 Mermaid 语法绘制的序列图,描述了程序的执行顺序:

sequenceDiagram
    participant User
    participant Excel
    participant Java Application

    User->>Java Application: 启动程序
    Java Application->>Excel: 读取 input.xlsx
    Excel-->>Java Application: 返回数据
    Java Application->>Java Application: 检查每一行
    Java Application->>Java Application: 拆分含逗号的姓名
    Java Application->>Excel: 新建行
    Excel-->>Java Application: 行插入成功
    Java Application->>Excel: 保存为 output.xlsx
    Excel-->>User: 输出结果

结论

使用Apache POI库,您可以轻松地对Excel文件进行各种复杂操作,包括将行拆分成多行。通过上述示例,您可以了解到如何实现这一功能并在实际项目中运用。希望本文能为您的数据处理工作提供一些帮助和启发。如果你有更多关于Apache POI的问题,欢迎随时交流!