I have two xlsx files at folder C:\\DemoFilesExcel\\demo1.xlsx and C:\\DemoFilesExcel\\demo2.xlsx.
I want to create a new xlsx C:\\DemoFilesExcel\\merged.xlsx that
This code can be used for merging two excels. It worked for me:
public static void mergeExcels(Workbook sourceExcel, Workbook destExcel) {
for(int sheetIndex = 0; sheetIndex < sourceExcel.getNumberOfSheets(); ++sheetIndex) {
Sheet sheet = sourceExcel.getSheetAt(sheetIndex);
if (destExcel.getSheet(sheet.getSheetName()) != null) {
destExcel.removeSheetAt(destExcel.getSheetIndex(sheet.getSheetName()));
}
Sheet outputSheet = destExcel.createSheet(sheet.getSheetName());
copySheets(outputSheet, sheet, true);
}
}
public static void copySheets(Sheet newSheet, Sheet sheet, boolean copyStyle) {
int maxColumnNum = 0;
Map styleMap = copyStyle ? new HashMap() : null;
int i;
List mergedRegions = new ArrayList();
for(i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); ++i) {
Row srcRow = sheet.getRow(i);
Row destRow = newSheet.createRow(i);
if (srcRow != null) {
copyRow(sheet, newSheet, srcRow, destRow, styleMap, mergedRegions);
if (srcRow.getLastCellNum() > maxColumnNum) {
maxColumnNum = srcRow.getLastCellNum();
}
}
}
for(i = 0; i <= maxColumnNum; ++i) {
newSheet.setColumnWidth(i, sheet.getColumnWidth(i));
}
}
public static void copyRow(Sheet srcSheet, Sheet destSheet, Row srcRow, Row destRow, Map styleMap, List mergedRegions ) {
destRow.setHeight(srcRow.getHeight());
for(int j = srcRow.getFirstCellNum(); j <= srcRow.getLastCellNum(); ++j) {
if (j >= 0) {
Cell oldCell = srcRow.getCell(j);
Cell newCell = destRow.getCell(j);
if (oldCell != null) {
if (newCell == null) {
newCell = destRow.createCell(j);
}
copyCell(oldCell, newCell, styleMap);
CellRangeAddress mergedRegion = getMergedRegion(srcSheet, srcRow.getRowNum(), (short)oldCell.getColumnIndex());
if (mergedRegion != null) {
CellRangeAddress newMergedRegion = new CellRangeAddress(mergedRegion.getFirstRow(), mergedRegion.getLastRow(), mergedRegion.getFirstColumn(), mergedRegion.getLastColumn());
if (isNewMergedRegion(newMergedRegion, mergedRegions)) {
mergedRegions.add(newMergedRegion);
destSheet.addMergedRegion(newMergedRegion);
}
}
}
}
}
}
public static void copyCell(Cell oldCell, Cell newCell, Map styleMap) {
if (styleMap != null) {
if (oldCell.getSheet().getWorkbook() == newCell.getSheet().getWorkbook()) {
newCell.setCellStyle(oldCell.getCellStyle());
} else {
int stHashCode = oldCell.getCellStyle().hashCode();
CellStyle newCellStyle = (CellStyle)styleMap.get(stHashCode);
if (newCellStyle == null) {
newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();
newCellStyle.cloneStyleFrom(oldCell.getCellStyle());
styleMap.put(stHashCode, newCellStyle);
}
newCell.setCellStyle(newCellStyle);
}
}
switch(oldCell.getCellType()) {
case 0:
newCell.setCellValue(oldCell.getNumericCellValue());
break;
case 1:
newCell.setCellValue(oldCell.getStringCellValue());
break;
case 2:
newCell.setCellFormula(oldCell.getCellFormula());
break;
case 3:
newCell.setCellType(3);
break;
case 4:
newCell.setCellValue(oldCell.getBooleanCellValue());
break;
case 5:
newCell.setCellErrorValue(oldCell.getErrorCellValue());
}
}
public static CellRangeAddress getMergedRegion(Sheet sheet, int rowNum, short cellNum) {
for(int i = 0; i < sheet.getNumMergedRegions(); ++i) {
CellRangeAddress merged = sheet.getMergedRegion(i);
if (merged.isInRange(rowNum, cellNum)) {
return merged;
}
}
return null;
}
private static boolean areAllTrue(boolean... values) {
for(int i = 0; i < values.length; ++i) {
if (!values[i]) {
return false;
}
}
return true;
}
private static boolean isNewMergedRegion(CellRangeAddress newMergedRegion, Collection mergedRegions) {
boolean isNew = true;
Iterator i$ = mergedRegions.iterator();
while(i$.hasNext()) {
CellRangeAddress add = (CellRangeAddress)i$.next();
boolean r1 = add.getFirstRow() == newMergedRegion.getFirstRow();
boolean r2 = add.getLastRow() == newMergedRegion.getLastRow();
boolean c1 = add.getFirstColumn() == newMergedRegion.getFirstColumn();
boolean c2 = add.getLastColumn() == newMergedRegion.getLastColumn();
if (areAllTrue(r1, r2, c1, c2)) {
isNew = false;
}
}
return isNew;
}