import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
public class MergeExcelSheets {
public static void main(String[] args) throws Exception {
// 指定合并后的目标文件名
String mergeFileName = "merged.xlsx";
// 指定所有需要合并的Excel文件名
String[] fileNames = {"file1.xlsx", "file2.xlsx", "file3.xlsx"};
}
/**
* 合并
* @param filePath 路径集合
* @param deleteFlag 是否删除后续文件
* @throws Exception
*/
public static void merge(String[] filePath,boolean deleteFlag) {
if (filePath.length <= 1){
return;
}
FileOutputStream output = null;
Workbook mergedWorkbook = null;
try {
List<Sheet> sheets = new ArrayList<>();
// 读取所有需要合并的Excel文件中的所有Sheet,放到一个列表中
for (int i=0;i<filePath.length;i++) {
FileInputStream input = new FileInputStream(new File(filePath[i]));
Workbook workbook = WorkbookFactory.create(input);
sheets.add(workbook.getSheetAt(0));
input.close();
}
// 新建一个目标工作簿和工作表
FileInputStream input = new FileInputStream(new File(filePath[0]));
mergedWorkbook = WorkbookFactory.create(input);
//Sheet mergedSheet = mergedWorkbook.createSheet(sheets.get(0).getSheetName());
// 在目标工作表中逐行逐列地复制所有源工作表中的内容
for (int k=1;k<sheets.size();k++) {
Sheet sheet = sheets.get(k);
int currentRowNum = 0;
Sheet mergedSheet = mergedWorkbook.createSheet(sheet.getSheetName());
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
if (row == null) {
continue;
}
Row mergedRow = mergedSheet.createRow(currentRowNum++);
for (int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j);
if (cell == null) {
continue;
}
Cell mergedCell = mergedRow.createCell(j);
if (cell.getCellStyle() != null){
CellStyle style = mergedWorkbook.createCellStyle();
style.cloneStyleFrom(cell.getCellStyle());
mergedCell.setCellStyle(style);
}
switch (cell.getCellType()) {
case BOOLEAN:
mergedCell.setCellValue(cell.getBooleanCellValue());
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
mergedCell.setCellValue(cell.getDateCellValue());
} else {
mergedCell.setCellValue(cell.getNumericCellValue());
}
break;
case STRING:
mergedCell.setCellValue(cell.getStringCellValue());
break;
case FORMULA:
mergedCell.setCellFormula(cell.getCellFormula());
break;
case BLANK:
case ERROR:
default:
// do nothing
break;
}
}
}
}
// 将目标工作簿中的内容输出到一个新的Excel文件中
output = new FileOutputStream(new File(filePath[0]));
mergedWorkbook.write(output);
}catch (Exception e){
e.printStackTrace();
}finally {
IOUtils.closeQuietly(mergedWorkbook);
IOUtils.closeQuietly(output);
if (deleteFlag){
for (int i = 1; i < filePath.length; i++) {
File file = new File(filePath[i]);
if (file.exists()){
file.delete();
}
}
}
}
}
/**
* 将多个excel合并到第一个excel
* @param filePath
* @throws Exception
*/
public static void merge(String[] filePath) {
merge(filePath,true);
}
}
每个excel仅复制第一个sheet页,
参考文档
Java用poi合并将多个Excel的多个sheet合并到一个sheet页(格式相同)? - 知乎 (zhihu.com)