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 小时前
Java 基于 POI 模板 Excel 导出工具类 双数据源 + 自动合并单元格 + 自适应行高 完整实战
java·开发语言·excel
开开心心就好1 天前
系统重装前必备的智能驱动备份工具
windows·计算机视觉·计算机外设·excel·模块测试·csdn开发云·威胁分析
向宇it2 天前
php高性能的导出excel读写扩展——xlswriter,比传统的Spreadsheet要快很多
php·excel·xlswriter
yanweijie03172 天前
对比VLOOKUP、XLOOKUP、INDEX+MATCH三大查找函数
excel
Codiggerworld2 天前
Vim的语法:删除、复制、粘贴,像说话一样自然
编辑器·vim·excel
Pentane.2 天前
【数据分析 | 农业项目】蔬菜类商品的自动定价与补货决策 | Tableau & Excel
数据挖掘·数据分析·excel·tableau
happy_baymax2 天前
Simulink 端口自动生成工具 (v2.1)(EXCEL+m语言)
服务器·matlab·excel·simulink
SunnyDays10112 天前
如何使用 C# 高效实现 Excel 与 CSV 的互相转换
c#·excel·csv
热爱生活的五柒2 天前
excel的使用教程
excel
城数派2 天前
2025年我国省市县三级的平均坡度数据(Excel\Shp格式)
arcgis·信息可视化·数据分析·excel