Apache POIを使用してHSSFWorkbookをXSSFWorkbookに変換する方法

ブヴァネシュファドニス:

変換方法

org.apache.poi.hssf.usermodel.HSSFWorkbook

org.apache.poi.xssf.usermodel.XSSFWorkbook

Apache POIで?

環境:

  • JSE1.6
  • JBossAS 4.3.2
  • POI 3.7
ブヴァネシュファドニス:

このコードは、コードランチフォーラムで私がここで見つけたものから適応されました

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);
}
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Apache POIとitextを使用してword(.docx)をPDFに変換する

分類Dev

Java:Apache POIを使用してMS WordファイルをPDFに変換する方法は?

分類Dev

Apache Nifiを使用してCSVをJSONに変換する方法は?

分類Dev

Apache POIを使用してaltChunk要素をXWPFDocumentに追加する方法

分類Dev

Apache POIを使用してMS Wordを解析し、XMLに変換することは可能ですか?

分類Dev

java.lang.NoClassDefFoundErrorを解決する方法:org / apache / poi / xssf / usermodel / XSSFWorkbook

分類Dev

Apache POIを使用してdocxでtext(tag)をHTMLに置き換える方法は?

分類Dev

Apache SSLitermediateCA.cerをopensslを使用してcrtに変換する

分類Dev

Apache POI を使用して上付き文字を追加する方法

分類Dev

Java Apache POIを使用してExcelに行を挿入する

分類Dev

この「奇妙な」セル値を取得して日付オブジェクトに正しく変換するには、Apache POIを使用してExcelを解析する方法を教えてください。

分類Dev

HSSFWorkbook対XSSFWorkbook対SXSSFWorkbook-Apache-poi

分類Dev

Apache POIを使用してExcelドキュメントの領域をテーブルに変換するにはどうすればよいですか?

分類Dev

Apache POIでWordをHTMLに変換する

分類Dev

Apache POIを使用してすべてのセル値を読み取る方法

分類Dev

Apache POIを使用して2つのCategoryAxisを含むLineChartを作成する方法

分類Dev

Apache POI XSSFを使用して右から左に配置するシートを作成する方法

分類Dev

Apache Poi 4.1.0を使用して異なるセルに異なる背景色を設定する方法

分類Dev

Apache POIを使用して特定のExcel列を読み取る方法

分類Dev

Apache CamelXmlJsonDataFormatマーシャリングを使用してXML文字列をJSON文字列に変換する方法

分類Dev

Apache Poiを使用して子の形状の絶対位置を取得する方法

分類Dev

Apache POIを使用して数式セルをキャッシュする方法

分類Dev

apache poi 3.1を使用して数式セル値(データ)を取得する方法

分類Dev

Apache POI を使用して Excel から通貨コードを取得する方法は?

分類Dev

Java Apache POIを使用してExcelシートで次の未使用の行を非表示にする方法

分類Dev

Apache POIを使用して行全体を太字にします

分類Dev

APACHE POIを使用して、同じ行の異なる列に値を印刷する

分類Dev

HSSFを使用して既存のExcelの2つの行の間に行を挿入する方法(Apache POI)

分類Dev

Apache POIを使用してExcelシートの行に背景色を適用する方法

Related 関連記事

  1. 1

    Apache POIとitextを使用してword(.docx)をPDFに変換する

  2. 2

    Java:Apache POIを使用してMS WordファイルをPDFに変換する方法は?

  3. 3

    Apache Nifiを使用してCSVをJSONに変換する方法は?

  4. 4

    Apache POIを使用してaltChunk要素をXWPFDocumentに追加する方法

  5. 5

    Apache POIを使用してMS Wordを解析し、XMLに変換することは可能ですか?

  6. 6

    java.lang.NoClassDefFoundErrorを解決する方法:org / apache / poi / xssf / usermodel / XSSFWorkbook

  7. 7

    Apache POIを使用してdocxでtext(tag)をHTMLに置き換える方法は?

  8. 8

    Apache SSLitermediateCA.cerをopensslを使用してcrtに変換する

  9. 9

    Apache POI を使用して上付き文字を追加する方法

  10. 10

    Java Apache POIを使用してExcelに行を挿入する

  11. 11

    この「奇妙な」セル値を取得して日付オブジェクトに正しく変換するには、Apache POIを使用してExcelを解析する方法を教えてください。

  12. 12

    HSSFWorkbook対XSSFWorkbook対SXSSFWorkbook-Apache-poi

  13. 13

    Apache POIを使用してExcelドキュメントの領域をテーブルに変換するにはどうすればよいですか?

  14. 14

    Apache POIでWordをHTMLに変換する

  15. 15

    Apache POIを使用してすべてのセル値を読み取る方法

  16. 16

    Apache POIを使用して2つのCategoryAxisを含むLineChartを作成する方法

  17. 17

    Apache POI XSSFを使用して右から左に配置するシートを作成する方法

  18. 18

    Apache Poi 4.1.0を使用して異なるセルに異なる背景色を設定する方法

  19. 19

    Apache POIを使用して特定のExcel列を読み取る方法

  20. 20

    Apache CamelXmlJsonDataFormatマーシャリングを使用してXML文字列をJSON文字列に変換する方法

  21. 21

    Apache Poiを使用して子の形状の絶対位置を取得する方法

  22. 22

    Apache POIを使用して数式セルをキャッシュする方法

  23. 23

    apache poi 3.1を使用して数式セル値(データ)を取得する方法

  24. 24

    Apache POI を使用して Excel から通貨コードを取得する方法は?

  25. 25

    Java Apache POIを使用してExcelシートで次の未使用の行を非表示にする方法

  26. 26

    Apache POIを使用して行全体を太字にします

  27. 27

    APACHE POIを使用して、同じ行の異なる列に値を印刷する

  28. 28

    HSSFを使用して既存のExcelの2つの行の間に行を挿入する方法(Apache POI)

  29. 29

    Apache POIを使用してExcelシートの行に背景色を適用する方法

ホットタグ

アーカイブ