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>
相关推荐
2501_930707785 小时前
使用C#代码将 Excel 转换为 ODS,或将 ODS 转换为 Excel
excel
缺点内向6 小时前
如何在 C# .NET 中将 Markdown 转换为 PDF 和 Excel:完整指南
pdf·c#·.net·excel
m5655bj6 小时前
如何通过 Python 在 Excel 中添加或删除图片
python·excel
伍一516 小时前
芋道框架下的进销存升级(三):Yudao-ERP2异步导出/导入Excel的设计与实现
java·excel·异步导出excel
CodeCraft Studio6 小时前
Excel处理控件Aspose.Cells教程:使用C#在Excel中创建旭日图
c#·excel·aspose·excel旭日图·excel库·excel开发控件·excel api库
过期的秋刀鱼!7 小时前
Excel-数据分析开发心得(工具PQ,PP)与开发经验
大数据·数据分析·excel·模型搭建·数据优化·powerquery·powerpivot
凯子坚持 c7 小时前
CodeRider-Kilo 驱动下的 Python Excel 自动化开发全流程深度解析
python·自动化·excel
啊哈哈哈哈啊有1 天前
导出树形结构,excel
java·windows·excel
Dxy12393102161 天前
Elasticsearch 聚合入门:像 Excel 透视表一样分析数据
elasticsearch·excel
一位代码1 天前
Excel | .xls 与 .xlsx 文件的区别及使用 Excel 打开 CSV 文件出现乱码的解决办法
excel