Excel文件按部门切分成多个文件
一、需求
1、文件夹按部门创建
2、文件名按原始文件名命名
二、代码实现
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("");
}
}
}
}
三、依赖引用
<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>