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>
相关推荐
洋就在江州5 小时前
jeecgboot 使用apache poi excel导入带图片
java·apache·excel
腾蛇月猫9 小时前
Excel转VCF文件一键导入通讯录联系人信息
javascript·excel·vcf
best_scenery12 小时前
excel中加载数据分析工具的步骤
大数据·数据分析·excel
codeyanwu12 小时前
Excel 学习笔记
学习·excel·1024程序员节
CodeCraft Studio12 小时前
国产化Excel开发组件Spire.XLS教程:使用Python将CSV转换为XML(处理现实数据问题)
xml·python·excel·csv·spire.xls·csv转xml
superlls12 小时前
(场景题)Java 导出 Excel 的两种方式
java·开发语言·后端·excel
2501_9209555712 小时前
2025年损坏Excel文件修复工具推荐:一键恢复表格内容
excel
njsgcs12 小时前
图片转excel vlm 提取手写清单信息 Qwen/Qwen3-VL-235B-A22B-Instruct
excel
本贾尼1 天前
csv文件用Excel打开后出现乱码的问题及其解决方法
windows·excel
njsgcs1 天前
PDF信息vlm提取excel工具
pdf·excel