Excel文件按部门切分成多个文件

一、需求

1、文件夹按部门创建

2、文件名按原始文件名命名

二、代码实现

java 复制代码
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;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author xhm
 * @Date 2025 01 17 09 50
 **/

public class ExcelDataProcessing {
  public static void main(String[] args) {
    String inputFilePath = "管理版_投入部门工时汇总.xls";  // 输入的 Excel 文件路径
    String outputDirectory = "部门";  // 输出目录

    if (args.length >= 1) {
      inputFilePath = args[0];
    }
    if (args.length >= 2) {
      outputDirectory = args[1];
    }

    try (FileInputStream inputStream = new FileInputStream(new File(inputFilePath));
         Workbook inputWorkbook = new XSSFWorkbook(inputStream)) {

      Sheet inputSheet = inputWorkbook.getSheetAt(0);  // 获取第一个工作表
      String inputSheetName = inputSheet.getSheetName();  // 获取输入工作表的名称
      String inputFileName = new File(inputFilePath).getName();  // 获取输入 Excel 的文件名
      Map<String, Workbook> departmentWorkbooks = new HashMap<>();  // 存储不同部门的工作簿

      // 遍历每一行,假设第一行是标题行,从第二行开始处理数据
      for (int i = 1; i <= inputSheet.getLastRowNum(); i++) {
        Row row = inputSheet.getRow(i);
        if (row == null) continue;

        // 假设部门信息在第一列
        Cell departmentCell = row.getCell(2);
        if (departmentCell == null) continue;

        String department = departmentCell.getStringCellValue();
        // 如果该部门的工作簿还未创建,则创建一个新的工作簿
        if (!departmentWorkbooks.containsKey(department)) {
          Workbook departmentWorkbook = new XSSFWorkbook();
          Sheet departmentSheet = departmentWorkbook.createSheet(inputSheetName);  // 使用输入工作表的名称创建新工作表
          // 复制标题行
          Row titleRow = inputSheet.getRow(0);
          Row newTitleRow = departmentSheet.createRow(0);
          copyRow(titleRow, newTitleRow);
          departmentWorkbooks.put(department, departmentWorkbook);
        }

        // 获取该部门的工作簿和工作表
        Workbook departmentWorkbook = departmentWorkbooks.get(department);
        Sheet departmentSheet = departmentWorkbook.getSheet(inputSheetName);
        int lastRowNum = departmentSheet.getLastRowNum();
        Row newRow = departmentSheet.createRow(lastRowNum + 1);
        // 复制数据行
        copyRow(row, newRow);
      }

      // 保存每个部门的工作簿到以部门命名的文件夹中
      for (Map.Entry<String, Workbook> entry : departmentWorkbooks.entrySet()) {
        String department = entry.getKey();
        Workbook departmentWorkbook = entry.getValue();
        File departmentFolder = new File(outputDirectory, department);
        if (!departmentFolder.exists()) {
          departmentFolder.mkdirs();  // 创建部门文件夹
        }
        String outputFilePath = departmentFolder.getAbsolutePath() + File.separator + inputFileName;  // 保留输入 Excel 的文件名
        try (FileOutputStream outputStream = new FileOutputStream(outputFilePath)) {
          departmentWorkbook.write(outputStream);
        }
      }
    } catch (IOException e) {
      System.err.println("Error processing Excel file: " + e.getMessage());
    }
  }

  private static void copyRow(Row sourceRow, Row destinationRow) {
    for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
      System.out.println("代码执行中");
      Cell sourceCell = sourceRow.getCell(i);
      Cell destinationCell = destinationRow.createCell(i);
      if (sourceCell == null) continue;

      // 复制单元格样式
      CellStyle newCellStyle = destinationRow.getSheet().getWorkbook().createCellStyle();
      newCellStyle.cloneStyleFrom(sourceCell.getCellStyle());
      destinationCell.setCellStyle(newCellStyle);

      // 复制单元格内容
      switch (sourceCell.getCellType()) {
        case STRING:
          destinationCell.setCellValue(sourceCell.getStringCellValue());
          break;
        case NUMERIC:
          if (DateUtil.isCellDateFormatted(sourceCell)) {
            destinationCell.setCellValue(sourceCell.getDateCellValue());
          } else {
            destinationCell.setCellValue(sourceCell.getNumericCellValue());
          }
          break;
        case BOOLEAN:
          destinationCell.setCellValue(sourceCell.getBooleanCellValue());
          break;
        default:
          destinationCell.setCellValue("");
      }
    }
  }
}

三、依赖引用

XML 复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
相关推荐
星空的资源小屋2 天前
Digital Clock 4,一款免费的个性化桌面数字时钟
stm32·单片机·嵌入式硬件·电脑·excel
揭老师高效办公2 天前
在Excel和WPS表格中批量删除数据区域的批注
excel·wps表格
我是zxb2 天前
EasyExcel:快速读写Excel的工具类
数据库·oracle·excel
辣香牛肉面2 天前
[Windows] 搜索文本2.6.2(从word、wps、excel、pdf和txt文件中查找文本的工具)
word·excel·wps·搜索文本
ljf88382 天前
Java导出复杂excel,自定义excel导出
java·开发语言·excel
tebukaopu1482 天前
json文件转excel
json·excel
shizidushu2 天前
How to work with merged cells in Excel with `openpyxl` in Python?
python·microsoft·excel·openpyxl
Eiceblue3 天前
使用 C# 设置 Excel 单元格格式
开发语言·后端·c#·.net·excel
acaad3 天前
Apache Poi 实现导出excel表格 合并区域边框未完全显示的问题
spring·apache·excel
周杰伦fans3 天前
.NET 轻量级处理 Excel 文件库 - MiniExce
windows·.net·excel