如何使用 Apache POI 将 HSSFWorkbook 转换为 XSSFWorkbook?

发布于 2024-12-02 02:11:27 字数 262 浏览 1 评论 0原文

如何转换

org.apache.poi.hssf.usermodel.HSSFWorkbook

org.apache.poi.xssf.usermodel.XSSFWorkbook

Apache POI?

环境:

  • JSE1.6
  • JBossAS 4.3.2
  • POI 3.7

How to convert

org.apache.poi.hssf.usermodel.HSSFWorkbook

to

org.apache.poi.xssf.usermodel.XSSFWorkbook

in Apache POI?

Environment :

  • JSE1.6
  • JBossAS 4.3.2
  • POI 3.7

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

数理化全能战士 2024-12-09 02:11:27

此代码改编自我在 Coderanch 论坛

public final class ExcelDocumentConverter {
public static XSSFWorkbook convertWorkbookHSSFToXSSF(HSSFWorkbook source) {
    XSSFWorkbook retVal = new XSSFWorkbook();
    for (int i = 0; i < source.getNumberOfSheets(); i++) {
        XSSFSheet xssfSheet = retVal.createSheet();
        HSSFSheet hssfsheet = source.getSheetAt(i);
        copySheets(hssfsheet, xssfSheet);
    }
    return retVal;
}

public static void copySheets(HSSFSheet source, XSSFSheet destination) {
    copySheets(source, destination, true);
}

/**
 * @param destination
 *            the sheet to create from the copy.
 * @param the
 *            sheet to copy.
 * @param copyStyle
 *            true copy the style.
 */
public static void copySheets(HSSFSheet source, XSSFSheet destination, boolean copyStyle) {
    int maxColumnNum = 0;
    Map<Integer, HSSFCellStyle> styleMap = (copyStyle) ? new HashMap<Integer, HSSFCellStyle>() : null;
    for (int i = source.getFirstRowNum(); i <= source.getLastRowNum(); i++) {
        HSSFRow srcRow = source.getRow(i);
        XSSFRow destRow = destination.createRow(i);
        if (srcRow != null) {
            copyRow(source, destination, srcRow, destRow, styleMap);
            if (srcRow.getLastCellNum() > maxColumnNum) {
                maxColumnNum = srcRow.getLastCellNum();
            }
        }
    }
    for (int i = 0; i <= maxColumnNum; i++) {
        destination.setColumnWidth(i, source.getColumnWidth(i));
    }
}

/**
 * @param srcSheet
 *            the sheet to copy.
 * @param destSheet
 *            the sheet to create.
 * @param srcRow
 *            the row to copy.
 * @param destRow
 *            the row to create.
 * @param styleMap
 *            -
 */
public static void copyRow(HSSFSheet srcSheet, XSSFSheet destSheet, HSSFRow srcRow, XSSFRow destRow,
        Map<Integer, HSSFCellStyle> styleMap) {
    // manage a list of merged zone in order to not insert two times a
    // merged zone
    Set<CellRangeAddressWrapper> mergedRegions = new TreeSet<CellRangeAddressWrapper>();
    destRow.setHeight(srcRow.getHeight());
    // pour chaque row
    for (int j = srcRow.getFirstCellNum(); j <= srcRow.getLastCellNum(); j++) {
        HSSFCell oldCell = srcRow.getCell(j); // ancienne cell
        XSSFCell newCell = destRow.getCell(j); // new cell
        if (oldCell != null) {
            if (newCell == null) {
                newCell = destRow.createCell(j);
            }
            // copy chaque cell
            copyCell(oldCell, newCell, styleMap);
            // copy les informations de fusion entre les cellules
            // System.out.println("row num: " + srcRow.getRowNum() +
            // " , col: " + (short)oldCell.getColumnIndex());
            CellRangeAddress mergedRegion = getMergedRegion(srcSheet, srcRow.getRowNum(),
                    (short) oldCell.getColumnIndex());

            if (mergedRegion != null) {
                // System.out.println("Selected merged region: " +
                // mergedRegion.toString());
                CellRangeAddress newMergedRegion = new CellRangeAddress(mergedRegion.getFirstRow(),
                        mergedRegion.getLastRow(), mergedRegion.getFirstColumn(), mergedRegion.getLastColumn());
                // System.out.println("New merged region: " +
                // newMergedRegion.toString());
                CellRangeAddressWrapper wrapper = new CellRangeAddressWrapper(newMergedRegion);
                if (isNewMergedRegion(wrapper, mergedRegions)) {
                    mergedRegions.add(wrapper);
                    destSheet.addMergedRegion(wrapper.range);
                }
            }
        }
    }

}

/**
 * @param oldCell
 * @param newCell
 * @param styleMap
 */
public static void copyCell(HSSFCell oldCell, XSSFCell newCell, Map<Integer, HSSFCellStyle> styleMap) {
    if (styleMap != null) {
        int stHashCode = oldCell.getCellStyle().hashCode();
        HSSFCellStyle sourceCellStyle = styleMap.get(stHashCode);
        XSSFCellStyle destnCellStyle = newCell.getCellStyle();
        if (sourceCellStyle == null) {
            sourceCellStyle = oldCell.getSheet().getWorkbook().createCellStyle();
        }
        destnCellStyle.cloneStyleFrom(oldCell.getCellStyle());
        styleMap.put(stHashCode, sourceCellStyle);
        newCell.setCellStyle(destnCellStyle);
    }
    switch (oldCell.getCellType()) {
    case HSSFCell.CELL_TYPE_STRING:
        newCell.setCellValue(oldCell.getStringCellValue());
        break;
    case HSSFCell.CELL_TYPE_NUMERIC:
        newCell.setCellValue(oldCell.getNumericCellValue());
        break;
    case HSSFCell.CELL_TYPE_BLANK:
        newCell.setCellType(HSSFCell.CELL_TYPE_BLANK);
        break;
    case HSSFCell.CELL_TYPE_BOOLEAN:
        newCell.setCellValue(oldCell.getBooleanCellValue());
        break;
    case HSSFCell.CELL_TYPE_ERROR:
        newCell.setCellErrorValue(oldCell.getErrorCellValue());
        break;
    case HSSFCell.CELL_TYPE_FORMULA:
        newCell.setCellFormula(oldCell.getCellFormula());
        break;
    default:
        break;
    }

}

/**
 * Récupère les informations de fusion des cellules dans la sheet source
 * pour les appliquer à la sheet destination... Récupère toutes les zones
 * merged dans la sheet source et regarde pour chacune d'elle si elle se
 * trouve dans la current row que nous traitons. Si oui, retourne l'objet
 * CellRangeAddress.
 * 
 * @param sheet
 *            the sheet containing the data.
 * @param rowNum
 *            the num of the row to copy.
 * @param cellNum
 *            the num of the cell to copy.
 * @return the CellRangeAddress created.
 */
public static CellRangeAddress getMergedRegion(HSSFSheet 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;
}

/**
 * Check that the merged region has been created in the destination sheet.
 * 
 * @param newMergedRegion
 *            the merged region to copy or not in the destination sheet.
 * @param mergedRegions
 *            the list containing all the merged region.
 * @return true if the merged region is already in the list or not.
 */
private static boolean isNewMergedRegion(CellRangeAddressWrapper newMergedRegion,
        Set<CellRangeAddressWrapper> mergedRegions) {
    return !mergedRegions.contains(newMergedRegion);
}
}

this code has been adapted from what I found here on coderanch forum

public final class ExcelDocumentConverter {
public static XSSFWorkbook convertWorkbookHSSFToXSSF(HSSFWorkbook source) {
    XSSFWorkbook retVal = new XSSFWorkbook();
    for (int i = 0; i < source.getNumberOfSheets(); i++) {
        XSSFSheet xssfSheet = retVal.createSheet();
        HSSFSheet hssfsheet = source.getSheetAt(i);
        copySheets(hssfsheet, xssfSheet);
    }
    return retVal;
}

public static void copySheets(HSSFSheet source, XSSFSheet destination) {
    copySheets(source, destination, true);
}

/**
 * @param destination
 *            the sheet to create from the copy.
 * @param the
 *            sheet to copy.
 * @param copyStyle
 *            true copy the style.
 */
public static void copySheets(HSSFSheet source, XSSFSheet destination, boolean copyStyle) {
    int maxColumnNum = 0;
    Map<Integer, HSSFCellStyle> styleMap = (copyStyle) ? new HashMap<Integer, HSSFCellStyle>() : null;
    for (int i = source.getFirstRowNum(); i <= source.getLastRowNum(); i++) {
        HSSFRow srcRow = source.getRow(i);
        XSSFRow destRow = destination.createRow(i);
        if (srcRow != null) {
            copyRow(source, destination, srcRow, destRow, styleMap);
            if (srcRow.getLastCellNum() > maxColumnNum) {
                maxColumnNum = srcRow.getLastCellNum();
            }
        }
    }
    for (int i = 0; i <= maxColumnNum; i++) {
        destination.setColumnWidth(i, source.getColumnWidth(i));
    }
}

/**
 * @param srcSheet
 *            the sheet to copy.
 * @param destSheet
 *            the sheet to create.
 * @param srcRow
 *            the row to copy.
 * @param destRow
 *            the row to create.
 * @param styleMap
 *            -
 */
public static void copyRow(HSSFSheet srcSheet, XSSFSheet destSheet, HSSFRow srcRow, XSSFRow destRow,
        Map<Integer, HSSFCellStyle> styleMap) {
    // manage a list of merged zone in order to not insert two times a
    // merged zone
    Set<CellRangeAddressWrapper> mergedRegions = new TreeSet<CellRangeAddressWrapper>();
    destRow.setHeight(srcRow.getHeight());
    // pour chaque row
    for (int j = srcRow.getFirstCellNum(); j <= srcRow.getLastCellNum(); j++) {
        HSSFCell oldCell = srcRow.getCell(j); // ancienne cell
        XSSFCell newCell = destRow.getCell(j); // new cell
        if (oldCell != null) {
            if (newCell == null) {
                newCell = destRow.createCell(j);
            }
            // copy chaque cell
            copyCell(oldCell, newCell, styleMap);
            // copy les informations de fusion entre les cellules
            // System.out.println("row num: " + srcRow.getRowNum() +
            // " , col: " + (short)oldCell.getColumnIndex());
            CellRangeAddress mergedRegion = getMergedRegion(srcSheet, srcRow.getRowNum(),
                    (short) oldCell.getColumnIndex());

            if (mergedRegion != null) {
                // System.out.println("Selected merged region: " +
                // mergedRegion.toString());
                CellRangeAddress newMergedRegion = new CellRangeAddress(mergedRegion.getFirstRow(),
                        mergedRegion.getLastRow(), mergedRegion.getFirstColumn(), mergedRegion.getLastColumn());
                // System.out.println("New merged region: " +
                // newMergedRegion.toString());
                CellRangeAddressWrapper wrapper = new CellRangeAddressWrapper(newMergedRegion);
                if (isNewMergedRegion(wrapper, mergedRegions)) {
                    mergedRegions.add(wrapper);
                    destSheet.addMergedRegion(wrapper.range);
                }
            }
        }
    }

}

/**
 * @param oldCell
 * @param newCell
 * @param styleMap
 */
public static void copyCell(HSSFCell oldCell, XSSFCell newCell, Map<Integer, HSSFCellStyle> styleMap) {
    if (styleMap != null) {
        int stHashCode = oldCell.getCellStyle().hashCode();
        HSSFCellStyle sourceCellStyle = styleMap.get(stHashCode);
        XSSFCellStyle destnCellStyle = newCell.getCellStyle();
        if (sourceCellStyle == null) {
            sourceCellStyle = oldCell.getSheet().getWorkbook().createCellStyle();
        }
        destnCellStyle.cloneStyleFrom(oldCell.getCellStyle());
        styleMap.put(stHashCode, sourceCellStyle);
        newCell.setCellStyle(destnCellStyle);
    }
    switch (oldCell.getCellType()) {
    case HSSFCell.CELL_TYPE_STRING:
        newCell.setCellValue(oldCell.getStringCellValue());
        break;
    case HSSFCell.CELL_TYPE_NUMERIC:
        newCell.setCellValue(oldCell.getNumericCellValue());
        break;
    case HSSFCell.CELL_TYPE_BLANK:
        newCell.setCellType(HSSFCell.CELL_TYPE_BLANK);
        break;
    case HSSFCell.CELL_TYPE_BOOLEAN:
        newCell.setCellValue(oldCell.getBooleanCellValue());
        break;
    case HSSFCell.CELL_TYPE_ERROR:
        newCell.setCellErrorValue(oldCell.getErrorCellValue());
        break;
    case HSSFCell.CELL_TYPE_FORMULA:
        newCell.setCellFormula(oldCell.getCellFormula());
        break;
    default:
        break;
    }

}

/**
 * Récupère les informations de fusion des cellules dans la sheet source
 * pour les appliquer à la sheet destination... Récupère toutes les zones
 * merged dans la sheet source et regarde pour chacune d'elle si elle se
 * trouve dans la current row que nous traitons. Si oui, retourne l'objet
 * CellRangeAddress.
 * 
 * @param sheet
 *            the sheet containing the data.
 * @param rowNum
 *            the num of the row to copy.
 * @param cellNum
 *            the num of the cell to copy.
 * @return the CellRangeAddress created.
 */
public static CellRangeAddress getMergedRegion(HSSFSheet 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;
}

/**
 * Check that the merged region has been created in the destination sheet.
 * 
 * @param newMergedRegion
 *            the merged region to copy or not in the destination sheet.
 * @param mergedRegions
 *            the list containing all the merged region.
 * @return true if the merged region is already in the list or not.
 */
private static boolean isNewMergedRegion(CellRangeAddressWrapper newMergedRegion,
        Set<CellRangeAddressWrapper> mergedRegions) {
    return !mergedRegions.contains(newMergedRegion);
}
}
醉酒的小男人 2024-12-09 02:11:27
//Added xbean-2.3.0.jar/xmlbeans-2.3.0.jar,poi-ooxml-3.7-20101029.jarpoi-ooxml-schemas-3.7-beta1.jar,
import java.io.*;
import java.util.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

public class Xls2Xlsx {

private File path = new File("c:/Integration-TestCases.xls");
private ArrayList<File> inputFiles = new ArrayList<File>();

private int lastColumn = 0;
private HashMap<Integer, XSSFCellStyle> styleMap = new HashMap();

private void getInputFiles() {
    String call = "getInputFiles ";
    if (this.path.isFile()) {
        if (this.path.getAbsolutePath().endsWith(".xls")
                && !new File(this.path.getAbsolutePath() + "x").exists())
            this.inputFiles.add(this.path);
        else {
            System.out
                    .println("Datei endet nicht mit .xls oder XLSX-Datei existiert bereits");
        }
    } else
        for (File f : this.path.listFiles(new FilenameFilter() {
            // anonyme innere Klasse

            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith(".xls"))
                    return true;
                return false;
            }

        })) {
            if (!new File(f.getAbsoluteFile() + "x").exists()) {
                this.inputFiles.add(f);
            }
        }
    System.out
            .println(call + "Dateien gefunden: " + this.inputFiles.size());
    System.out.println(call + "abgeschlossen");
}

private HSSFWorkbook getWorkBook(File f) throws FileNotFoundException,
        IOException {
    System.out.println("getWorkBook lese " + f.getAbsolutePath());
    POIFSFileSystem fs = new POIFSFileSystem(new BufferedInputStream(
            new FileInputStream(f)));
    HSSFWorkbook workbook = new HSSFWorkbook(fs);
    System.out.println("getWorkBook abgeschlossen");
    return workbook;
}

private void transformHSSF(HSSFWorkbook workbookOld ,XSSFWorkbook workbookNew) {
    String call = "transform ";
    System.out.println(call + "Workbook");
    XSSFSheet sheetNew;
    HSSFSheet sheetOld;
    //TODO::workbookNew.setForceFormulaRecalculation(workbookOld.getForceFormulaRecalculation());
    // workbookNew.setHidden(workbookOld.isHidden()); //[email protected] -
    // von Apache noch nicht implementiert
    workbookNew.setMissingCellPolicy(workbookOld.getMissingCellPolicy());

    for (int i = 0; i < workbookOld.getNumberOfSheets(); i++) {
        sheetOld =  workbookOld.getSheetAt(i);
        sheetNew = workbookNew.getSheet(sheetOld.getSheetName());
        System.out.println(call + "Sheet Name: " + sheetOld.getSheetName());
        sheetNew = workbookNew.createSheet(sheetOld.getSheetName());
        this.transform(workbookOld,workbookNew,sheetOld, sheetNew);
    }
    System.out.println(call + "Styles size: "        + this.styleMap.size());
    System.out.println(call + "abgeschlossen");
}



    private void transform(HSSFWorkbook workbookOld ,XSSFWorkbook workbookNew,HSSFSheet sheetOld, XSSFSheet sheetNew) {
        System.out.println("transform Sheet");

        sheetNew.setDisplayFormulas(sheetOld.isDisplayFormulas());
        sheetNew.setDisplayGridlines(sheetOld.isDisplayGridlines());
        sheetNew.setDisplayGuts(sheetOld.getDisplayGuts());
        sheetNew.setDisplayRowColHeadings(sheetOld.isDisplayRowColHeadings());
        sheetNew.setDisplayZeros(sheetOld.isDisplayZeros());
        sheetNew.setFitToPage(sheetOld.getFitToPage());
        //
        //TODO::sheetNew.setForceFormulaRecalculation(sheetOld.getForceFormulaRecalculation());
        sheetNew.setHorizontallyCenter(sheetOld.getHorizontallyCenter());
        sheetNew.setMargin(Sheet.BottomMargin,
                sheetOld.getMargin(Sheet.BottomMargin));
        sheetNew.setMargin(Sheet.FooterMargin,
                sheetOld.getMargin(Sheet.FooterMargin));
        sheetNew.setMargin(Sheet.HeaderMargin,
                sheetOld.getMargin(Sheet.HeaderMargin));
        sheetNew.setMargin(Sheet.LeftMargin,
                sheetOld.getMargin(Sheet.LeftMargin));
        sheetNew.setMargin(Sheet.RightMargin,
                sheetOld.getMargin(Sheet.RightMargin));
        sheetNew.setMargin(Sheet.TopMargin, sheetOld.getMargin(Sheet.TopMargin));
        sheetNew.setPrintGridlines(sheetNew.isPrintGridlines());
        //TODO::sheetNew.setRightToLeft(sheetNew.isRightToLeft());
        sheetNew.setRowSumsBelow(sheetNew.getRowSumsBelow());
        sheetNew.setRowSumsRight(sheetNew.getRowSumsRight());
        sheetNew.setVerticallyCenter(sheetOld.getVerticallyCenter());

        XSSFRow rowNew;
        for (Row row : sheetOld) {
            rowNew = sheetNew.createRow(row.getRowNum());
            if (rowNew != null)
                this.transform(workbookOld,workbookNew,(HSSFRow) row, rowNew);
        }

        for (int i = 0; i < this.lastColumn; i++) {
            sheetNew.setColumnWidth(i, sheetOld.getColumnWidth(i));
            sheetNew.setColumnHidden(i, sheetOld.isColumnHidden(i));
        }

        for (int i = 0; i < sheetOld.getNumMergedRegions(); i++) {
            CellRangeAddress merged = sheetOld.getMergedRegion(i);
            sheetNew.addMergedRegion(merged);
        }
    }



    private void transform(HSSFWorkbook workbookOld ,XSSFWorkbook workbookNew,HSSFRow rowOld, XSSFRow rowNew) {
        XSSFCell cellNew;
        rowNew.setHeight(rowOld.getHeight());
        //TODO::if (rowOld.getRowStyle() != null) {
            /*Integer hash = rowOld.getRowStyle().hashCode();
            if (!this.styleMap.containsKey(hash))
                this.transform(workbookOld,workbookNew,hash, (XSSFCellStyle)rowOld.getRowStyle(),(HSSFCellStyle)workbookNew.createCellStyle());
            rowNew.setRowStyle(this.styleMap.get(hash));
        }*/
        for (Cell cell : rowOld) {
            cellNew = rowNew.createCell(cell.getColumnIndex(), cell.getCellType());
            if (cellNew != null)
                this.transform(workbookOld,workbookNew,(HSSFCell) cell, cellNew);
        }
        this.lastColumn = Math.max(this.lastColumn, rowOld.getLastCellNum());
    }




    private void transform(HSSFWorkbook workbookOld,XSSFWorkbook workbookNew,HSSFCell cellOld,XSSFCell cellNew) {
        cellNew.setCellComment(cellOld.getCellComment());

        Integer hash = cellOld.getCellStyle().hashCode();
        if (this.styleMap!=null && !this.styleMap.containsKey(hash)) {
            this.transform(workbookOld,workbookNew,hash, cellOld.getCellStyle(),(XSSFCellStyle)workbookNew.createCellStyle());
        }
        cellNew.setCellStyle(this.styleMap.get(hash));

        switch (cellOld.getCellType()) {
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            cellNew.setCellValue(cellOld.getBooleanCellValue());
            break;
        case Cell.CELL_TYPE_ERROR:
            cellNew.setCellValue(cellOld.getErrorCellValue());
            break;
        case Cell.CELL_TYPE_FORMULA:
            cellNew.setCellValue(cellOld.getCellFormula());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            cellNew.setCellValue(cellOld.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_STRING:
            cellNew.setCellValue(cellOld.getStringCellValue());
            break;
        default:
            System.out.println("transform: Unbekannter Zellentyp "
                    + cellOld.getCellType());
        }
    }




    private void transform(HSSFWorkbook workbookOld,XSSFWorkbook workbookNew,Integer hash, HSSFCellStyle styleOld,
            XSSFCellStyle styleNew) {
        styleNew.setAlignment(styleOld.getAlignment());
        styleNew.setBorderBottom(styleOld.getBorderBottom());
        styleNew.setBorderLeft(styleOld.getBorderLeft());
        styleNew.setBorderRight(styleOld.getBorderRight());
        styleNew.setBorderTop(styleOld.getBorderTop());
         styleNew.setDataFormat(this.transform( workbookOld, workbookNew,styleOld.getDataFormat()));
        styleNew.setFillBackgroundColor(styleOld.getFillBackgroundColor());
        styleNew.setFillForegroundColor(styleOld.getFillForegroundColor());
        styleNew.setFillPattern(styleOld.getFillPattern());
        styleNew.setFont(this.transform(workbookNew,styleOld.getFont(workbookOld)));
        styleNew.setHidden(styleOld.getHidden());
        styleNew.setIndention(styleOld.getIndention());
        styleNew.setLocked(styleOld.getLocked());
        styleNew.setVerticalAlignment(styleOld.getVerticalAlignment());
        styleNew.setWrapText(styleOld.getWrapText());
        this.styleMap.put(hash, styleNew);
    }

private short transform(HSSFWorkbook workbookOld,XSSFWorkbook workbookNew,short index) {
    DataFormat formatOld = workbookOld.createDataFormat();
    DataFormat formatNew = workbookNew.createDataFormat();
    return formatNew.getFormat(formatOld.getFormat(index));
}


    private XSSFFont transform(XSSFWorkbook workbookNew,HSSFFont fontOld) {
        XSSFFont fontNew = workbookNew.createFont();
        fontNew.setBoldweight(fontOld.getBoldweight());
        fontNew.setCharSet(fontOld.getCharSet());
        fontNew.setColor(fontOld.getColor());
        fontNew.setFontName(fontOld.getFontName());
        fontNew.setFontHeight(fontOld.getFontHeight());
        fontNew.setItalic(fontOld.getItalic());
        fontNew.setStrikeout(fontOld.getStrikeout());
        fontNew.setTypeOffset(fontOld.getTypeOffset());
        fontNew.setUnderline(fontOld.getUnderline());
        return fontNew;
    }

public static void main(String[] args) throws Exception{
    Xls2Xlsx xls=new Xls2Xlsx(); 
    //xls.transform();
     InputStream isXls = new FileInputStream("c:/OTD1.xls");
     HSSFWorkbook workbookOld     = new HSSFWorkbook(isXls);

    String dest="c:/OTD.xlsx";

    FileOutputStream out = new FileOutputStream(dest);
    XSSFWorkbook workbookNew = new XSSFWorkbook();
    xls.transformHSSF( workbookOld , workbookNew) ;    
    workbookNew.write(out);

    out.close();

//    InputStream isXls = new FileInputStream("c:/OTD1.xls");
//    HSSFWorkbook workbookNew     = new HSSFWorkbook(isXls);



}
}
//Added xbean-2.3.0.jar/xmlbeans-2.3.0.jar,poi-ooxml-3.7-20101029.jarpoi-ooxml-schemas-3.7-beta1.jar,
import java.io.*;
import java.util.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

public class Xls2Xlsx {

private File path = new File("c:/Integration-TestCases.xls");
private ArrayList<File> inputFiles = new ArrayList<File>();

private int lastColumn = 0;
private HashMap<Integer, XSSFCellStyle> styleMap = new HashMap();

private void getInputFiles() {
    String call = "getInputFiles ";
    if (this.path.isFile()) {
        if (this.path.getAbsolutePath().endsWith(".xls")
                && !new File(this.path.getAbsolutePath() + "x").exists())
            this.inputFiles.add(this.path);
        else {
            System.out
                    .println("Datei endet nicht mit .xls oder XLSX-Datei existiert bereits");
        }
    } else
        for (File f : this.path.listFiles(new FilenameFilter() {
            // anonyme innere Klasse

            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith(".xls"))
                    return true;
                return false;
            }

        })) {
            if (!new File(f.getAbsoluteFile() + "x").exists()) {
                this.inputFiles.add(f);
            }
        }
    System.out
            .println(call + "Dateien gefunden: " + this.inputFiles.size());
    System.out.println(call + "abgeschlossen");
}

private HSSFWorkbook getWorkBook(File f) throws FileNotFoundException,
        IOException {
    System.out.println("getWorkBook lese " + f.getAbsolutePath());
    POIFSFileSystem fs = new POIFSFileSystem(new BufferedInputStream(
            new FileInputStream(f)));
    HSSFWorkbook workbook = new HSSFWorkbook(fs);
    System.out.println("getWorkBook abgeschlossen");
    return workbook;
}

private void transformHSSF(HSSFWorkbook workbookOld ,XSSFWorkbook workbookNew) {
    String call = "transform ";
    System.out.println(call + "Workbook");
    XSSFSheet sheetNew;
    HSSFSheet sheetOld;
    //TODO::workbookNew.setForceFormulaRecalculation(workbookOld.getForceFormulaRecalculation());
    // workbookNew.setHidden(workbookOld.isHidden()); //[email protected] -
    // von Apache noch nicht implementiert
    workbookNew.setMissingCellPolicy(workbookOld.getMissingCellPolicy());

    for (int i = 0; i < workbookOld.getNumberOfSheets(); i++) {
        sheetOld =  workbookOld.getSheetAt(i);
        sheetNew = workbookNew.getSheet(sheetOld.getSheetName());
        System.out.println(call + "Sheet Name: " + sheetOld.getSheetName());
        sheetNew = workbookNew.createSheet(sheetOld.getSheetName());
        this.transform(workbookOld,workbookNew,sheetOld, sheetNew);
    }
    System.out.println(call + "Styles size: "        + this.styleMap.size());
    System.out.println(call + "abgeschlossen");
}



    private void transform(HSSFWorkbook workbookOld ,XSSFWorkbook workbookNew,HSSFSheet sheetOld, XSSFSheet sheetNew) {
        System.out.println("transform Sheet");

        sheetNew.setDisplayFormulas(sheetOld.isDisplayFormulas());
        sheetNew.setDisplayGridlines(sheetOld.isDisplayGridlines());
        sheetNew.setDisplayGuts(sheetOld.getDisplayGuts());
        sheetNew.setDisplayRowColHeadings(sheetOld.isDisplayRowColHeadings());
        sheetNew.setDisplayZeros(sheetOld.isDisplayZeros());
        sheetNew.setFitToPage(sheetOld.getFitToPage());
        //
        //TODO::sheetNew.setForceFormulaRecalculation(sheetOld.getForceFormulaRecalculation());
        sheetNew.setHorizontallyCenter(sheetOld.getHorizontallyCenter());
        sheetNew.setMargin(Sheet.BottomMargin,
                sheetOld.getMargin(Sheet.BottomMargin));
        sheetNew.setMargin(Sheet.FooterMargin,
                sheetOld.getMargin(Sheet.FooterMargin));
        sheetNew.setMargin(Sheet.HeaderMargin,
                sheetOld.getMargin(Sheet.HeaderMargin));
        sheetNew.setMargin(Sheet.LeftMargin,
                sheetOld.getMargin(Sheet.LeftMargin));
        sheetNew.setMargin(Sheet.RightMargin,
                sheetOld.getMargin(Sheet.RightMargin));
        sheetNew.setMargin(Sheet.TopMargin, sheetOld.getMargin(Sheet.TopMargin));
        sheetNew.setPrintGridlines(sheetNew.isPrintGridlines());
        //TODO::sheetNew.setRightToLeft(sheetNew.isRightToLeft());
        sheetNew.setRowSumsBelow(sheetNew.getRowSumsBelow());
        sheetNew.setRowSumsRight(sheetNew.getRowSumsRight());
        sheetNew.setVerticallyCenter(sheetOld.getVerticallyCenter());

        XSSFRow rowNew;
        for (Row row : sheetOld) {
            rowNew = sheetNew.createRow(row.getRowNum());
            if (rowNew != null)
                this.transform(workbookOld,workbookNew,(HSSFRow) row, rowNew);
        }

        for (int i = 0; i < this.lastColumn; i++) {
            sheetNew.setColumnWidth(i, sheetOld.getColumnWidth(i));
            sheetNew.setColumnHidden(i, sheetOld.isColumnHidden(i));
        }

        for (int i = 0; i < sheetOld.getNumMergedRegions(); i++) {
            CellRangeAddress merged = sheetOld.getMergedRegion(i);
            sheetNew.addMergedRegion(merged);
        }
    }



    private void transform(HSSFWorkbook workbookOld ,XSSFWorkbook workbookNew,HSSFRow rowOld, XSSFRow rowNew) {
        XSSFCell cellNew;
        rowNew.setHeight(rowOld.getHeight());
        //TODO::if (rowOld.getRowStyle() != null) {
            /*Integer hash = rowOld.getRowStyle().hashCode();
            if (!this.styleMap.containsKey(hash))
                this.transform(workbookOld,workbookNew,hash, (XSSFCellStyle)rowOld.getRowStyle(),(HSSFCellStyle)workbookNew.createCellStyle());
            rowNew.setRowStyle(this.styleMap.get(hash));
        }*/
        for (Cell cell : rowOld) {
            cellNew = rowNew.createCell(cell.getColumnIndex(), cell.getCellType());
            if (cellNew != null)
                this.transform(workbookOld,workbookNew,(HSSFCell) cell, cellNew);
        }
        this.lastColumn = Math.max(this.lastColumn, rowOld.getLastCellNum());
    }




    private void transform(HSSFWorkbook workbookOld,XSSFWorkbook workbookNew,HSSFCell cellOld,XSSFCell cellNew) {
        cellNew.setCellComment(cellOld.getCellComment());

        Integer hash = cellOld.getCellStyle().hashCode();
        if (this.styleMap!=null && !this.styleMap.containsKey(hash)) {
            this.transform(workbookOld,workbookNew,hash, cellOld.getCellStyle(),(XSSFCellStyle)workbookNew.createCellStyle());
        }
        cellNew.setCellStyle(this.styleMap.get(hash));

        switch (cellOld.getCellType()) {
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            cellNew.setCellValue(cellOld.getBooleanCellValue());
            break;
        case Cell.CELL_TYPE_ERROR:
            cellNew.setCellValue(cellOld.getErrorCellValue());
            break;
        case Cell.CELL_TYPE_FORMULA:
            cellNew.setCellValue(cellOld.getCellFormula());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            cellNew.setCellValue(cellOld.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_STRING:
            cellNew.setCellValue(cellOld.getStringCellValue());
            break;
        default:
            System.out.println("transform: Unbekannter Zellentyp "
                    + cellOld.getCellType());
        }
    }




    private void transform(HSSFWorkbook workbookOld,XSSFWorkbook workbookNew,Integer hash, HSSFCellStyle styleOld,
            XSSFCellStyle styleNew) {
        styleNew.setAlignment(styleOld.getAlignment());
        styleNew.setBorderBottom(styleOld.getBorderBottom());
        styleNew.setBorderLeft(styleOld.getBorderLeft());
        styleNew.setBorderRight(styleOld.getBorderRight());
        styleNew.setBorderTop(styleOld.getBorderTop());
         styleNew.setDataFormat(this.transform( workbookOld, workbookNew,styleOld.getDataFormat()));
        styleNew.setFillBackgroundColor(styleOld.getFillBackgroundColor());
        styleNew.setFillForegroundColor(styleOld.getFillForegroundColor());
        styleNew.setFillPattern(styleOld.getFillPattern());
        styleNew.setFont(this.transform(workbookNew,styleOld.getFont(workbookOld)));
        styleNew.setHidden(styleOld.getHidden());
        styleNew.setIndention(styleOld.getIndention());
        styleNew.setLocked(styleOld.getLocked());
        styleNew.setVerticalAlignment(styleOld.getVerticalAlignment());
        styleNew.setWrapText(styleOld.getWrapText());
        this.styleMap.put(hash, styleNew);
    }

private short transform(HSSFWorkbook workbookOld,XSSFWorkbook workbookNew,short index) {
    DataFormat formatOld = workbookOld.createDataFormat();
    DataFormat formatNew = workbookNew.createDataFormat();
    return formatNew.getFormat(formatOld.getFormat(index));
}


    private XSSFFont transform(XSSFWorkbook workbookNew,HSSFFont fontOld) {
        XSSFFont fontNew = workbookNew.createFont();
        fontNew.setBoldweight(fontOld.getBoldweight());
        fontNew.setCharSet(fontOld.getCharSet());
        fontNew.setColor(fontOld.getColor());
        fontNew.setFontName(fontOld.getFontName());
        fontNew.setFontHeight(fontOld.getFontHeight());
        fontNew.setItalic(fontOld.getItalic());
        fontNew.setStrikeout(fontOld.getStrikeout());
        fontNew.setTypeOffset(fontOld.getTypeOffset());
        fontNew.setUnderline(fontOld.getUnderline());
        return fontNew;
    }

public static void main(String[] args) throws Exception{
    Xls2Xlsx xls=new Xls2Xlsx(); 
    //xls.transform();
     InputStream isXls = new FileInputStream("c:/OTD1.xls");
     HSSFWorkbook workbookOld     = new HSSFWorkbook(isXls);

    String dest="c:/OTD.xlsx";

    FileOutputStream out = new FileOutputStream(dest);
    XSSFWorkbook workbookNew = new XSSFWorkbook();
    xls.transformHSSF( workbookOld , workbookNew) ;    
    workbookNew.write(out);

    out.close();

//    InputStream isXls = new FileInputStream("c:/OTD1.xls");
//    HSSFWorkbook workbookNew     = new HSSFWorkbook(isXls);



}
}
乙白 2024-12-09 02:11:27

由于上述所有答案都没有帮助,因此这里是工作代码:

只需编写一个填充必要字段并使用transform()的主方法即可。

package myStuff;

import java.io.*;
import java.util.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

public class ExcelConverter {

private File path = null;
private ArrayList<File> inputFiles = new ArrayList<File>();
private HSSFWorkbook workbookOld = null;
private XSSFWorkbook workbookNew = null;
private int lastColumn = 0;
private HashMap<Integer, XSSFCellStyle> styleMap = null;

private void getInputFiles() {
    String call = "getInputFiles ";
    if (this.path.isFile()) {
        if (this.path.getAbsolutePath().endsWith(".xls")
                && !new File(this.path.getAbsolutePath() + "x").exists())
            this.inputFiles.add(this.path);
        else {
            System.out
                    .println("Datei endet nicht mit .xls oder XLSX-Datei existiert bereits");
        }
    } else
        for (File f : this.path.listFiles(new FilenameFilter() {
            // anonyme innere Klasse

            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith(".xls"))
                    return true;
                return false;
            }

        })) {
            if (!new File(f.getAbsoluteFile() + "x").exists()) {
                this.inputFiles.add(f);
            }
        }
    System.out
            .println(call + "Dateien gefunden: " + this.inputFiles.size());
    System.out.println(call + "abgeschlossen");
}

private HSSFWorkbook getWorkBook(File f) throws FileNotFoundException,
        IOException {
    System.out.println("getWorkBook lese " + f.getAbsolutePath());
    POIFSFileSystem fs = new POIFSFileSystem(new BufferedInputStream(
            new FileInputStream(f)));
    HSSFWorkbook workbook = new HSSFWorkbook(fs);
    System.out.println("getWorkBook abgeschlossen");
    return workbook;
}

private void transform() {
    String call = "transform ";
    System.out.println(call + "Workbook");
    XSSFSheet sheetNew;
    HSSFSheet sheetOld;
    this.workbookNew.setForceFormulaRecalculation(this.workbookOld
            .getForceFormulaRecalculation());
    // workbookNew.setHidden(workbookOld.isHidden()); //[email protected] -
    // von Apache noch nicht implementiert
    this.workbookNew.setMissingCellPolicy(this.workbookOld
            .getMissingCellPolicy());

    for (int i = 0; i < this.workbookOld.getNumberOfSheets(); i++) {
        sheetOld = this.workbookOld.getSheetAt(i);
        sheetNew = this.workbookNew.getSheet(sheetOld.getSheetName());
        System.out.println(call + "Sheet erstellt: "
                + sheetOld.getSheetName());
        sheetNew = this.workbookNew.createSheet(sheetOld.getSheetName());
        this.transform(sheetOld, sheetNew);
    }
    System.out.println(call + "Anzahl verwendeter Styles: "
            + this.styleMap.size());
    System.out.println(call + "abgeschlossen");
}

private void transform(HSSFSheet sheetOld, XSSFSheet sheetNew) {
    System.out.println("transform Sheet");

    sheetNew.setDisplayFormulas(sheetOld.isDisplayFormulas());
    sheetNew.setDisplayGridlines(sheetOld.isDisplayGridlines());
    sheetNew.setDisplayGuts(sheetOld.getDisplayGuts());
    sheetNew.setDisplayRowColHeadings(sheetOld.isDisplayRowColHeadings());
    sheetNew.setDisplayZeros(sheetOld.isDisplayZeros());
    sheetNew.setFitToPage(sheetOld.getFitToPage());
    sheetNew.setForceFormulaRecalculation(sheetOld
            .getForceFormulaRecalculation());
    sheetNew.setHorizontallyCenter(sheetOld.getHorizontallyCenter());
    sheetNew.setMargin(Sheet.BottomMargin,
            sheetOld.getMargin(Sheet.BottomMargin));
    sheetNew.setMargin(Sheet.FooterMargin,
            sheetOld.getMargin(Sheet.FooterMargin));
    sheetNew.setMargin(Sheet.HeaderMargin,
            sheetOld.getMargin(Sheet.HeaderMargin));
    sheetNew.setMargin(Sheet.LeftMargin,
            sheetOld.getMargin(Sheet.LeftMargin));
    sheetNew.setMargin(Sheet.RightMargin,
            sheetOld.getMargin(Sheet.RightMargin));
    sheetNew.setMargin(Sheet.TopMargin, sheetOld.getMargin(Sheet.TopMargin));
    sheetNew.setPrintGridlines(sheetNew.isPrintGridlines());
    sheetNew.setRightToLeft(sheetNew.isRightToLeft());
    sheetNew.setRowSumsBelow(sheetNew.getRowSumsBelow());
    sheetNew.setRowSumsRight(sheetNew.getRowSumsRight());
    sheetNew.setVerticallyCenter(sheetOld.getVerticallyCenter());

    XSSFRow rowNew;
    for (Row row : sheetOld) {
        rowNew = sheetNew.createRow(row.getRowNum());
        if (rowNew != null)
            this.transform((HSSFRow) row, rowNew);
    }

    for (int i = 0; i < this.lastColumn; i++) {
        sheetNew.setColumnWidth(i, sheetOld.getColumnWidth(i));
        sheetNew.setColumnHidden(i, sheetOld.isColumnHidden(i));
    }

    for (int i = 0; i < sheetOld.getNumMergedRegions(); i++) {
        CellRangeAddress merged = sheetOld.getMergedRegion(i);
        sheetNew.addMergedRegion(merged);
    }
}

private void transform(HSSFRow rowOld, XSSFRow rowNew) {
    XSSFCell cellNew;
    rowNew.setHeight(rowOld.getHeight());
    if (rowOld.getRowStyle() != null) {
        Integer hash = rowOld.getRowStyle().hashCode();
        if (!this.styleMap.containsKey(hash))
            this.transform(hash, rowOld.getRowStyle(),
                    this.workbookNew.createCellStyle());
        rowNew.setRowStyle(this.styleMap.get(hash));
    }
    for (Cell cell : rowOld) {
        cellNew = rowNew.createCell(cell.getColumnIndex(),
                cell.getCellType());
        if (cellNew != null)
            this.transform((HSSFCell) cell, cellNew);
    }
    this.lastColumn = Math.max(this.lastColumn, rowOld.getLastCellNum());
}

private void transform(HSSFCell cellOld, XSSFCell cellNew) {
    cellNew.setCellComment(cellOld.getCellComment());

    Integer hash = cellOld.getCellStyle().hashCode();
    if (!this.styleMap.containsKey(hash)) {
        this.transform(hash, cellOld.getCellStyle(),
                this.workbookNew.createCellStyle());
    }
    cellNew.setCellStyle(this.styleMap.get(hash));

    switch (cellOld.getCellType()) {
    case Cell.CELL_TYPE_BLANK:
        break;
    case Cell.CELL_TYPE_BOOLEAN:
        cellNew.setCellValue(cellOld.getBooleanCellValue());
        break;
    case Cell.CELL_TYPE_ERROR:
        cellNew.setCellValue(cellOld.getErrorCellValue());
        break;
    case Cell.CELL_TYPE_FORMULA:
        cellNew.setCellValue(cellOld.getCellFormula());
        break;
    case Cell.CELL_TYPE_NUMERIC:
        cellNew.setCellValue(cellOld.getNumericCellValue());
        break;
    case Cell.CELL_TYPE_STRING:
        cellNew.setCellValue(cellOld.getStringCellValue());
        break;
    default:
        System.out.println("transform: Unbekannter Zellentyp "
                + cellOld.getCellType());
    }
}

private void transform(Integer hash, HSSFCellStyle styleOld,
        XSSFCellStyle styleNew) {
    styleNew.setAlignment(styleOld.getAlignment());
    styleNew.setBorderBottom(styleOld.getBorderBottom());
    styleNew.setBorderLeft(styleOld.getBorderLeft());
    styleNew.setBorderRight(styleOld.getBorderRight());
    styleNew.setBorderTop(styleOld.getBorderTop());
    styleNew.setDataFormat(this.transform(styleOld.getDataFormat()));
    styleNew.setFillBackgroundColor(styleOld.getFillBackgroundColor());
    styleNew.setFillForegroundColor(styleOld.getFillForegroundColor());
    styleNew.setFillPattern(styleOld.getFillPattern());
    styleNew.setFont(this.transform(styleOld.getFont(this.workbookOld)));
    styleNew.setHidden(styleOld.getHidden());
    styleNew.setIndention(styleOld.getIndention());
    styleNew.setLocked(styleOld.getLocked());
    styleNew.setVerticalAlignment(styleOld.getVerticalAlignment());
    styleNew.setWrapText(styleOld.getWrapText());
    this.styleMap.put(hash, styleNew);
}

private short transform(short index) {
    DataFormat formatOld = this.workbookOld.createDataFormat();
    DataFormat formatNew = this.workbookNew.createDataFormat();
    return formatNew.getFormat(formatOld.getFormat(index));
}

private XSSFFont transform(HSSFFont fontOld) {
    XSSFFont fontNew = this.workbookNew.createFont();
    fontNew.setBoldweight(fontOld.getBoldweight());
    fontNew.setCharSet(fontOld.getCharSet());
    fontNew.setColor(fontOld.getColor());
    fontNew.setFontName(fontOld.getFontName());
    fontNew.setFontHeight(fontOld.getFontHeight());
    fontNew.setItalic(fontOld.getItalic());
    fontNew.setStrikeout(fontOld.getStrikeout());
    fontNew.setTypeOffset(fontOld.getTypeOffset());
    fontNew.setUnderline(fontOld.getUnderline());
    return fontNew;
}
}

Since all of the above answers don't help, here is working code:

Just write a main method that fills the necessary fields and uses transform().

package myStuff;

import java.io.*;
import java.util.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

public class ExcelConverter {

private File path = null;
private ArrayList<File> inputFiles = new ArrayList<File>();
private HSSFWorkbook workbookOld = null;
private XSSFWorkbook workbookNew = null;
private int lastColumn = 0;
private HashMap<Integer, XSSFCellStyle> styleMap = null;

private void getInputFiles() {
    String call = "getInputFiles ";
    if (this.path.isFile()) {
        if (this.path.getAbsolutePath().endsWith(".xls")
                && !new File(this.path.getAbsolutePath() + "x").exists())
            this.inputFiles.add(this.path);
        else {
            System.out
                    .println("Datei endet nicht mit .xls oder XLSX-Datei existiert bereits");
        }
    } else
        for (File f : this.path.listFiles(new FilenameFilter() {
            // anonyme innere Klasse

            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith(".xls"))
                    return true;
                return false;
            }

        })) {
            if (!new File(f.getAbsoluteFile() + "x").exists()) {
                this.inputFiles.add(f);
            }
        }
    System.out
            .println(call + "Dateien gefunden: " + this.inputFiles.size());
    System.out.println(call + "abgeschlossen");
}

private HSSFWorkbook getWorkBook(File f) throws FileNotFoundException,
        IOException {
    System.out.println("getWorkBook lese " + f.getAbsolutePath());
    POIFSFileSystem fs = new POIFSFileSystem(new BufferedInputStream(
            new FileInputStream(f)));
    HSSFWorkbook workbook = new HSSFWorkbook(fs);
    System.out.println("getWorkBook abgeschlossen");
    return workbook;
}

private void transform() {
    String call = "transform ";
    System.out.println(call + "Workbook");
    XSSFSheet sheetNew;
    HSSFSheet sheetOld;
    this.workbookNew.setForceFormulaRecalculation(this.workbookOld
            .getForceFormulaRecalculation());
    // workbookNew.setHidden(workbookOld.isHidden()); //[email protected] -
    // von Apache noch nicht implementiert
    this.workbookNew.setMissingCellPolicy(this.workbookOld
            .getMissingCellPolicy());

    for (int i = 0; i < this.workbookOld.getNumberOfSheets(); i++) {
        sheetOld = this.workbookOld.getSheetAt(i);
        sheetNew = this.workbookNew.getSheet(sheetOld.getSheetName());
        System.out.println(call + "Sheet erstellt: "
                + sheetOld.getSheetName());
        sheetNew = this.workbookNew.createSheet(sheetOld.getSheetName());
        this.transform(sheetOld, sheetNew);
    }
    System.out.println(call + "Anzahl verwendeter Styles: "
            + this.styleMap.size());
    System.out.println(call + "abgeschlossen");
}

private void transform(HSSFSheet sheetOld, XSSFSheet sheetNew) {
    System.out.println("transform Sheet");

    sheetNew.setDisplayFormulas(sheetOld.isDisplayFormulas());
    sheetNew.setDisplayGridlines(sheetOld.isDisplayGridlines());
    sheetNew.setDisplayGuts(sheetOld.getDisplayGuts());
    sheetNew.setDisplayRowColHeadings(sheetOld.isDisplayRowColHeadings());
    sheetNew.setDisplayZeros(sheetOld.isDisplayZeros());
    sheetNew.setFitToPage(sheetOld.getFitToPage());
    sheetNew.setForceFormulaRecalculation(sheetOld
            .getForceFormulaRecalculation());
    sheetNew.setHorizontallyCenter(sheetOld.getHorizontallyCenter());
    sheetNew.setMargin(Sheet.BottomMargin,
            sheetOld.getMargin(Sheet.BottomMargin));
    sheetNew.setMargin(Sheet.FooterMargin,
            sheetOld.getMargin(Sheet.FooterMargin));
    sheetNew.setMargin(Sheet.HeaderMargin,
            sheetOld.getMargin(Sheet.HeaderMargin));
    sheetNew.setMargin(Sheet.LeftMargin,
            sheetOld.getMargin(Sheet.LeftMargin));
    sheetNew.setMargin(Sheet.RightMargin,
            sheetOld.getMargin(Sheet.RightMargin));
    sheetNew.setMargin(Sheet.TopMargin, sheetOld.getMargin(Sheet.TopMargin));
    sheetNew.setPrintGridlines(sheetNew.isPrintGridlines());
    sheetNew.setRightToLeft(sheetNew.isRightToLeft());
    sheetNew.setRowSumsBelow(sheetNew.getRowSumsBelow());
    sheetNew.setRowSumsRight(sheetNew.getRowSumsRight());
    sheetNew.setVerticallyCenter(sheetOld.getVerticallyCenter());

    XSSFRow rowNew;
    for (Row row : sheetOld) {
        rowNew = sheetNew.createRow(row.getRowNum());
        if (rowNew != null)
            this.transform((HSSFRow) row, rowNew);
    }

    for (int i = 0; i < this.lastColumn; i++) {
        sheetNew.setColumnWidth(i, sheetOld.getColumnWidth(i));
        sheetNew.setColumnHidden(i, sheetOld.isColumnHidden(i));
    }

    for (int i = 0; i < sheetOld.getNumMergedRegions(); i++) {
        CellRangeAddress merged = sheetOld.getMergedRegion(i);
        sheetNew.addMergedRegion(merged);
    }
}

private void transform(HSSFRow rowOld, XSSFRow rowNew) {
    XSSFCell cellNew;
    rowNew.setHeight(rowOld.getHeight());
    if (rowOld.getRowStyle() != null) {
        Integer hash = rowOld.getRowStyle().hashCode();
        if (!this.styleMap.containsKey(hash))
            this.transform(hash, rowOld.getRowStyle(),
                    this.workbookNew.createCellStyle());
        rowNew.setRowStyle(this.styleMap.get(hash));
    }
    for (Cell cell : rowOld) {
        cellNew = rowNew.createCell(cell.getColumnIndex(),
                cell.getCellType());
        if (cellNew != null)
            this.transform((HSSFCell) cell, cellNew);
    }
    this.lastColumn = Math.max(this.lastColumn, rowOld.getLastCellNum());
}

private void transform(HSSFCell cellOld, XSSFCell cellNew) {
    cellNew.setCellComment(cellOld.getCellComment());

    Integer hash = cellOld.getCellStyle().hashCode();
    if (!this.styleMap.containsKey(hash)) {
        this.transform(hash, cellOld.getCellStyle(),
                this.workbookNew.createCellStyle());
    }
    cellNew.setCellStyle(this.styleMap.get(hash));

    switch (cellOld.getCellType()) {
    case Cell.CELL_TYPE_BLANK:
        break;
    case Cell.CELL_TYPE_BOOLEAN:
        cellNew.setCellValue(cellOld.getBooleanCellValue());
        break;
    case Cell.CELL_TYPE_ERROR:
        cellNew.setCellValue(cellOld.getErrorCellValue());
        break;
    case Cell.CELL_TYPE_FORMULA:
        cellNew.setCellValue(cellOld.getCellFormula());
        break;
    case Cell.CELL_TYPE_NUMERIC:
        cellNew.setCellValue(cellOld.getNumericCellValue());
        break;
    case Cell.CELL_TYPE_STRING:
        cellNew.setCellValue(cellOld.getStringCellValue());
        break;
    default:
        System.out.println("transform: Unbekannter Zellentyp "
                + cellOld.getCellType());
    }
}

private void transform(Integer hash, HSSFCellStyle styleOld,
        XSSFCellStyle styleNew) {
    styleNew.setAlignment(styleOld.getAlignment());
    styleNew.setBorderBottom(styleOld.getBorderBottom());
    styleNew.setBorderLeft(styleOld.getBorderLeft());
    styleNew.setBorderRight(styleOld.getBorderRight());
    styleNew.setBorderTop(styleOld.getBorderTop());
    styleNew.setDataFormat(this.transform(styleOld.getDataFormat()));
    styleNew.setFillBackgroundColor(styleOld.getFillBackgroundColor());
    styleNew.setFillForegroundColor(styleOld.getFillForegroundColor());
    styleNew.setFillPattern(styleOld.getFillPattern());
    styleNew.setFont(this.transform(styleOld.getFont(this.workbookOld)));
    styleNew.setHidden(styleOld.getHidden());
    styleNew.setIndention(styleOld.getIndention());
    styleNew.setLocked(styleOld.getLocked());
    styleNew.setVerticalAlignment(styleOld.getVerticalAlignment());
    styleNew.setWrapText(styleOld.getWrapText());
    this.styleMap.put(hash, styleNew);
}

private short transform(short index) {
    DataFormat formatOld = this.workbookOld.createDataFormat();
    DataFormat formatNew = this.workbookNew.createDataFormat();
    return formatNew.getFormat(formatOld.getFormat(index));
}

private XSSFFont transform(HSSFFont fontOld) {
    XSSFFont fontNew = this.workbookNew.createFont();
    fontNew.setBoldweight(fontOld.getBoldweight());
    fontNew.setCharSet(fontOld.getCharSet());
    fontNew.setColor(fontOld.getColor());
    fontNew.setFontName(fontOld.getFontName());
    fontNew.setFontHeight(fontOld.getFontHeight());
    fontNew.setItalic(fontOld.getItalic());
    fontNew.setStrikeout(fontOld.getStrikeout());
    fontNew.setTypeOffset(fontOld.getTypeOffset());
    fontNew.setUnderline(fontOld.getUnderline());
    return fontNew;
}
}
岁月流歌 2024-12-09 02:11:27
//Added xbean-2.3.0.jar/xmlbeans-2.3.0.jar,poi-ooxml-3.7-20101029.jarpoi-ooxml-schemas-3.7-beta1.jar,


import java.io.*;
import java.util.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

public class Xlsx2Xls {

private File path = new File("c:/Integration-TestCases.xls");
private ArrayList<File> inputFiles = new ArrayList<File>();

private int lastColumn = 0;
private HashMap<Integer, HSSFCellStyle> styleMap = new HashMap();

private void getInputFiles() {
    String call = "getInputFiles ";
    if (this.path.isFile()) {
        if (this.path.getAbsolutePath().endsWith(".xls")
                && !new File(this.path.getAbsolutePath() + "x").exists())
            this.inputFiles.add(this.path);
        else {
            System.out
                    .println("Datei endet nicht mit .xls oder XLSX-Datei existiert bereits");
        }
    } else
        for (File f : this.path.listFiles(new FilenameFilter() {
            // anonyme innere Klasse

            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith(".xls"))
                    return true;
                return false;
            }

        })) {
            if (!new File(f.getAbsoluteFile() + "x").exists()) {
                this.inputFiles.add(f);
            }
        }
    System.out
            .println(call + "Dateien gefunden: " + this.inputFiles.size());
    System.out.println(call + "abgeschlossen");
}

private HSSFWorkbook getWorkBook(File f) throws FileNotFoundException,
        IOException {
    System.out.println("getWorkBook lese " + f.getAbsolutePath());
    POIFSFileSystem fs = new POIFSFileSystem(new BufferedInputStream(
            new FileInputStream(f)));
    HSSFWorkbook workbook = new HSSFWorkbook(fs);
    System.out.println("getWorkBook abgeschlossen");
    return workbook;
}

private void transformXSSF(XSSFWorkbook workbookOld ,HSSFWorkbook workbookNew) {
    String call = "transform ";
    System.out.println(call + "Workbook");
    HSSFSheet sheetNew;
    XSSFSheet sheetOld;
    //TODO::workbookNew.setForceFormulaRecalculation(workbookOld.getForceFormulaRecalculation());
    // workbookNew.setHidden(workbookOld.isHidden()); //[email protected] -
    // von Apache noch nicht implementiert
    workbookNew.setMissingCellPolicy(workbookOld.getMissingCellPolicy());

    for (int i = 0; i < workbookOld.getNumberOfSheets(); i++) {
        sheetOld =  workbookOld.getSheetAt(i);
        sheetNew = workbookNew.getSheet(sheetOld.getSheetName());
        System.out.println(call + "Sheet Name: " + sheetOld.getSheetName());
        sheetNew = workbookNew.createSheet(sheetOld.getSheetName());
        this.transform(workbookOld,workbookNew,sheetOld, sheetNew);
    }
    System.out.println(call + "Styles size: "        + this.styleMap.size());
    System.out.println(call + "abgeschlossen");
}



    private void transform(XSSFWorkbook workbookOld ,HSSFWorkbook workbookNew,XSSFSheet sheetOld, HSSFSheet sheetNew) {
        System.out.println("transform Sheet");

        sheetNew.setDisplayFormulas(sheetOld.isDisplayFormulas());
        sheetNew.setDisplayGridlines(sheetOld.isDisplayGridlines());
        sheetNew.setDisplayGuts(sheetOld.getDisplayGuts());
        sheetNew.setDisplayRowColHeadings(sheetOld.isDisplayRowColHeadings());
        sheetNew.setDisplayZeros(sheetOld.isDisplayZeros());
        sheetNew.setFitToPage(sheetOld.getFitToPage());
        //
        //TODO::sheetNew.setForceFormulaRecalculation(sheetOld.getForceFormulaRecalculation());
        sheetNew.setHorizontallyCenter(sheetOld.getHorizontallyCenter());
        sheetNew.setMargin(Sheet.BottomMargin,
                sheetOld.getMargin(Sheet.BottomMargin));
        sheetNew.setMargin(Sheet.FooterMargin,
                sheetOld.getMargin(Sheet.FooterMargin));
        sheetNew.setMargin(Sheet.HeaderMargin,
                sheetOld.getMargin(Sheet.HeaderMargin));
        sheetNew.setMargin(Sheet.LeftMargin,
                sheetOld.getMargin(Sheet.LeftMargin));
        sheetNew.setMargin(Sheet.RightMargin,
                sheetOld.getMargin(Sheet.RightMargin));
        sheetNew.setMargin(Sheet.TopMargin, sheetOld.getMargin(Sheet.TopMargin));
        sheetNew.setPrintGridlines(sheetNew.isPrintGridlines());
        sheetNew.setRightToLeft(sheetNew.isRightToLeft());
        sheetNew.setRowSumsBelow(sheetNew.getRowSumsBelow());
        sheetNew.setRowSumsRight(sheetNew.getRowSumsRight());
        sheetNew.setVerticallyCenter(sheetOld.getVerticallyCenter());

        HSSFRow rowNew;
        for (Row row : sheetOld) {
            rowNew = sheetNew.createRow(row.getRowNum());
            if (rowNew != null)
                this.transform(workbookOld,workbookNew,(XSSFRow) row, rowNew);
        }

        for (int i = 0; i < this.lastColumn; i++) {
            sheetNew.setColumnWidth(i, sheetOld.getColumnWidth(i));
            sheetNew.setColumnHidden(i, sheetOld.isColumnHidden(i));
        }

        for (int i = 0; i < sheetOld.getNumMergedRegions(); i++) {
            CellRangeAddress merged = sheetOld.getMergedRegion(i);
            sheetNew.addMergedRegion(merged);
        }
    }



    private void transform(XSSFWorkbook workbookOld ,HSSFWorkbook workbookNew,XSSFRow rowOld, HSSFRow rowNew) {
        HSSFCell cellNew;
        rowNew.setHeight(rowOld.getHeight());
        //TODO::if (rowOld.getRowStyle() != null) {
            /*Integer hash = rowOld.getRowStyle().hashCode();
            if (!this.styleMap.containsKey(hash))
                this.transform(workbookOld,workbookNew,hash, (XSSFCellStyle)rowOld.getRowStyle(),(HSSFCellStyle)workbookNew.createCellStyle());
            rowNew.setRowStyle(this.styleMap.get(hash));
        }*/
        for (Cell cell : rowOld) {
            cellNew = rowNew.createCell(cell.getColumnIndex(),
                    cell.getCellType());
            if (cellNew != null)
                this.transform(workbookOld,workbookNew,(XSSFCell) cell, cellNew);
        }
        this.lastColumn = Math.max(this.lastColumn, rowOld.getLastCellNum());
    }




    private void transform(XSSFWorkbook workbookOld,HSSFWorkbook workbookNew,XSSFCell cellOld, HSSFCell cellNew) {
        cellNew.setCellComment(cellOld.getCellComment());

        Integer hash = cellOld.getCellStyle().hashCode();
        if (this.styleMap!=null && !this.styleMap.containsKey(hash)) {
            this.transform(workbookOld,workbookNew,hash, cellOld.getCellStyle(),(HSSFCellStyle)workbookNew.createCellStyle());
        }
        cellNew.setCellStyle(this.styleMap.get(hash));

        switch (cellOld.getCellType()) {
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            cellNew.setCellValue(cellOld.getBooleanCellValue());
            break;
        case Cell.CELL_TYPE_ERROR:
            cellNew.setCellValue(cellOld.getErrorCellValue());
            break;
        case Cell.CELL_TYPE_FORMULA:
            cellNew.setCellValue(cellOld.getCellFormula());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            cellNew.setCellValue(cellOld.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_STRING:
            cellNew.setCellValue(cellOld.getStringCellValue());
            break;
        default:
            System.out.println("transform: Unbekannter Zellentyp "
                    + cellOld.getCellType());
        }
    }




    private void transform(XSSFWorkbook workbookOld,HSSFWorkbook workbookNew,Integer hash, XSSFCellStyle styleOld,
            HSSFCellStyle styleNew) {
        styleNew.setAlignment(styleOld.getAlignment());
        styleNew.setBorderBottom(styleOld.getBorderBottom());
        styleNew.setBorderLeft(styleOld.getBorderLeft());
        styleNew.setBorderRight(styleOld.getBorderRight());
        styleNew.setBorderTop(styleOld.getBorderTop());
         styleNew.setDataFormat(this.transform( workbookOld, workbookNew,styleOld.getDataFormat()));
        styleNew.setFillBackgroundColor(styleOld.getFillBackgroundColor());
        styleNew.setFillForegroundColor(styleOld.getFillForegroundColor());
        styleNew.setFillPattern(styleOld.getFillPattern());
        styleNew.setFont(this.transform(workbookNew,(XSSFFont)styleOld.getFont()));
        styleNew.setHidden(styleOld.getHidden());
        styleNew.setIndention(styleOld.getIndention());
        styleNew.setLocked(styleOld.getLocked());
        styleNew.setVerticalAlignment(styleOld.getVerticalAlignment());
        styleNew.setWrapText(styleOld.getWrapText());
        this.styleMap.put(hash, styleNew);
    }

private short transform(XSSFWorkbook workbookOld,HSSFWorkbook workbookNew,short index) {
    DataFormat formatOld = workbookOld.createDataFormat();
    DataFormat formatNew = workbookNew.createDataFormat();
    return formatNew.getFormat(formatOld.getFormat(index));
}


    private HSSFFont transform(HSSFWorkbook workbookNew,XSSFFont fontOld) {
        HSSFFont fontNew = workbookNew.createFont();
        fontNew.setBoldweight(fontOld.getBoldweight());
        fontNew.setCharSet(fontOld.getCharSet());
        fontNew.setColor(fontOld.getColor());
        fontNew.setFontName(fontOld.getFontName());
        fontNew.setFontHeight(fontOld.getFontHeight());
        fontNew.setItalic(fontOld.getItalic());
        fontNew.setStrikeout(fontOld.getStrikeout());
        fontNew.setTypeOffset(fontOld.getTypeOffset());
        fontNew.setUnderline(fontOld.getUnderline());
        return fontNew;
    }

public static void main(String[] args) throws Exception{
    Xlsx2Xls xls=new Xlsx2Xls(); 
    //xls.transform();
     InputStream isXlsx = new FileInputStream("c:/OTD.xlsx");
     XSSFWorkbook workbookOld     = new XSSFWorkbook(isXlsx);

    String dest="c:/OTD1.xls";

    FileOutputStream out = new FileOutputStream(dest);
    HSSFWorkbook workbookNew = new HSSFWorkbook();
    xls.transformXSSF( workbookOld , workbookNew) ;    
    workbookNew.write(out);

    out.close();

//    InputStream isXls = new FileInputStream("c:/OTD1.xls");
//    HSSFWorkbook workbookNew     = new HSSFWorkbook(isXls);



}
}
//Added xbean-2.3.0.jar/xmlbeans-2.3.0.jar,poi-ooxml-3.7-20101029.jarpoi-ooxml-schemas-3.7-beta1.jar,


import java.io.*;
import java.util.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

public class Xlsx2Xls {

private File path = new File("c:/Integration-TestCases.xls");
private ArrayList<File> inputFiles = new ArrayList<File>();

private int lastColumn = 0;
private HashMap<Integer, HSSFCellStyle> styleMap = new HashMap();

private void getInputFiles() {
    String call = "getInputFiles ";
    if (this.path.isFile()) {
        if (this.path.getAbsolutePath().endsWith(".xls")
                && !new File(this.path.getAbsolutePath() + "x").exists())
            this.inputFiles.add(this.path);
        else {
            System.out
                    .println("Datei endet nicht mit .xls oder XLSX-Datei existiert bereits");
        }
    } else
        for (File f : this.path.listFiles(new FilenameFilter() {
            // anonyme innere Klasse

            @Override
            public boolean accept(File dir, String name) {
                if (name.endsWith(".xls"))
                    return true;
                return false;
            }

        })) {
            if (!new File(f.getAbsoluteFile() + "x").exists()) {
                this.inputFiles.add(f);
            }
        }
    System.out
            .println(call + "Dateien gefunden: " + this.inputFiles.size());
    System.out.println(call + "abgeschlossen");
}

private HSSFWorkbook getWorkBook(File f) throws FileNotFoundException,
        IOException {
    System.out.println("getWorkBook lese " + f.getAbsolutePath());
    POIFSFileSystem fs = new POIFSFileSystem(new BufferedInputStream(
            new FileInputStream(f)));
    HSSFWorkbook workbook = new HSSFWorkbook(fs);
    System.out.println("getWorkBook abgeschlossen");
    return workbook;
}

private void transformXSSF(XSSFWorkbook workbookOld ,HSSFWorkbook workbookNew) {
    String call = "transform ";
    System.out.println(call + "Workbook");
    HSSFSheet sheetNew;
    XSSFSheet sheetOld;
    //TODO::workbookNew.setForceFormulaRecalculation(workbookOld.getForceFormulaRecalculation());
    // workbookNew.setHidden(workbookOld.isHidden()); //[email protected] -
    // von Apache noch nicht implementiert
    workbookNew.setMissingCellPolicy(workbookOld.getMissingCellPolicy());

    for (int i = 0; i < workbookOld.getNumberOfSheets(); i++) {
        sheetOld =  workbookOld.getSheetAt(i);
        sheetNew = workbookNew.getSheet(sheetOld.getSheetName());
        System.out.println(call + "Sheet Name: " + sheetOld.getSheetName());
        sheetNew = workbookNew.createSheet(sheetOld.getSheetName());
        this.transform(workbookOld,workbookNew,sheetOld, sheetNew);
    }
    System.out.println(call + "Styles size: "        + this.styleMap.size());
    System.out.println(call + "abgeschlossen");
}



    private void transform(XSSFWorkbook workbookOld ,HSSFWorkbook workbookNew,XSSFSheet sheetOld, HSSFSheet sheetNew) {
        System.out.println("transform Sheet");

        sheetNew.setDisplayFormulas(sheetOld.isDisplayFormulas());
        sheetNew.setDisplayGridlines(sheetOld.isDisplayGridlines());
        sheetNew.setDisplayGuts(sheetOld.getDisplayGuts());
        sheetNew.setDisplayRowColHeadings(sheetOld.isDisplayRowColHeadings());
        sheetNew.setDisplayZeros(sheetOld.isDisplayZeros());
        sheetNew.setFitToPage(sheetOld.getFitToPage());
        //
        //TODO::sheetNew.setForceFormulaRecalculation(sheetOld.getForceFormulaRecalculation());
        sheetNew.setHorizontallyCenter(sheetOld.getHorizontallyCenter());
        sheetNew.setMargin(Sheet.BottomMargin,
                sheetOld.getMargin(Sheet.BottomMargin));
        sheetNew.setMargin(Sheet.FooterMargin,
                sheetOld.getMargin(Sheet.FooterMargin));
        sheetNew.setMargin(Sheet.HeaderMargin,
                sheetOld.getMargin(Sheet.HeaderMargin));
        sheetNew.setMargin(Sheet.LeftMargin,
                sheetOld.getMargin(Sheet.LeftMargin));
        sheetNew.setMargin(Sheet.RightMargin,
                sheetOld.getMargin(Sheet.RightMargin));
        sheetNew.setMargin(Sheet.TopMargin, sheetOld.getMargin(Sheet.TopMargin));
        sheetNew.setPrintGridlines(sheetNew.isPrintGridlines());
        sheetNew.setRightToLeft(sheetNew.isRightToLeft());
        sheetNew.setRowSumsBelow(sheetNew.getRowSumsBelow());
        sheetNew.setRowSumsRight(sheetNew.getRowSumsRight());
        sheetNew.setVerticallyCenter(sheetOld.getVerticallyCenter());

        HSSFRow rowNew;
        for (Row row : sheetOld) {
            rowNew = sheetNew.createRow(row.getRowNum());
            if (rowNew != null)
                this.transform(workbookOld,workbookNew,(XSSFRow) row, rowNew);
        }

        for (int i = 0; i < this.lastColumn; i++) {
            sheetNew.setColumnWidth(i, sheetOld.getColumnWidth(i));
            sheetNew.setColumnHidden(i, sheetOld.isColumnHidden(i));
        }

        for (int i = 0; i < sheetOld.getNumMergedRegions(); i++) {
            CellRangeAddress merged = sheetOld.getMergedRegion(i);
            sheetNew.addMergedRegion(merged);
        }
    }



    private void transform(XSSFWorkbook workbookOld ,HSSFWorkbook workbookNew,XSSFRow rowOld, HSSFRow rowNew) {
        HSSFCell cellNew;
        rowNew.setHeight(rowOld.getHeight());
        //TODO::if (rowOld.getRowStyle() != null) {
            /*Integer hash = rowOld.getRowStyle().hashCode();
            if (!this.styleMap.containsKey(hash))
                this.transform(workbookOld,workbookNew,hash, (XSSFCellStyle)rowOld.getRowStyle(),(HSSFCellStyle)workbookNew.createCellStyle());
            rowNew.setRowStyle(this.styleMap.get(hash));
        }*/
        for (Cell cell : rowOld) {
            cellNew = rowNew.createCell(cell.getColumnIndex(),
                    cell.getCellType());
            if (cellNew != null)
                this.transform(workbookOld,workbookNew,(XSSFCell) cell, cellNew);
        }
        this.lastColumn = Math.max(this.lastColumn, rowOld.getLastCellNum());
    }




    private void transform(XSSFWorkbook workbookOld,HSSFWorkbook workbookNew,XSSFCell cellOld, HSSFCell cellNew) {
        cellNew.setCellComment(cellOld.getCellComment());

        Integer hash = cellOld.getCellStyle().hashCode();
        if (this.styleMap!=null && !this.styleMap.containsKey(hash)) {
            this.transform(workbookOld,workbookNew,hash, cellOld.getCellStyle(),(HSSFCellStyle)workbookNew.createCellStyle());
        }
        cellNew.setCellStyle(this.styleMap.get(hash));

        switch (cellOld.getCellType()) {
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            cellNew.setCellValue(cellOld.getBooleanCellValue());
            break;
        case Cell.CELL_TYPE_ERROR:
            cellNew.setCellValue(cellOld.getErrorCellValue());
            break;
        case Cell.CELL_TYPE_FORMULA:
            cellNew.setCellValue(cellOld.getCellFormula());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            cellNew.setCellValue(cellOld.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_STRING:
            cellNew.setCellValue(cellOld.getStringCellValue());
            break;
        default:
            System.out.println("transform: Unbekannter Zellentyp "
                    + cellOld.getCellType());
        }
    }




    private void transform(XSSFWorkbook workbookOld,HSSFWorkbook workbookNew,Integer hash, XSSFCellStyle styleOld,
            HSSFCellStyle styleNew) {
        styleNew.setAlignment(styleOld.getAlignment());
        styleNew.setBorderBottom(styleOld.getBorderBottom());
        styleNew.setBorderLeft(styleOld.getBorderLeft());
        styleNew.setBorderRight(styleOld.getBorderRight());
        styleNew.setBorderTop(styleOld.getBorderTop());
         styleNew.setDataFormat(this.transform( workbookOld, workbookNew,styleOld.getDataFormat()));
        styleNew.setFillBackgroundColor(styleOld.getFillBackgroundColor());
        styleNew.setFillForegroundColor(styleOld.getFillForegroundColor());
        styleNew.setFillPattern(styleOld.getFillPattern());
        styleNew.setFont(this.transform(workbookNew,(XSSFFont)styleOld.getFont()));
        styleNew.setHidden(styleOld.getHidden());
        styleNew.setIndention(styleOld.getIndention());
        styleNew.setLocked(styleOld.getLocked());
        styleNew.setVerticalAlignment(styleOld.getVerticalAlignment());
        styleNew.setWrapText(styleOld.getWrapText());
        this.styleMap.put(hash, styleNew);
    }

private short transform(XSSFWorkbook workbookOld,HSSFWorkbook workbookNew,short index) {
    DataFormat formatOld = workbookOld.createDataFormat();
    DataFormat formatNew = workbookNew.createDataFormat();
    return formatNew.getFormat(formatOld.getFormat(index));
}


    private HSSFFont transform(HSSFWorkbook workbookNew,XSSFFont fontOld) {
        HSSFFont fontNew = workbookNew.createFont();
        fontNew.setBoldweight(fontOld.getBoldweight());
        fontNew.setCharSet(fontOld.getCharSet());
        fontNew.setColor(fontOld.getColor());
        fontNew.setFontName(fontOld.getFontName());
        fontNew.setFontHeight(fontOld.getFontHeight());
        fontNew.setItalic(fontOld.getItalic());
        fontNew.setStrikeout(fontOld.getStrikeout());
        fontNew.setTypeOffset(fontOld.getTypeOffset());
        fontNew.setUnderline(fontOld.getUnderline());
        return fontNew;
    }

public static void main(String[] args) throws Exception{
    Xlsx2Xls xls=new Xlsx2Xls(); 
    //xls.transform();
     InputStream isXlsx = new FileInputStream("c:/OTD.xlsx");
     XSSFWorkbook workbookOld     = new XSSFWorkbook(isXlsx);

    String dest="c:/OTD1.xls";

    FileOutputStream out = new FileOutputStream(dest);
    HSSFWorkbook workbookNew = new HSSFWorkbook();
    xls.transformXSSF( workbookOld , workbookNew) ;    
    workbookNew.write(out);

    out.close();

//    InputStream isXls = new FileInputStream("c:/OTD1.xls");
//    HSSFWorkbook workbookNew     = new HSSFWorkbook(isXls);



}
}
我的痛♀有谁懂 2024-12-09 02:11:27

请参阅文章升级到 POI 3.5,包括将现有 HSSF 用户模型代码转换为 SS 用户模型(例如XSSF 和 HSSF)这里有一个示例,概括如下以下:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XlsxReader {

    public static void main(String[] args) throws IOException {
        InputStream myxls = new FileInputStream("test.xlsx");
        Workbook book = new XSSFWorkbook(myxls);
        FormulaEvaluator eval =
            book.getCreationHelper().createFormulaEvaluator();
        Sheet sheet = book.getSheetAt(0);
        for (Row row : sheet) {
            for (Cell cell : row) {
                printCell(cell, eval);
                System.out.print("; ");
            }
            System.out.println();
        }
        myxls.close();
    }

    private static void printCell(Cell cell, FormulaEvaluator eval) {
        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_BLANK:
                System.out.print("EMPTY");
                break;
            case Cell.CELL_TYPE_STRING:
                System.out.print(cell.getStringCellValue());
                break;
            case Cell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.print(cell.getDateCellValue());
                } else {
                    System.out.print(cell.getNumericCellValue());
                }
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                System.out.print(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA:
                System.out.print(cell.getCellFormula());
                break;
            default:
                System.out.print("DEFAULT");
        }
    }
}

See the article Upgrading to POI 3.5, including converting existing HSSF Usermodel code to SS Usermodel (for XSSF and HSSF). There's an example here, recapitulated below:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XlsxReader {

    public static void main(String[] args) throws IOException {
        InputStream myxls = new FileInputStream("test.xlsx");
        Workbook book = new XSSFWorkbook(myxls);
        FormulaEvaluator eval =
            book.getCreationHelper().createFormulaEvaluator();
        Sheet sheet = book.getSheetAt(0);
        for (Row row : sheet) {
            for (Cell cell : row) {
                printCell(cell, eval);
                System.out.print("; ");
            }
            System.out.println();
        }
        myxls.close();
    }

    private static void printCell(Cell cell, FormulaEvaluator eval) {
        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_BLANK:
                System.out.print("EMPTY");
                break;
            case Cell.CELL_TYPE_STRING:
                System.out.print(cell.getStringCellValue());
                break;
            case Cell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.print(cell.getDateCellValue());
                } else {
                    System.out.print(cell.getNumericCellValue());
                }
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                System.out.print(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA:
                System.out.print(cell.getCellFormula());
                break;
            default:
                System.out.print("DEFAULT");
        }
    }
}
幸福%小乖 2024-12-09 02:11:27

我的问题解决方案。工作代码

public SXSSFWorkbook createSXSSFWorkbookFromXSSFWorkbook(XSSFWorkbook sourceWorkbook)   {
    SXSSFWorkbook targetWorkbook = new SXSSFWorkbook();

    // Loop through each sheet in XSSFWorkbook
    for (int i = 0; i < sourceWorkbook.getNumberOfSheets(); i++) {
        XSSFSheet sourceSheet = sourceWorkbook.getSheetAt(i);
        SXSSFSheet targetSheet = targetWorkbook.createSheet(sourceSheet.getSheetName());
        String sheetName = sourceSheet.getSheetName();

        // Loop through each row in XSSFSheet
        for (Row sourceRow : sourceSheet) {
            SXSSFRow targetRow = targetSheet.createRow(sourceRow.getRowNum());
            targetSheet.setRandomAccessWindowSize(1000000);

            // Loop through each cell in XSSFRow
            Iterator<Cell> cellIterator = sourceRow.cellIterator();
            while (cellIterator.hasNext()) {
                Cell sourceCell = cellIterator.next();
                SXSSFCell targetCell = targetRow.createCell(sourceCell.getColumnIndex());

                // Copy cell value from source to target
                importUtility.copyCellValue(sourceCell, targetCell, targetWorkbook);
            }
        }
        setWidthColumn(sourceSheet, targetSheet);

        //hide Row with legends
        if (!META.equals(sheetName) && !NSI.equals(sheetName)) {
            targetSheet.getRow(1).setHidden(true);
        }
    }

    return targetWorkbook;
}

private void setWidthColumn(XSSFSheet sourceSheet, SXSSFSheet targetSheet) {
    if (sourceSheet.getRow(0) == null) {
        logger.warn("Sheet ['{}'] doesn't have row number 0 or sheet is empty", sourceSheet.getSheetName());
    } else {
        for (int j = 0; j < sourceSheet.getRow(0).getLastCellNum(); j++) {
            if (sourceSheet.getRow(0).getCell(j) == null) {
                break;
            }
            int length = sourceSheet.getRow(0).getCell(j).getStringCellValue().length();
            if (length < 20) {
                targetSheet.setColumnWidth(j, 20 * 256);
            } else {
                targetSheet.setColumnWidth(j, (length + 5) * 256);
            }
        }
    }
}

My solution to the problem. Working code

public SXSSFWorkbook createSXSSFWorkbookFromXSSFWorkbook(XSSFWorkbook sourceWorkbook)   {
    SXSSFWorkbook targetWorkbook = new SXSSFWorkbook();

    // Loop through each sheet in XSSFWorkbook
    for (int i = 0; i < sourceWorkbook.getNumberOfSheets(); i++) {
        XSSFSheet sourceSheet = sourceWorkbook.getSheetAt(i);
        SXSSFSheet targetSheet = targetWorkbook.createSheet(sourceSheet.getSheetName());
        String sheetName = sourceSheet.getSheetName();

        // Loop through each row in XSSFSheet
        for (Row sourceRow : sourceSheet) {
            SXSSFRow targetRow = targetSheet.createRow(sourceRow.getRowNum());
            targetSheet.setRandomAccessWindowSize(1000000);

            // Loop through each cell in XSSFRow
            Iterator<Cell> cellIterator = sourceRow.cellIterator();
            while (cellIterator.hasNext()) {
                Cell sourceCell = cellIterator.next();
                SXSSFCell targetCell = targetRow.createCell(sourceCell.getColumnIndex());

                // Copy cell value from source to target
                importUtility.copyCellValue(sourceCell, targetCell, targetWorkbook);
            }
        }
        setWidthColumn(sourceSheet, targetSheet);

        //hide Row with legends
        if (!META.equals(sheetName) && !NSI.equals(sheetName)) {
            targetSheet.getRow(1).setHidden(true);
        }
    }

    return targetWorkbook;
}

private void setWidthColumn(XSSFSheet sourceSheet, SXSSFSheet targetSheet) {
    if (sourceSheet.getRow(0) == null) {
        logger.warn("Sheet ['{}'] doesn't have row number 0 or sheet is empty", sourceSheet.getSheetName());
    } else {
        for (int j = 0; j < sourceSheet.getRow(0).getLastCellNum(); j++) {
            if (sourceSheet.getRow(0).getCell(j) == null) {
                break;
            }
            int length = sourceSheet.getRow(0).getCell(j).getStringCellValue().length();
            if (length < 20) {
                targetSheet.setColumnWidth(j, 20 * 256);
            } else {
                targetSheet.setColumnWidth(j, (length + 5) * 256);
            }
        }
    }
}
浮光之海 2024-12-09 02:11:27

这是我的方法

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFPictureData;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFShape;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.Header;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFName;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor;

public class XlsXlsxConverter3 {
@SuppressWarnings("unused")
private static class FormulaInfo {

private String sheetName;
private Integer rowIndex;
private Integer cellIndex;
private String formula;

private FormulaInfo(String sheetName, Integer rowIndex, Integer cellIndex, String formula) {
this.sheetName = sheetName;
this.rowIndex = rowIndex;
this.cellIndex = cellIndex;
this.formula = formula;
}

public String getSheetName() {
return sheetName;
}

public void setSheetName(String sheetName) {
this.sheetName = sheetName;
}

public Integer getRowIndex() {
return rowIndex;
}

public void setRowIndex(Integer rowIndex) {
this.rowIndex = rowIndex;
}

public Integer getCellIndex() {
return cellIndex;
}

public void setCellIndex(Integer cellIndex) {
this.cellIndex = cellIndex;
}

public String getFormula() {
return formula;
}

public void setFormula(String formula) {
this.formula = formula;
}
}

static List<FormulaInfo> formulaInfoList = new ArrayList<FormulaInfo>();

public static void refreshFormula(XSSFWorkbook workbook) {
for (FormulaInfo formulaInfo : formulaInfoList) {
workbook.getSheet(formulaInfo.getSheetName()).getRow(formulaInfo.getRowIndex())
.getCell(formulaInfo.getCellIndex()).setCellFormula(formulaInfo.getFormula());
}
formulaInfoList.removeAll(formulaInfoList);
}

public static XSSFWorkbook convertWorkbookHSSFToXSSF(HSSFWorkbook source) {
XSSFWorkbook retVal = new XSSFWorkbook();

for (int i = 0; i < source.getNumberOfSheets(); i++) {

HSSFSheet hssfsheet = source.getSheetAt(i);
XSSFSheet xssfSheet = retVal.createSheet(hssfsheet.getSheetName());

copySheetSettings(xssfSheet, hssfsheet);
copySheet(hssfsheet, xssfSheet);
copyPictures(xssfSheet, hssfsheet);
}

refreshFormula(retVal);

return retVal;
}

private static void copySheet(HSSFSheet source, XSSFSheet destination) {
copySheet(source, destination, true);
}

/**
* @param destination
* the sheet to create from the copy.
* @param the
* sheet to copy.
* @param copyStyle
* true copy the style.
*/
private static void copySheet(HSSFSheet source, XSSFSheet destination, boolean copyStyle) {
int maxColumnNum = 0;
List<CellStyle> styleMap2 = (copyStyle) ? new ArrayList<CellStyle>() : null;
for (int i = source.getFirstRowNum(); i <= source.getLastRowNum(); i++) {
HSSFRow srcRow = source.getRow(i);
XSSFRow destRow = destination.createRow(i);
if (srcRow != null) {
// copyRow(source, destination, srcRow, destRow, styleMap);
copyRow(source, destination, srcRow, destRow, styleMap2);
if (srcRow.getLastCellNum() > maxColumnNum) {
maxColumnNum = srcRow.getLastCellNum();
}
}
}
for (int i = 0; i <= maxColumnNum; i++) {
destination.setColumnWidth(i, source.getColumnWidth(i));
}
}

/**
* @param srcSheet
* the sheet to copy.
* @param destSheet
* the sheet to create.
* @param srcRow
* the row to copy.
* @param destRow
* the row to create.
* @param styleMap
* -
*/
private static void copyRow(HSSFSheet srcSheet, XSSFSheet destSheet, HSSFRow srcRow, XSSFRow destRow,
// Map<Integer, HSSFCellStyle> styleMap) {
List<CellStyle> styleMap) {
// manage a list of merged zone in order to not insert two times a
// merged zone
Set<CellRangeAddressWrapper> mergedRegions = new TreeSet<CellRangeAddressWrapper>();
destRow.setHeight(srcRow.getHeight());
// pour chaque row
// for (int j = srcRow.getFirstCellNum(); j <= srcRow.getLastCellNum();
// j++) {
int j = srcRow.getFirstCellNum();
if (j < 0) {
j = 0;
}
for (; j <= srcRow.getLastCellNum(); j++) {
HSSFCell oldCell = srcRow.getCell(j); // ancienne cell
XSSFCell newCell = destRow.getCell(j); // new cell
if (oldCell != null) {
if (newCell == null) {
newCell = destRow.createCell(j);
}
// copy chaque cell
copyCell(oldCell, newCell, styleMap);
// copy les informations de fusion entre les cellules
// System.out.println("row num: " + srcRow.getRowNum() +
// " , col: " + (short)oldCell.getColumnIndex());
CellRangeAddress mergedRegion = getMergedRegion(srcSheet, srcRow.getRowNum(),
(short) oldCell.getColumnIndex());

if (mergedRegion != null) {
// System.out.println("Selected merged region: " +
// mergedRegion.toString());
CellRangeAddress newMergedRegion = new CellRangeAddress(mergedRegion.getFirstRow(),
mergedRegion.getLastRow(), mergedRegion.getFirstColumn(), mergedRegion.getLastColumn());
// System.out.println("New merged region: " +
// newMergedRegion.toString());
CellRangeAddressWrapper wrapper = new CellRangeAddressWrapper(newMergedRegion);
if (isNewMergedRegion(wrapper, mergedRegions)) {
mergedRegions.add(wrapper);
destSheet.addMergedRegion(wrapper.range);
}
}
}
}

}

/**
* Récupère les informations de fusion des cellules dans la sheet source
* pour les appliquer à la sheet destination... Récupère toutes les zones
* merged dans la sheet source et regarde pour chacune d'elle si elle se
* trouve dans la current row que nous traitons. Si oui, retourne l'objet
* CellRangeAddress.
*
* @param sheet
* the sheet containing the data.
* @param rowNum
* the num of the row to copy.
* @param cellNum
* the num of the cell to copy.
* @return the CellRangeAddress created.
*/
public static CellRangeAddress getMergedRegion(HSSFSheet 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;
}

/**
* Check that the merged region has been created in the destination sheet.
*
* @param newMergedRegion
* the merged region to copy or not in the destination sheet.
* @param mergedRegions
* the list containing all the merged region.
* @return true if the merged region is already in the list or not.
*/
private static boolean isNewMergedRegion(CellRangeAddressWrapper newMergedRegion,
Set<CellRangeAddressWrapper> mergedRegions) {
return !mergedRegions.contains(newMergedRegion);
}

private static void copyPictures(Sheet newSheet, Sheet sheet) {
Drawing drawingOld = sheet.createDrawingPatriarch();
Drawing drawingNew = newSheet.createDrawingPatriarch();
CreationHelper helper = newSheet.getWorkbook().getCreationHelper();

// if (drawingNew instanceof HSSFPatriarch) {
if (drawingOld instanceof HSSFPatriarch) {
List<HSSFShape> shapes = ((HSSFPatriarch) drawingOld).getChildren();
for (int i = 0; i < shapes.size(); i++) {
System.out.println(shapes.size());
if (shapes.get(i) instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shapes.get(i);
HSSFPictureData picdata = pic.getPictureData();
int pictureIndex = newSheet.getWorkbook().addPicture(picdata.getData(), picdata.getFormat());
ClientAnchor anchor = null;
if (pic.getAnchor() != null) {
anchor = helper.createClientAnchor();
anchor.setDx1(((HSSFClientAnchor) pic.getAnchor()).getDx1());
anchor.setDx2(((HSSFClientAnchor) pic.getAnchor()).getDx2());
anchor.setDy1(((HSSFClientAnchor) pic.getAnchor()).getDy1());
anchor.setDy2(((HSSFClientAnchor) pic.getAnchor()).getDy2());
anchor.setCol1(((HSSFClientAnchor) pic.getAnchor()).getCol1());
anchor.setCol2(((HSSFClientAnchor) pic.getAnchor()).getCol2());
anchor.setRow1(((HSSFClientAnchor) pic.getAnchor()).getRow1());
anchor.setRow2(((HSSFClientAnchor) pic.getAnchor()).getRow2());
anchor.setAnchorType(((HSSFClientAnchor) pic.getAnchor()).getAnchorType());
}
drawingNew.createPicture(anchor, pictureIndex);
}
}
} else {
if (drawingNew instanceof XSSFDrawing) {
List<XSSFShape> shapes = ((XSSFDrawing) drawingOld).getShapes();
for (int i = 0; i < shapes.size(); i++) {
if (shapes.get(i) instanceof XSSFPicture) {
XSSFPicture pic = (XSSFPicture) shapes.get(i);
XSSFPictureData picdata = pic.getPictureData();
int pictureIndex = newSheet.getWorkbook().addPicture(picdata.getData(),
picdata.getPictureType());
XSSFClientAnchor anchor = null;
CTTwoCellAnchor oldAnchor = ((XSSFDrawing) drawingOld).getCTDrawing().getTwoCellAnchorArray(i);
if (oldAnchor != null) {
anchor = (XSSFClientAnchor) helper.createClientAnchor();
CTMarker markerFrom = oldAnchor.getFrom();
CTMarker markerTo = oldAnchor.getTo();
anchor.setDx1((int) markerFrom.getColOff());
anchor.setDx2((int) markerTo.getColOff());
anchor.setDy1((int) markerFrom.getRowOff());
anchor.setDy2((int) markerTo.getRowOff());
anchor.setCol1(markerFrom.getCol());
anchor.setCol2(markerTo.getCol());
anchor.setRow1(markerFrom.getRow());
anchor.setRow2(markerTo.getRow());
}
drawingNew.createPicture(anchor, pictureIndex);
}
}
}
}
}

private static void copyCell(Cell oldCell, Cell newCell, List<CellStyle> styleList) {
if (styleList != null) {
if (oldCell.getSheet().getWorkbook() == newCell.getSheet().getWorkbook()) {
newCell.setCellStyle(oldCell.getCellStyle());
} else {
DataFormat newDataFormat = newCell.getSheet().getWorkbook().createDataFormat();

CellStyle newCellStyle = getSameCellStyle(oldCell, newCell, styleList);
if (newCellStyle == null) {
// Create a new cell style
Font oldFont = oldCell.getSheet().getWorkbook().getFontAt(oldCell.getCellStyle().getFontIndex());
// Find a existing font corresponding to avoid to create a
// new one
Font newFont = newCell
.getSheet()
.getWorkbook()
.findFont(oldFont.getBoldweight(), oldFont.getColor(), oldFont.getFontHeight(),
oldFont.getFontName(), oldFont.getItalic(), oldFont.getStrikeout(),
oldFont.getTypeOffset(), oldFont.getUnderline());
if (newFont == null) {
newFont = newCell.getSheet().getWorkbook().createFont();
newFont.setBoldweight(oldFont.getBoldweight());
newFont.setColor(oldFont.getColor());
newFont.setFontHeight(oldFont.getFontHeight());
newFont.setFontName(oldFont.getFontName());
newFont.setItalic(oldFont.getItalic());
newFont.setStrikeout(oldFont.getStrikeout());
newFont.setTypeOffset(oldFont.getTypeOffset());
newFont.setUnderline(oldFont.getUnderline());
newFont.setCharSet(oldFont.getCharSet());
}

short newFormat = newDataFormat.getFormat(oldCell.getCellStyle().getDataFormatString());
newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();
newCellStyle.setFont(newFont);
newCellStyle.setDataFormat(newFormat);

newCellStyle.setAlignment(oldCell.getCellStyle().getAlignment());
newCellStyle.setHidden(oldCell.getCellStyle().getHidden());
newCellStyle.setLocked(oldCell.getCellStyle().getLocked());
newCellStyle.setWrapText(oldCell.getCellStyle().getWrapText());
newCellStyle.setBorderBottom(oldCell.getCellStyle().getBorderBottom());
newCellStyle.setBorderLeft(oldCell.getCellStyle().getBorderLeft());
newCellStyle.setBorderRight(oldCell.getCellStyle().getBorderRight());
newCellStyle.setBorderTop(oldCell.getCellStyle().getBorderTop());
newCellStyle.setBottomBorderColor(oldCell.getCellStyle().getBottomBorderColor());
newCellStyle.setFillBackgroundColor(oldCell.getCellStyle().getFillBackgroundColor());
newCellStyle.setFillForegroundColor(oldCell.getCellStyle().getFillForegroundColor());
newCellStyle.setFillPattern(oldCell.getCellStyle().getFillPattern());
newCellStyle.setIndention(oldCell.getCellStyle().getIndention());
newCellStyle.setLeftBorderColor(oldCell.getCellStyle().getLeftBorderColor());
newCellStyle.setRightBorderColor(oldCell.getCellStyle().getRightBorderColor());
newCellStyle.setRotation(oldCell.getCellStyle().getRotation());
newCellStyle.setTopBorderColor(oldCell.getCellStyle().getTopBorderColor());
newCellStyle.setVerticalAlignment(oldCell.getCellStyle().getVerticalAlignment());

styleList.add(newCellStyle);
}
newCell.setCellStyle(newCellStyle);
}
}
switch (oldCell.getCellType()) {
case Cell.CELL_TYPE_STRING:
newCell.setCellValue(oldCell.getStringCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
newCell.setCellValue(oldCell.getNumericCellValue());
break;
case Cell.CELL_TYPE_BLANK:
newCell.setCellType(Cell.CELL_TYPE_BLANK);
break;
case Cell.CELL_TYPE_BOOLEAN:
newCell.setCellValue(oldCell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
newCell.setCellErrorValue(oldCell.getErrorCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
newCell.setCellFormula(oldCell.getCellFormula());
formulaInfoList.add(new FormulaInfo(oldCell.getSheet().getSheetName(), oldCell.getRowIndex(), oldCell
.getColumnIndex(), oldCell.getCellFormula()));
break;
default:
break;
}
}

private static CellStyle getSameCellStyle(Cell oldCell, Cell newCell, List<CellStyle> styleList) {
CellStyle styleToFind = oldCell.getCellStyle();
CellStyle currentCellStyle = null;
CellStyle returnCellStyle = null;
Iterator<CellStyle> iterator = styleList.iterator();
Font oldFont = null;
Font newFont = null;
while (iterator.hasNext() && returnCellStyle == null) {
currentCellStyle = iterator.next();

if (currentCellStyle.getAlignment() != styleToFind.getAlignment()) {
continue;
}
if (currentCellStyle.getHidden() != styleToFind.getHidden()) {
continue;
}
if (currentCellStyle.getLocked() != styleToFind.getLocked()) {
continue;
}
if (currentCellStyle.getWrapText() != styleToFind.getWrapText()) {
continue;
}
if (currentCellStyle.getBorderBottom() != styleToFind.getBorderBottom()) {
continue;
}
if (currentCellStyle.getBorderLeft() != styleToFind.getBorderLeft()) {
continue;
}
if (currentCellStyle.getBorderRight() != styleToFind.getBorderRight()) {
continue;
}
if (currentCellStyle.getBorderTop() != styleToFind.getBorderTop()) {
continue;
}
if (currentCellStyle.getBottomBorderColor() != styleToFind.getBottomBorderColor()) {
continue;
}
if (currentCellStyle.getFillBackgroundColor() != styleToFind.getFillBackgroundColor()) {
continue;
}
if (currentCellStyle.getFillForegroundColor() != styleToFind.getFillForegroundColor()) {
continue;
}
if (currentCellStyle.getFillPattern() != styleToFind.getFillPattern()) {
continue;
}
if (currentCellStyle.getIndention() != styleToFind.getIndention()) {
continue;
}
if (currentCellStyle.getLeftBorderColor() != styleToFind.getLeftBorderColor()) {
continue;
}
if (currentCellStyle.getRightBorderColor() != styleToFind.getRightBorderColor()) {
continue;
}
if (currentCellStyle.getRotation() != styleToFind.getRotation()) {
continue;
}
if (currentCellStyle.getTopBorderColor() != styleToFind.getTopBorderColor()) {
continue;
}
if (currentCellStyle.getVerticalAlignment() != styleToFind.getVerticalAlignment()) {
continue;
}

oldFont = oldCell.getSheet().getWorkbook().getFontAt(oldCell.getCellStyle().getFontIndex());
newFont = newCell.getSheet().getWorkbook().getFontAt(currentCellStyle.getFontIndex());

if (newFont.getBoldweight() == oldFont.getBoldweight()) {
continue;
}
if (newFont.getColor() == oldFont.getColor()) {
continue;
}
if (newFont.getFontHeight() == oldFont.getFontHeight()) {
continue;
}
if (newFont.getFontName() == oldFont.getFontName()) {
continue;
}
if (newFont.getItalic() == oldFont.getItalic()) {
continue;
}
if (newFont.getStrikeout() == oldFont.getStrikeout()) {
continue;
}
if (newFont.getTypeOffset() == oldFont.getTypeOffset()) {
continue;
}
if (newFont.getUnderline() == oldFont.getUnderline()) {
continue;
}
if (newFont.getCharSet() == oldFont.getCharSet()) {
continue;
}
if (oldCell.getCellStyle().getDataFormatString().equals(currentCellStyle.getDataFormatString())) {
continue;
}

returnCellStyle = currentCellStyle;
}
return returnCellStyle;
}

private static void copySheetSettings(Sheet newSheet, Sheet sheetToCopy) {

newSheet.setAutobreaks(sheetToCopy.getAutobreaks());
newSheet.setDefaultColumnWidth(sheetToCopy.getDefaultColumnWidth());
newSheet.setDefaultRowHeight(sheetToCopy.getDefaultRowHeight());
newSheet.setDefaultRowHeightInPoints(sheetToCopy.getDefaultRowHeightInPoints());
newSheet.setDisplayGuts(sheetToCopy.getDisplayGuts());
newSheet.setFitToPage(sheetToCopy.getFitToPage());

newSheet.setForceFormulaRecalculation(sheetToCopy.getForceFormulaRecalculation());

PrintSetup sheetToCopyPrintSetup = sheetToCopy.getPrintSetup();
PrintSetup newSheetPrintSetup = newSheet.getPrintSetup();

newSheetPrintSetup.setPaperSize(sheetToCopyPrintSetup.getPaperSize());
newSheetPrintSetup.setScale(sheetToCopyPrintSetup.getScale());
newSheetPrintSetup.setPageStart(sheetToCopyPrintSetup.getPageStart());
newSheetPrintSetup.setFitWidth(sheetToCopyPrintSetup.getFitWidth());
newSheetPrintSetup.setFitHeight(sheetToCopyPrintSetup.getFitHeight());
newSheetPrintSetup.setLeftToRight(sheetToCopyPrintSetup.getLeftToRight());
newSheetPrintSetup.setLandscape(sheetToCopyPrintSetup.getLandscape());
newSheetPrintSetup.setValidSettings(sheetToCopyPrintSetup.getValidSettings());
newSheetPrintSetup.setNoColor(sheetToCopyPrintSetup.getNoColor());
newSheetPrintSetup.setDraft(sheetToCopyPrintSetup.getDraft());
newSheetPrintSetup.setNotes(sheetToCopyPrintSetup.getNotes());
newSheetPrintSetup.setNoOrientation(sheetToCopyPrintSetup.getNoOrientation());
newSheetPrintSetup.setUsePage(sheetToCopyPrintSetup.getUsePage());
newSheetPrintSetup.setHResolution(sheetToCopyPrintSetup.getHResolution());
newSheetPrintSetup.setVResolution(sheetToCopyPrintSetup.getVResolution());
newSheetPrintSetup.setHeaderMargin(sheetToCopyPrintSetup.getHeaderMargin());
newSheetPrintSetup.setFooterMargin(sheetToCopyPrintSetup.getFooterMargin());
newSheetPrintSetup.setCopies(sheetToCopyPrintSetup.getCopies());

Header sheetToCopyHeader = sheetToCopy.getHeader();
Header newSheetHeader = newSheet.getHeader();
newSheetHeader.setCenter(sheetToCopyHeader.getCenter());
newSheetHeader.setLeft(sheetToCopyHeader.getLeft());
newSheetHeader.setRight(sheetToCopyHeader.getRight());

Footer sheetToCopyFooter = sheetToCopy.getFooter();
Footer newSheetFooter = newSheet.getFooter();
newSheetFooter.setCenter(sheetToCopyFooter.getCenter());
newSheetFooter.setLeft(sheetToCopyFooter.getLeft());
newSheetFooter.setRight(sheetToCopyFooter.getRight());

newSheet.setHorizontallyCenter(sheetToCopy.getHorizontallyCenter());
newSheet.setMargin(Sheet.LeftMargin, sheetToCopy.getMargin(Sheet.LeftMargin));
newSheet.setMargin(Sheet.RightMargin, sheetToCopy.getMargin(Sheet.RightMargin));
newSheet.setMargin(Sheet.TopMargin, sheetToCopy.getMargin(Sheet.TopMargin));
newSheet.setMargin(Sheet.BottomMargin, sheetToCopy.getMargin(Sheet.BottomMargin));

newSheet.setPrintGridlines(sheetToCopy.isPrintGridlines());
newSheet.setRowSumsBelow(sheetToCopy.getRowSumsBelow());
newSheet.setRowSumsRight(sheetToCopy.getRowSumsRight());
newSheet.setVerticallyCenter(sheetToCopy.getVerticallyCenter());
newSheet.setDisplayFormulas(sheetToCopy.isDisplayFormulas());
newSheet.setDisplayGridlines(sheetToCopy.isDisplayGridlines());
newSheet.setDisplayRowColHeadings(sheetToCopy.isDisplayRowColHeadings());
newSheet.setDisplayZeros(sheetToCopy.isDisplayZeros());
newSheet.setPrintGridlines(sheetToCopy.isPrintGridlines());
newSheet.setRightToLeft(sheetToCopy.isRightToLeft());
newSheet.setZoom(1, 1);
copyPrintTitle(newSheet, sheetToCopy);
}

private static void copyPrintTitle(Sheet newSheet, Sheet sheetToCopy) {
int nbNames = sheetToCopy.getWorkbook().getNumberOfNames();
Name name = null;
String formula = null;

String part1S = null;
String part2S = null;
String formS = null;
String formF = null;
String part1F = null;
String part2F = null;
int rowB = -1;
int rowE = -1;
int colB = -1;
int colE = -1;

for (int i = 0; i < nbNames; i++) {
name = sheetToCopy.getWorkbook().getNameAt(i);
if (name.getSheetIndex() == sheetToCopy.getWorkbook().getSheetIndex(sheetToCopy)) {
if (name.getNameName().equals("Print_Titles")
|| name.getNameName().equals(XSSFName.BUILTIN_PRINT_TITLE)) {
formula = name.getRefersToFormula();
int indexComma = formula.indexOf(",");
if (indexComma == -1) {
indexComma = formula.indexOf(";");
}
String firstPart = null;
;
String secondPart = null;
if (indexComma == -1) {
firstPart = formula;
} else {
firstPart = formula.substring(0, indexComma);
secondPart = formula.substring(indexComma + 1);
}

formF = firstPart.substring(firstPart.indexOf("!") + 1);
part1F = formF.substring(0, formF.indexOf(":"));
part2F = formF.substring(formF.indexOf(":") + 1);

if (secondPart != null) {
formS = secondPart.substring(secondPart.indexOf("!") + 1);
part1S = formS.substring(0, formS.indexOf(":"));
part2S = formS.substring(formS.indexOf(":") + 1);
}

rowB = -1;
rowE = -1;
colB = -1;
colE = -1;
String rowBs, rowEs, colBs, colEs;
if (part1F.lastIndexOf("$") != part1F.indexOf("$")) {
rowBs = part1F.substring(part1F.lastIndexOf("$") + 1, part1F.length());
rowEs = part2F.substring(part2F.lastIndexOf("$") + 1, part2F.length());
rowB = Integer.parseInt(rowBs);
rowE = Integer.parseInt(rowEs);
if (secondPart != null) {
colBs = part1S.substring(part1S.lastIndexOf("$") + 1, part1S.length());
colEs = part2S.substring(part2S.lastIndexOf("$") + 1, part2S.length());
colB = CellReference.convertColStringToIndex(colBs);// CExportExcelHelperPoi.convertColumnLetterToInt(colBs);
colE = CellReference.convertColStringToIndex(colEs);// CExportExcelHelperPoi.convertColumnLetterToInt(colEs);
}
} else {
colBs = part1F.substring(part1F.lastIndexOf("$") + 1, part1F.length());
colEs = part2F.substring(part2F.lastIndexOf("$") + 1, part2F.length());
colB = CellReference.convertColStringToIndex(colBs);// CExportExcelHelperPoi.convertColumnLetterToInt(colBs);
colE = CellReference.convertColStringToIndex(colEs);// CExportExcelHelperPoi.convertColumnLetterToInt(colEs);

if (secondPart != null) {
rowBs = part1S.substring(part1S.lastIndexOf("$") + 1, part1S.length());
rowEs = part2S.substring(part2S.lastIndexOf("$") + 1, part2S.length());
rowB = Integer.parseInt(rowBs);
rowE = Integer.parseInt(rowEs);
}
}

newSheet.getWorkbook().setRepeatingRowsAndColumns(newSheet.getWorkbook().getSheetIndex(newSheet),
colB, colE, rowB - 1, rowE - 1);
}
}
}
}
} 

Here is my approach

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFPictureData;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFShape;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.Header;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFName;
import org.apache.poi.xssf.usermodel.XSSFPicture;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor;

public class XlsXlsxConverter3 {
@SuppressWarnings("unused")
private static class FormulaInfo {

private String sheetName;
private Integer rowIndex;
private Integer cellIndex;
private String formula;

private FormulaInfo(String sheetName, Integer rowIndex, Integer cellIndex, String formula) {
this.sheetName = sheetName;
this.rowIndex = rowIndex;
this.cellIndex = cellIndex;
this.formula = formula;
}

public String getSheetName() {
return sheetName;
}

public void setSheetName(String sheetName) {
this.sheetName = sheetName;
}

public Integer getRowIndex() {
return rowIndex;
}

public void setRowIndex(Integer rowIndex) {
this.rowIndex = rowIndex;
}

public Integer getCellIndex() {
return cellIndex;
}

public void setCellIndex(Integer cellIndex) {
this.cellIndex = cellIndex;
}

public String getFormula() {
return formula;
}

public void setFormula(String formula) {
this.formula = formula;
}
}

static List<FormulaInfo> formulaInfoList = new ArrayList<FormulaInfo>();

public static void refreshFormula(XSSFWorkbook workbook) {
for (FormulaInfo formulaInfo : formulaInfoList) {
workbook.getSheet(formulaInfo.getSheetName()).getRow(formulaInfo.getRowIndex())
.getCell(formulaInfo.getCellIndex()).setCellFormula(formulaInfo.getFormula());
}
formulaInfoList.removeAll(formulaInfoList);
}

public static XSSFWorkbook convertWorkbookHSSFToXSSF(HSSFWorkbook source) {
XSSFWorkbook retVal = new XSSFWorkbook();

for (int i = 0; i < source.getNumberOfSheets(); i++) {

HSSFSheet hssfsheet = source.getSheetAt(i);
XSSFSheet xssfSheet = retVal.createSheet(hssfsheet.getSheetName());

copySheetSettings(xssfSheet, hssfsheet);
copySheet(hssfsheet, xssfSheet);
copyPictures(xssfSheet, hssfsheet);
}

refreshFormula(retVal);

return retVal;
}

private static void copySheet(HSSFSheet source, XSSFSheet destination) {
copySheet(source, destination, true);
}

/**
* @param destination
* the sheet to create from the copy.
* @param the
* sheet to copy.
* @param copyStyle
* true copy the style.
*/
private static void copySheet(HSSFSheet source, XSSFSheet destination, boolean copyStyle) {
int maxColumnNum = 0;
List<CellStyle> styleMap2 = (copyStyle) ? new ArrayList<CellStyle>() : null;
for (int i = source.getFirstRowNum(); i <= source.getLastRowNum(); i++) {
HSSFRow srcRow = source.getRow(i);
XSSFRow destRow = destination.createRow(i);
if (srcRow != null) {
// copyRow(source, destination, srcRow, destRow, styleMap);
copyRow(source, destination, srcRow, destRow, styleMap2);
if (srcRow.getLastCellNum() > maxColumnNum) {
maxColumnNum = srcRow.getLastCellNum();
}
}
}
for (int i = 0; i <= maxColumnNum; i++) {
destination.setColumnWidth(i, source.getColumnWidth(i));
}
}

/**
* @param srcSheet
* the sheet to copy.
* @param destSheet
* the sheet to create.
* @param srcRow
* the row to copy.
* @param destRow
* the row to create.
* @param styleMap
* -
*/
private static void copyRow(HSSFSheet srcSheet, XSSFSheet destSheet, HSSFRow srcRow, XSSFRow destRow,
// Map<Integer, HSSFCellStyle> styleMap) {
List<CellStyle> styleMap) {
// manage a list of merged zone in order to not insert two times a
// merged zone
Set<CellRangeAddressWrapper> mergedRegions = new TreeSet<CellRangeAddressWrapper>();
destRow.setHeight(srcRow.getHeight());
// pour chaque row
// for (int j = srcRow.getFirstCellNum(); j <= srcRow.getLastCellNum();
// j++) {
int j = srcRow.getFirstCellNum();
if (j < 0) {
j = 0;
}
for (; j <= srcRow.getLastCellNum(); j++) {
HSSFCell oldCell = srcRow.getCell(j); // ancienne cell
XSSFCell newCell = destRow.getCell(j); // new cell
if (oldCell != null) {
if (newCell == null) {
newCell = destRow.createCell(j);
}
// copy chaque cell
copyCell(oldCell, newCell, styleMap);
// copy les informations de fusion entre les cellules
// System.out.println("row num: " + srcRow.getRowNum() +
// " , col: " + (short)oldCell.getColumnIndex());
CellRangeAddress mergedRegion = getMergedRegion(srcSheet, srcRow.getRowNum(),
(short) oldCell.getColumnIndex());

if (mergedRegion != null) {
// System.out.println("Selected merged region: " +
// mergedRegion.toString());
CellRangeAddress newMergedRegion = new CellRangeAddress(mergedRegion.getFirstRow(),
mergedRegion.getLastRow(), mergedRegion.getFirstColumn(), mergedRegion.getLastColumn());
// System.out.println("New merged region: " +
// newMergedRegion.toString());
CellRangeAddressWrapper wrapper = new CellRangeAddressWrapper(newMergedRegion);
if (isNewMergedRegion(wrapper, mergedRegions)) {
mergedRegions.add(wrapper);
destSheet.addMergedRegion(wrapper.range);
}
}
}
}

}

/**
* Récupère les informations de fusion des cellules dans la sheet source
* pour les appliquer à la sheet destination... Récupère toutes les zones
* merged dans la sheet source et regarde pour chacune d'elle si elle se
* trouve dans la current row que nous traitons. Si oui, retourne l'objet
* CellRangeAddress.
*
* @param sheet
* the sheet containing the data.
* @param rowNum
* the num of the row to copy.
* @param cellNum
* the num of the cell to copy.
* @return the CellRangeAddress created.
*/
public static CellRangeAddress getMergedRegion(HSSFSheet 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;
}

/**
* Check that the merged region has been created in the destination sheet.
*
* @param newMergedRegion
* the merged region to copy or not in the destination sheet.
* @param mergedRegions
* the list containing all the merged region.
* @return true if the merged region is already in the list or not.
*/
private static boolean isNewMergedRegion(CellRangeAddressWrapper newMergedRegion,
Set<CellRangeAddressWrapper> mergedRegions) {
return !mergedRegions.contains(newMergedRegion);
}

private static void copyPictures(Sheet newSheet, Sheet sheet) {
Drawing drawingOld = sheet.createDrawingPatriarch();
Drawing drawingNew = newSheet.createDrawingPatriarch();
CreationHelper helper = newSheet.getWorkbook().getCreationHelper();

// if (drawingNew instanceof HSSFPatriarch) {
if (drawingOld instanceof HSSFPatriarch) {
List<HSSFShape> shapes = ((HSSFPatriarch) drawingOld).getChildren();
for (int i = 0; i < shapes.size(); i++) {
System.out.println(shapes.size());
if (shapes.get(i) instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shapes.get(i);
HSSFPictureData picdata = pic.getPictureData();
int pictureIndex = newSheet.getWorkbook().addPicture(picdata.getData(), picdata.getFormat());
ClientAnchor anchor = null;
if (pic.getAnchor() != null) {
anchor = helper.createClientAnchor();
anchor.setDx1(((HSSFClientAnchor) pic.getAnchor()).getDx1());
anchor.setDx2(((HSSFClientAnchor) pic.getAnchor()).getDx2());
anchor.setDy1(((HSSFClientAnchor) pic.getAnchor()).getDy1());
anchor.setDy2(((HSSFClientAnchor) pic.getAnchor()).getDy2());
anchor.setCol1(((HSSFClientAnchor) pic.getAnchor()).getCol1());
anchor.setCol2(((HSSFClientAnchor) pic.getAnchor()).getCol2());
anchor.setRow1(((HSSFClientAnchor) pic.getAnchor()).getRow1());
anchor.setRow2(((HSSFClientAnchor) pic.getAnchor()).getRow2());
anchor.setAnchorType(((HSSFClientAnchor) pic.getAnchor()).getAnchorType());
}
drawingNew.createPicture(anchor, pictureIndex);
}
}
} else {
if (drawingNew instanceof XSSFDrawing) {
List<XSSFShape> shapes = ((XSSFDrawing) drawingOld).getShapes();
for (int i = 0; i < shapes.size(); i++) {
if (shapes.get(i) instanceof XSSFPicture) {
XSSFPicture pic = (XSSFPicture) shapes.get(i);
XSSFPictureData picdata = pic.getPictureData();
int pictureIndex = newSheet.getWorkbook().addPicture(picdata.getData(),
picdata.getPictureType());
XSSFClientAnchor anchor = null;
CTTwoCellAnchor oldAnchor = ((XSSFDrawing) drawingOld).getCTDrawing().getTwoCellAnchorArray(i);
if (oldAnchor != null) {
anchor = (XSSFClientAnchor) helper.createClientAnchor();
CTMarker markerFrom = oldAnchor.getFrom();
CTMarker markerTo = oldAnchor.getTo();
anchor.setDx1((int) markerFrom.getColOff());
anchor.setDx2((int) markerTo.getColOff());
anchor.setDy1((int) markerFrom.getRowOff());
anchor.setDy2((int) markerTo.getRowOff());
anchor.setCol1(markerFrom.getCol());
anchor.setCol2(markerTo.getCol());
anchor.setRow1(markerFrom.getRow());
anchor.setRow2(markerTo.getRow());
}
drawingNew.createPicture(anchor, pictureIndex);
}
}
}
}
}

private static void copyCell(Cell oldCell, Cell newCell, List<CellStyle> styleList) {
if (styleList != null) {
if (oldCell.getSheet().getWorkbook() == newCell.getSheet().getWorkbook()) {
newCell.setCellStyle(oldCell.getCellStyle());
} else {
DataFormat newDataFormat = newCell.getSheet().getWorkbook().createDataFormat();

CellStyle newCellStyle = getSameCellStyle(oldCell, newCell, styleList);
if (newCellStyle == null) {
// Create a new cell style
Font oldFont = oldCell.getSheet().getWorkbook().getFontAt(oldCell.getCellStyle().getFontIndex());
// Find a existing font corresponding to avoid to create a
// new one
Font newFont = newCell
.getSheet()
.getWorkbook()
.findFont(oldFont.getBoldweight(), oldFont.getColor(), oldFont.getFontHeight(),
oldFont.getFontName(), oldFont.getItalic(), oldFont.getStrikeout(),
oldFont.getTypeOffset(), oldFont.getUnderline());
if (newFont == null) {
newFont = newCell.getSheet().getWorkbook().createFont();
newFont.setBoldweight(oldFont.getBoldweight());
newFont.setColor(oldFont.getColor());
newFont.setFontHeight(oldFont.getFontHeight());
newFont.setFontName(oldFont.getFontName());
newFont.setItalic(oldFont.getItalic());
newFont.setStrikeout(oldFont.getStrikeout());
newFont.setTypeOffset(oldFont.getTypeOffset());
newFont.setUnderline(oldFont.getUnderline());
newFont.setCharSet(oldFont.getCharSet());
}

short newFormat = newDataFormat.getFormat(oldCell.getCellStyle().getDataFormatString());
newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();
newCellStyle.setFont(newFont);
newCellStyle.setDataFormat(newFormat);

newCellStyle.setAlignment(oldCell.getCellStyle().getAlignment());
newCellStyle.setHidden(oldCell.getCellStyle().getHidden());
newCellStyle.setLocked(oldCell.getCellStyle().getLocked());
newCellStyle.setWrapText(oldCell.getCellStyle().getWrapText());
newCellStyle.setBorderBottom(oldCell.getCellStyle().getBorderBottom());
newCellStyle.setBorderLeft(oldCell.getCellStyle().getBorderLeft());
newCellStyle.setBorderRight(oldCell.getCellStyle().getBorderRight());
newCellStyle.setBorderTop(oldCell.getCellStyle().getBorderTop());
newCellStyle.setBottomBorderColor(oldCell.getCellStyle().getBottomBorderColor());
newCellStyle.setFillBackgroundColor(oldCell.getCellStyle().getFillBackgroundColor());
newCellStyle.setFillForegroundColor(oldCell.getCellStyle().getFillForegroundColor());
newCellStyle.setFillPattern(oldCell.getCellStyle().getFillPattern());
newCellStyle.setIndention(oldCell.getCellStyle().getIndention());
newCellStyle.setLeftBorderColor(oldCell.getCellStyle().getLeftBorderColor());
newCellStyle.setRightBorderColor(oldCell.getCellStyle().getRightBorderColor());
newCellStyle.setRotation(oldCell.getCellStyle().getRotation());
newCellStyle.setTopBorderColor(oldCell.getCellStyle().getTopBorderColor());
newCellStyle.setVerticalAlignment(oldCell.getCellStyle().getVerticalAlignment());

styleList.add(newCellStyle);
}
newCell.setCellStyle(newCellStyle);
}
}
switch (oldCell.getCellType()) {
case Cell.CELL_TYPE_STRING:
newCell.setCellValue(oldCell.getStringCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
newCell.setCellValue(oldCell.getNumericCellValue());
break;
case Cell.CELL_TYPE_BLANK:
newCell.setCellType(Cell.CELL_TYPE_BLANK);
break;
case Cell.CELL_TYPE_BOOLEAN:
newCell.setCellValue(oldCell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
newCell.setCellErrorValue(oldCell.getErrorCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
newCell.setCellFormula(oldCell.getCellFormula());
formulaInfoList.add(new FormulaInfo(oldCell.getSheet().getSheetName(), oldCell.getRowIndex(), oldCell
.getColumnIndex(), oldCell.getCellFormula()));
break;
default:
break;
}
}

private static CellStyle getSameCellStyle(Cell oldCell, Cell newCell, List<CellStyle> styleList) {
CellStyle styleToFind = oldCell.getCellStyle();
CellStyle currentCellStyle = null;
CellStyle returnCellStyle = null;
Iterator<CellStyle> iterator = styleList.iterator();
Font oldFont = null;
Font newFont = null;
while (iterator.hasNext() && returnCellStyle == null) {
currentCellStyle = iterator.next();

if (currentCellStyle.getAlignment() != styleToFind.getAlignment()) {
continue;
}
if (currentCellStyle.getHidden() != styleToFind.getHidden()) {
continue;
}
if (currentCellStyle.getLocked() != styleToFind.getLocked()) {
continue;
}
if (currentCellStyle.getWrapText() != styleToFind.getWrapText()) {
continue;
}
if (currentCellStyle.getBorderBottom() != styleToFind.getBorderBottom()) {
continue;
}
if (currentCellStyle.getBorderLeft() != styleToFind.getBorderLeft()) {
continue;
}
if (currentCellStyle.getBorderRight() != styleToFind.getBorderRight()) {
continue;
}
if (currentCellStyle.getBorderTop() != styleToFind.getBorderTop()) {
continue;
}
if (currentCellStyle.getBottomBorderColor() != styleToFind.getBottomBorderColor()) {
continue;
}
if (currentCellStyle.getFillBackgroundColor() != styleToFind.getFillBackgroundColor()) {
continue;
}
if (currentCellStyle.getFillForegroundColor() != styleToFind.getFillForegroundColor()) {
continue;
}
if (currentCellStyle.getFillPattern() != styleToFind.getFillPattern()) {
continue;
}
if (currentCellStyle.getIndention() != styleToFind.getIndention()) {
continue;
}
if (currentCellStyle.getLeftBorderColor() != styleToFind.getLeftBorderColor()) {
continue;
}
if (currentCellStyle.getRightBorderColor() != styleToFind.getRightBorderColor()) {
continue;
}
if (currentCellStyle.getRotation() != styleToFind.getRotation()) {
continue;
}
if (currentCellStyle.getTopBorderColor() != styleToFind.getTopBorderColor()) {
continue;
}
if (currentCellStyle.getVerticalAlignment() != styleToFind.getVerticalAlignment()) {
continue;
}

oldFont = oldCell.getSheet().getWorkbook().getFontAt(oldCell.getCellStyle().getFontIndex());
newFont = newCell.getSheet().getWorkbook().getFontAt(currentCellStyle.getFontIndex());

if (newFont.getBoldweight() == oldFont.getBoldweight()) {
continue;
}
if (newFont.getColor() == oldFont.getColor()) {
continue;
}
if (newFont.getFontHeight() == oldFont.getFontHeight()) {
continue;
}
if (newFont.getFontName() == oldFont.getFontName()) {
continue;
}
if (newFont.getItalic() == oldFont.getItalic()) {
continue;
}
if (newFont.getStrikeout() == oldFont.getStrikeout()) {
continue;
}
if (newFont.getTypeOffset() == oldFont.getTypeOffset()) {
continue;
}
if (newFont.getUnderline() == oldFont.getUnderline()) {
continue;
}
if (newFont.getCharSet() == oldFont.getCharSet()) {
continue;
}
if (oldCell.getCellStyle().getDataFormatString().equals(currentCellStyle.getDataFormatString())) {
continue;
}

returnCellStyle = currentCellStyle;
}
return returnCellStyle;
}

private static void copySheetSettings(Sheet newSheet, Sheet sheetToCopy) {

newSheet.setAutobreaks(sheetToCopy.getAutobreaks());
newSheet.setDefaultColumnWidth(sheetToCopy.getDefaultColumnWidth());
newSheet.setDefaultRowHeight(sheetToCopy.getDefaultRowHeight());
newSheet.setDefaultRowHeightInPoints(sheetToCopy.getDefaultRowHeightInPoints());
newSheet.setDisplayGuts(sheetToCopy.getDisplayGuts());
newSheet.setFitToPage(sheetToCopy.getFitToPage());

newSheet.setForceFormulaRecalculation(sheetToCopy.getForceFormulaRecalculation());

PrintSetup sheetToCopyPrintSetup = sheetToCopy.getPrintSetup();
PrintSetup newSheetPrintSetup = newSheet.getPrintSetup();

newSheetPrintSetup.setPaperSize(sheetToCopyPrintSetup.getPaperSize());
newSheetPrintSetup.setScale(sheetToCopyPrintSetup.getScale());
newSheetPrintSetup.setPageStart(sheetToCopyPrintSetup.getPageStart());
newSheetPrintSetup.setFitWidth(sheetToCopyPrintSetup.getFitWidth());
newSheetPrintSetup.setFitHeight(sheetToCopyPrintSetup.getFitHeight());
newSheetPrintSetup.setLeftToRight(sheetToCopyPrintSetup.getLeftToRight());
newSheetPrintSetup.setLandscape(sheetToCopyPrintSetup.getLandscape());
newSheetPrintSetup.setValidSettings(sheetToCopyPrintSetup.getValidSettings());
newSheetPrintSetup.setNoColor(sheetToCopyPrintSetup.getNoColor());
newSheetPrintSetup.setDraft(sheetToCopyPrintSetup.getDraft());
newSheetPrintSetup.setNotes(sheetToCopyPrintSetup.getNotes());
newSheetPrintSetup.setNoOrientation(sheetToCopyPrintSetup.getNoOrientation());
newSheetPrintSetup.setUsePage(sheetToCopyPrintSetup.getUsePage());
newSheetPrintSetup.setHResolution(sheetToCopyPrintSetup.getHResolution());
newSheetPrintSetup.setVResolution(sheetToCopyPrintSetup.getVResolution());
newSheetPrintSetup.setHeaderMargin(sheetToCopyPrintSetup.getHeaderMargin());
newSheetPrintSetup.setFooterMargin(sheetToCopyPrintSetup.getFooterMargin());
newSheetPrintSetup.setCopies(sheetToCopyPrintSetup.getCopies());

Header sheetToCopyHeader = sheetToCopy.getHeader();
Header newSheetHeader = newSheet.getHeader();
newSheetHeader.setCenter(sheetToCopyHeader.getCenter());
newSheetHeader.setLeft(sheetToCopyHeader.getLeft());
newSheetHeader.setRight(sheetToCopyHeader.getRight());

Footer sheetToCopyFooter = sheetToCopy.getFooter();
Footer newSheetFooter = newSheet.getFooter();
newSheetFooter.setCenter(sheetToCopyFooter.getCenter());
newSheetFooter.setLeft(sheetToCopyFooter.getLeft());
newSheetFooter.setRight(sheetToCopyFooter.getRight());

newSheet.setHorizontallyCenter(sheetToCopy.getHorizontallyCenter());
newSheet.setMargin(Sheet.LeftMargin, sheetToCopy.getMargin(Sheet.LeftMargin));
newSheet.setMargin(Sheet.RightMargin, sheetToCopy.getMargin(Sheet.RightMargin));
newSheet.setMargin(Sheet.TopMargin, sheetToCopy.getMargin(Sheet.TopMargin));
newSheet.setMargin(Sheet.BottomMargin, sheetToCopy.getMargin(Sheet.BottomMargin));

newSheet.setPrintGridlines(sheetToCopy.isPrintGridlines());
newSheet.setRowSumsBelow(sheetToCopy.getRowSumsBelow());
newSheet.setRowSumsRight(sheetToCopy.getRowSumsRight());
newSheet.setVerticallyCenter(sheetToCopy.getVerticallyCenter());
newSheet.setDisplayFormulas(sheetToCopy.isDisplayFormulas());
newSheet.setDisplayGridlines(sheetToCopy.isDisplayGridlines());
newSheet.setDisplayRowColHeadings(sheetToCopy.isDisplayRowColHeadings());
newSheet.setDisplayZeros(sheetToCopy.isDisplayZeros());
newSheet.setPrintGridlines(sheetToCopy.isPrintGridlines());
newSheet.setRightToLeft(sheetToCopy.isRightToLeft());
newSheet.setZoom(1, 1);
copyPrintTitle(newSheet, sheetToCopy);
}

private static void copyPrintTitle(Sheet newSheet, Sheet sheetToCopy) {
int nbNames = sheetToCopy.getWorkbook().getNumberOfNames();
Name name = null;
String formula = null;

String part1S = null;
String part2S = null;
String formS = null;
String formF = null;
String part1F = null;
String part2F = null;
int rowB = -1;
int rowE = -1;
int colB = -1;
int colE = -1;

for (int i = 0; i < nbNames; i++) {
name = sheetToCopy.getWorkbook().getNameAt(i);
if (name.getSheetIndex() == sheetToCopy.getWorkbook().getSheetIndex(sheetToCopy)) {
if (name.getNameName().equals("Print_Titles")
|| name.getNameName().equals(XSSFName.BUILTIN_PRINT_TITLE)) {
formula = name.getRefersToFormula();
int indexComma = formula.indexOf(",");
if (indexComma == -1) {
indexComma = formula.indexOf(";");
}
String firstPart = null;
;
String secondPart = null;
if (indexComma == -1) {
firstPart = formula;
} else {
firstPart = formula.substring(0, indexComma);
secondPart = formula.substring(indexComma + 1);
}

formF = firstPart.substring(firstPart.indexOf("!") + 1);
part1F = formF.substring(0, formF.indexOf(":"));
part2F = formF.substring(formF.indexOf(":") + 1);

if (secondPart != null) {
formS = secondPart.substring(secondPart.indexOf("!") + 1);
part1S = formS.substring(0, formS.indexOf(":"));
part2S = formS.substring(formS.indexOf(":") + 1);
}

rowB = -1;
rowE = -1;
colB = -1;
colE = -1;
String rowBs, rowEs, colBs, colEs;
if (part1F.lastIndexOf("$") != part1F.indexOf("$")) {
rowBs = part1F.substring(part1F.lastIndexOf("$") + 1, part1F.length());
rowEs = part2F.substring(part2F.lastIndexOf("$") + 1, part2F.length());
rowB = Integer.parseInt(rowBs);
rowE = Integer.parseInt(rowEs);
if (secondPart != null) {
colBs = part1S.substring(part1S.lastIndexOf("$") + 1, part1S.length());
colEs = part2S.substring(part2S.lastIndexOf("$") + 1, part2S.length());
colB = CellReference.convertColStringToIndex(colBs);// CExportExcelHelperPoi.convertColumnLetterToInt(colBs);
colE = CellReference.convertColStringToIndex(colEs);// CExportExcelHelperPoi.convertColumnLetterToInt(colEs);
}
} else {
colBs = part1F.substring(part1F.lastIndexOf("$") + 1, part1F.length());
colEs = part2F.substring(part2F.lastIndexOf("$") + 1, part2F.length());
colB = CellReference.convertColStringToIndex(colBs);// CExportExcelHelperPoi.convertColumnLetterToInt(colBs);
colE = CellReference.convertColStringToIndex(colEs);// CExportExcelHelperPoi.convertColumnLetterToInt(colEs);

if (secondPart != null) {
rowBs = part1S.substring(part1S.lastIndexOf("$") + 1, part1S.length());
rowEs = part2S.substring(part2S.lastIndexOf("$") + 1, part2S.length());
rowB = Integer.parseInt(rowBs);
rowE = Integer.parseInt(rowEs);
}
}

newSheet.getWorkbook().setRepeatingRowsAndColumns(newSheet.getWorkbook().getSheetIndex(newSheet),
colB, colE, rowB - 1, rowE - 1);
}
}
}
}
} 
已下线请稍等 2024-12-09 02:11:27

我已经实现了一些代码来复制工作簿,无论其类型如何:它使用接口,因此您可以使用 HSSFWorkbook、XSSFWorkbook 和 SXSSFWorkbook。

这会复制带有图片、字体、样式和行的工作表:
对于我的用例,我需要在现有模板中插入新行并写入 SXSSFWorkbook,因此我不会直接复制所有工作表和行,而是选择要复制的工作表,然后复制其中需要的部分我想。

    Workbook template = getTemplateSource(...);
    Workbook wb = new SXSSFWorkbook(...);
    ExcelTemplate builder = new ExcelTemplate(template);

    int sheetIndex = ...;
    Sheet srcSheet = template.getSheetAt(sheetIndex);
    Sheet dstSheet = ExcelTemplate.copySheet(template, wb, sheetIndex);
    int rowNumber = getDataInsertionRow();
    int foot = rowNumber + 1;
    builder.copyRows(wb, srcSheet, dstSheet, 0, rowNumber, 0);
    for (....) {
        writeNewRows(dstSheet, rowNumber++, data);
    }
    builder.copyRows(wb, srcSheet, dstSheet, foot, srcSheet.getLastRowNum() + 1, rowNumber);

这是代码(我尝试删除所有测试,但也许我忘记了一些未使用的行)

package com.systemonenoc.billing.web.view;

import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Shape;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class ExcelTemplate {

    private final Workbook template;
    private final Map<Integer, Font> fonts = new HashMap<>();
    private final Map<Integer, CellStyle> styles = new HashMap<>();

    public ExcelTemplate(Workbook template) {
        this.template = template;
    }

    public void switchStyles(Workbook dstWorkbook, CellStyle[] styles) {
        for (int i = 0; i < styles.length; i++) {
            styles[i] = getStyle(dstWorkbook, styles[i]);
        }
    }

    private Font getFont(Workbook dstWorkbook, Font font) {
        return fonts.computeIfAbsent(font.hashCode(), k -> cloneFont(dstWorkbook, font));
    }

    private CellStyle getStyle(Workbook dstWorkbook, CellStyle style) {
        Font font = getFont(dstWorkbook, template.getFontAt(style.getFontIndex()));
        return styles.computeIfAbsent(style.hashCode(), k -> cloneStyle(dstWorkbook, style, dstWorkbook.createDataFormat(), font));
    }

    public void copyRows(Workbook dstWorkbook, Sheet srcSheet, Sheet dstSheet, int from, int to, int offset) {
        for (int r = from; r < to; r++) {
            Row srcRow = srcSheet.getRow(r);
            if (srcRow != null) {
                CellStyle style = srcRow.getRowStyle();
                Row dstRow = dstSheet.createRow(r + offset);
                dstRow.setHeight(srcRow.getHeight());
                if (style != null) {
                    dstRow.setRowStyle(getStyle(dstWorkbook, style));
                }
                for (int c = 0; c < srcRow.getLastCellNum(); c++) {
                    Cell srcCell = srcRow.getCell(c);
                    if (srcCell != null) {
                        int type = getCellType(srcCell);
                        Object value = getCellValue(srcCell);
                        style = srcCell.getCellStyle();
                        Cell newCell = dstRow.createCell(c, type);
                        setCellValue(newCell, value, type);
                        newCell.setCellStyle(getStyle(dstWorkbook, style));
                    }
                }
            }
        }
    }

    public static Sheet copySheet(Workbook srcWorkbook, Workbook dstWorkbook, int sheetIndex) {
        Sheet srcSheet = srcWorkbook.getSheetAt(sheetIndex);
        Sheet dstSheet = dstWorkbook.createSheet(srcSheet.getSheetName());
        dstSheet.setDisplayFormulas(srcSheet.isDisplayFormulas());
        dstSheet.setDisplayGridlines(srcSheet.isDisplayGridlines());
        dstSheet.setDisplayGuts(srcSheet.getDisplayGuts());
        dstSheet.setDisplayRowColHeadings(srcSheet.isDisplayRowColHeadings());
        dstSheet.setDisplayZeros(srcSheet.isDisplayZeros());
        dstSheet.setFitToPage(srcSheet.getFitToPage());
        dstSheet.setForceFormulaRecalculation(srcSheet.getForceFormulaRecalculation());
        dstSheet.setHorizontallyCenter(srcSheet.getHorizontallyCenter());
        dstSheet.setMargin(Sheet.BottomMargin, srcSheet.getMargin(Sheet.BottomMargin));
        dstSheet.setMargin(Sheet.FooterMargin, srcSheet.getMargin(Sheet.FooterMargin));
        dstSheet.setMargin(Sheet.HeaderMargin, srcSheet.getMargin(Sheet.HeaderMargin));
        dstSheet.setMargin(Sheet.LeftMargin, srcSheet.getMargin(Sheet.LeftMargin));
        dstSheet.setMargin(Sheet.RightMargin, srcSheet.getMargin(Sheet.RightMargin));
        dstSheet.setMargin(Sheet.TopMargin, srcSheet.getMargin(Sheet.TopMargin));
        dstSheet.setPrintGridlines(srcSheet.isPrintGridlines());
        dstSheet.setRightToLeft(srcSheet.isRightToLeft());
        dstSheet.setRowSumsBelow(srcSheet.getRowSumsBelow());
        dstSheet.setRowSumsRight(srcSheet.getRowSumsRight());
        dstSheet.setVerticallyCenter(srcSheet.getVerticallyCenter());
        for (int i = 0; i < 20; i++) {
            dstSheet.setColumnWidth(i, srcSheet.getColumnWidth(i));
            dstSheet.setColumnHidden(i, srcSheet.isColumnHidden(i));
        }
        srcSheet.getMergedRegions().forEach(dstSheet::addMergedRegion);
        Drawing<?> d1 = srcSheet.getDrawingPatriarch();
        if (d1 != null) {
            Drawing<?> d2 = dstSheet.getDrawingPatriarch();
            if (d2 == null) {
                d2 = dstSheet.createDrawingPatriarch();
            }
            for (Shape shape : d1) {
                if (shape instanceof Picture) {
                    Picture p = (Picture) shape;
                    ClientAnchor a1 = p.getClientAnchor();
                    int pictureId = dstWorkbook.addPicture(p.getPictureData().getData(), p.getPictureData().getPictureType());
                    ClientAnchor a2 = d2.createAnchor(a1.getDx1(), a1.getDy1(), a1.getDx2(), a1.getDy2(), a1.getCol1(), a1.getRow1(), a1.getCol2(), a1.getRow2());
                    d2.createPicture(a2, pictureId);
                }
            }
        }
        return dstSheet;
    }

    public static Font cloneFont(Workbook dstWorkbook, Font font) {
        Font clone = dstWorkbook.createFont();
        clone.setBold(font.getBold());
        clone.setCharSet(font.getCharSet());
        clone.setColor(font.getColor());
        clone.setFontHeight(font.getFontHeight());
        clone.setFontName(font.getFontName());
        clone.setItalic(font.getItalic());
        clone.setStrikeout(font.getStrikeout());
        clone.setTypeOffset(font.getTypeOffset());
        clone.setUnderline(font.getUnderline());
        return clone;
    }

    public static CellStyle cloneStyle(Workbook dstWorkbook, CellStyle style, DataFormat formatter, Font font) {
        CellStyle clone = dstWorkbook.createCellStyle();
        clone.setAlignment(style.getAlignmentEnum());
        clone.setBorderBottom(style.getBorderBottomEnum());
        clone.setBorderLeft(style.getBorderLeftEnum());
        clone.setBorderRight(style.getBorderRightEnum());
        clone.setBorderTop(style.getBorderTopEnum());
        clone.setDataFormat(formatter.getFormat(style.getDataFormatString()));
        clone.setFillBackgroundColor(style.getFillBackgroundColor());
        clone.setFillForegroundColor(style.getFillForegroundColor());
        clone.setFillPattern(style.getFillPatternEnum());
        clone.setFont(font);
        clone.setHidden(style.getHidden());
        clone.setIndention(style.getIndention());
        clone.setLocked(style.getLocked());
        clone.setVerticalAlignment(style.getVerticalAlignmentEnum());
        clone.setWrapText(style.getWrapText());
        return clone;
    }

    protected static int getCellType(Cell cell) {
        int cellType = cell.getCellType();
        if (cellType == Cell.CELL_TYPE_FORMULA) {
            cellType = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator()
                    .evaluateFormulaCell(cell);
        }
        return cellType;
    }

    protected static Object getCellValue(Cell cell) {
        switch (getCellType(cell)) {
        case Cell.CELL_TYPE_BLANK:
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();
        case Cell.CELL_TYPE_BOOLEAN:
            return cell.getBooleanCellValue();
        case Cell.CELL_TYPE_ERROR:
            return cell.getErrorCellValue();
        case Cell.CELL_TYPE_NUMERIC:
            return cell.getNumericCellValue();
        }
        return null;
    }

    protected static void setCellValue(Cell cell, Object value, int type) {
        switch (type) {
        case Cell.CELL_TYPE_BLANK:
            return;
        case Cell.CELL_TYPE_STRING:
            cell.setCellValue((String) value);
            return;
        case Cell.CELL_TYPE_BOOLEAN:
            cell.setCellValue((Boolean) value);
            return;
        case Cell.CELL_TYPE_ERROR:
            cell.setCellErrorValue((Byte) value);
            return;
        case Cell.CELL_TYPE_NUMERIC:
            cell.setCellValue((Double) value);
            return;
        }
    }

}

I have implemented some code to copy workbooks no matter their type: It uses interfaces, so you can use HSSFWorkbook, XSSFWorkbook and SXSSFWorkbook.

This copies sheets with pictures, fonts, styles and rows:
For my use case I need to insert new rows in an existing template and write to an SXSSFWorkbook, so I don't copy all the sheets and rows directly but instead I choose the sheets i want to copy and then copy the portions of it that I want.

    Workbook template = getTemplateSource(...);
    Workbook wb = new SXSSFWorkbook(...);
    ExcelTemplate builder = new ExcelTemplate(template);

    int sheetIndex = ...;
    Sheet srcSheet = template.getSheetAt(sheetIndex);
    Sheet dstSheet = ExcelTemplate.copySheet(template, wb, sheetIndex);
    int rowNumber = getDataInsertionRow();
    int foot = rowNumber + 1;
    builder.copyRows(wb, srcSheet, dstSheet, 0, rowNumber, 0);
    for (....) {
        writeNewRows(dstSheet, rowNumber++, data);
    }
    builder.copyRows(wb, srcSheet, dstSheet, foot, srcSheet.getLastRowNum() + 1, rowNumber);

And here is the code (I tried to delete all my tests, but maybe I forgot some unused lines)

package com.systemonenoc.billing.web.view;

import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Shape;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

public class ExcelTemplate {

    private final Workbook template;
    private final Map<Integer, Font> fonts = new HashMap<>();
    private final Map<Integer, CellStyle> styles = new HashMap<>();

    public ExcelTemplate(Workbook template) {
        this.template = template;
    }

    public void switchStyles(Workbook dstWorkbook, CellStyle[] styles) {
        for (int i = 0; i < styles.length; i++) {
            styles[i] = getStyle(dstWorkbook, styles[i]);
        }
    }

    private Font getFont(Workbook dstWorkbook, Font font) {
        return fonts.computeIfAbsent(font.hashCode(), k -> cloneFont(dstWorkbook, font));
    }

    private CellStyle getStyle(Workbook dstWorkbook, CellStyle style) {
        Font font = getFont(dstWorkbook, template.getFontAt(style.getFontIndex()));
        return styles.computeIfAbsent(style.hashCode(), k -> cloneStyle(dstWorkbook, style, dstWorkbook.createDataFormat(), font));
    }

    public void copyRows(Workbook dstWorkbook, Sheet srcSheet, Sheet dstSheet, int from, int to, int offset) {
        for (int r = from; r < to; r++) {
            Row srcRow = srcSheet.getRow(r);
            if (srcRow != null) {
                CellStyle style = srcRow.getRowStyle();
                Row dstRow = dstSheet.createRow(r + offset);
                dstRow.setHeight(srcRow.getHeight());
                if (style != null) {
                    dstRow.setRowStyle(getStyle(dstWorkbook, style));
                }
                for (int c = 0; c < srcRow.getLastCellNum(); c++) {
                    Cell srcCell = srcRow.getCell(c);
                    if (srcCell != null) {
                        int type = getCellType(srcCell);
                        Object value = getCellValue(srcCell);
                        style = srcCell.getCellStyle();
                        Cell newCell = dstRow.createCell(c, type);
                        setCellValue(newCell, value, type);
                        newCell.setCellStyle(getStyle(dstWorkbook, style));
                    }
                }
            }
        }
    }

    public static Sheet copySheet(Workbook srcWorkbook, Workbook dstWorkbook, int sheetIndex) {
        Sheet srcSheet = srcWorkbook.getSheetAt(sheetIndex);
        Sheet dstSheet = dstWorkbook.createSheet(srcSheet.getSheetName());
        dstSheet.setDisplayFormulas(srcSheet.isDisplayFormulas());
        dstSheet.setDisplayGridlines(srcSheet.isDisplayGridlines());
        dstSheet.setDisplayGuts(srcSheet.getDisplayGuts());
        dstSheet.setDisplayRowColHeadings(srcSheet.isDisplayRowColHeadings());
        dstSheet.setDisplayZeros(srcSheet.isDisplayZeros());
        dstSheet.setFitToPage(srcSheet.getFitToPage());
        dstSheet.setForceFormulaRecalculation(srcSheet.getForceFormulaRecalculation());
        dstSheet.setHorizontallyCenter(srcSheet.getHorizontallyCenter());
        dstSheet.setMargin(Sheet.BottomMargin, srcSheet.getMargin(Sheet.BottomMargin));
        dstSheet.setMargin(Sheet.FooterMargin, srcSheet.getMargin(Sheet.FooterMargin));
        dstSheet.setMargin(Sheet.HeaderMargin, srcSheet.getMargin(Sheet.HeaderMargin));
        dstSheet.setMargin(Sheet.LeftMargin, srcSheet.getMargin(Sheet.LeftMargin));
        dstSheet.setMargin(Sheet.RightMargin, srcSheet.getMargin(Sheet.RightMargin));
        dstSheet.setMargin(Sheet.TopMargin, srcSheet.getMargin(Sheet.TopMargin));
        dstSheet.setPrintGridlines(srcSheet.isPrintGridlines());
        dstSheet.setRightToLeft(srcSheet.isRightToLeft());
        dstSheet.setRowSumsBelow(srcSheet.getRowSumsBelow());
        dstSheet.setRowSumsRight(srcSheet.getRowSumsRight());
        dstSheet.setVerticallyCenter(srcSheet.getVerticallyCenter());
        for (int i = 0; i < 20; i++) {
            dstSheet.setColumnWidth(i, srcSheet.getColumnWidth(i));
            dstSheet.setColumnHidden(i, srcSheet.isColumnHidden(i));
        }
        srcSheet.getMergedRegions().forEach(dstSheet::addMergedRegion);
        Drawing<?> d1 = srcSheet.getDrawingPatriarch();
        if (d1 != null) {
            Drawing<?> d2 = dstSheet.getDrawingPatriarch();
            if (d2 == null) {
                d2 = dstSheet.createDrawingPatriarch();
            }
            for (Shape shape : d1) {
                if (shape instanceof Picture) {
                    Picture p = (Picture) shape;
                    ClientAnchor a1 = p.getClientAnchor();
                    int pictureId = dstWorkbook.addPicture(p.getPictureData().getData(), p.getPictureData().getPictureType());
                    ClientAnchor a2 = d2.createAnchor(a1.getDx1(), a1.getDy1(), a1.getDx2(), a1.getDy2(), a1.getCol1(), a1.getRow1(), a1.getCol2(), a1.getRow2());
                    d2.createPicture(a2, pictureId);
                }
            }
        }
        return dstSheet;
    }

    public static Font cloneFont(Workbook dstWorkbook, Font font) {
        Font clone = dstWorkbook.createFont();
        clone.setBold(font.getBold());
        clone.setCharSet(font.getCharSet());
        clone.setColor(font.getColor());
        clone.setFontHeight(font.getFontHeight());
        clone.setFontName(font.getFontName());
        clone.setItalic(font.getItalic());
        clone.setStrikeout(font.getStrikeout());
        clone.setTypeOffset(font.getTypeOffset());
        clone.setUnderline(font.getUnderline());
        return clone;
    }

    public static CellStyle cloneStyle(Workbook dstWorkbook, CellStyle style, DataFormat formatter, Font font) {
        CellStyle clone = dstWorkbook.createCellStyle();
        clone.setAlignment(style.getAlignmentEnum());
        clone.setBorderBottom(style.getBorderBottomEnum());
        clone.setBorderLeft(style.getBorderLeftEnum());
        clone.setBorderRight(style.getBorderRightEnum());
        clone.setBorderTop(style.getBorderTopEnum());
        clone.setDataFormat(formatter.getFormat(style.getDataFormatString()));
        clone.setFillBackgroundColor(style.getFillBackgroundColor());
        clone.setFillForegroundColor(style.getFillForegroundColor());
        clone.setFillPattern(style.getFillPatternEnum());
        clone.setFont(font);
        clone.setHidden(style.getHidden());
        clone.setIndention(style.getIndention());
        clone.setLocked(style.getLocked());
        clone.setVerticalAlignment(style.getVerticalAlignmentEnum());
        clone.setWrapText(style.getWrapText());
        return clone;
    }

    protected static int getCellType(Cell cell) {
        int cellType = cell.getCellType();
        if (cellType == Cell.CELL_TYPE_FORMULA) {
            cellType = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator()
                    .evaluateFormulaCell(cell);
        }
        return cellType;
    }

    protected static Object getCellValue(Cell cell) {
        switch (getCellType(cell)) {
        case Cell.CELL_TYPE_BLANK:
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();
        case Cell.CELL_TYPE_BOOLEAN:
            return cell.getBooleanCellValue();
        case Cell.CELL_TYPE_ERROR:
            return cell.getErrorCellValue();
        case Cell.CELL_TYPE_NUMERIC:
            return cell.getNumericCellValue();
        }
        return null;
    }

    protected static void setCellValue(Cell cell, Object value, int type) {
        switch (type) {
        case Cell.CELL_TYPE_BLANK:
            return;
        case Cell.CELL_TYPE_STRING:
            cell.setCellValue((String) value);
            return;
        case Cell.CELL_TYPE_BOOLEAN:
            cell.setCellValue((Boolean) value);
            return;
        case Cell.CELL_TYPE_ERROR:
            cell.setCellErrorValue((Byte) value);
            return;
        case Cell.CELL_TYPE_NUMERIC:
            cell.setCellValue((Double) value);
            return;
        }
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文