【Java】Apache POIでの注意点と使用するメソッドの共通化の例

# Apache POIを使用する際の注意点
-基本的にテンプレートとして使用するエクセルファイルの設定を引き継ぐため、
倍率、数値0の表示、非表示などの細かい設定にも留意してテンプレートファイルを用意する必要がある。

# Apache POIで使用するメソッドの共通化の例

セルへの値の設定、行のコピーなど、
POIを使用する際によく使用するメソッドを共通化して使用する事で、
実装の効率があがるので、例を記載。


```java:ExampleMakeExcelSheet.java
public class ExampleMakeExcelSheet {

  private XSSFSheet sheet;

  /**
   * シートをセット
   * 
   * @param sheet
   */
  public void setExcelSheet(XSSFSheet sheet) {
    this.sheet = sheet;
  }

  /**
   * 指定されたセルに値をセット
   * 
   * @param rowNo 値をセットする列No
   * @param cellNo 値をセットするセルNo
   * @param value セットする値
   */
  public void setCellData(int rowNo, int cellNo, Object value) {
    Row row = sheet.getRow(rowNo);
    if (row == null)
      return;
    Cell cell = row.getCell(cellNo);
    if (cell == null)
      return;
    if (isIntValue(value)) {
      int tmpVal = (Integer) value;
      cell.setCellValue(tmpVal);
    } else if (isBigDecimalValue(value)) {
      BigDecimal tmpVal = (BigDecimal) value;
      cell.setCellValue(tmpVal.doubleValue());
    } else if (isLongValue(value)) {
      Long tmpVal = (Long) value;
      cell.setCellValue(tmpVal);
    } else {
      String tmpVal = ExStringUtils.nullToBlank(value.toString());
      String[] returnCnt = tmpVal.split("\\n");
      if (returnCnt.length > 1) {
        row.setHeightInPoints((returnCnt.length * sheet.getDefaultRowHeightInPoints()));
      }
      cell.setCellValue(tmpVal);
    }
  }

  /**
   * 指定されたセルに数式をセット
   * 
   * @param rowNo 値をセットする列No
   * @param cellNo 値をセットするセルNo
   * @param value セットする数式
   */
  public void setCellFormula(int rowNo, int cellNo, String formula) {
    Row row = sheet.getRow(rowNo);
    if (row == null)
      return;
    Cell cell = row.getCell(cellNo);
    if (cell == null)
      return;
    cell.setCellFormula(formula);
  }

  /**
   * マップデータからExcelに記入されたKeyを持ってデータを置き換える。
   * 
   * @param rowNo
   * @param endRowNo
   * @param inData
   */
  public void setHashMapValue(int rowNo, int endRowNo, HashMap<String, Object> inData)
      throws Exception {
    XSSFRow row = sheet.getRow(rowNo);
    for (int i = 0; i <= row.getLastCellNum(); i++) {
      XSSFCell cell = row.getCell((short) i);
      String key = "";
      if (cell != null) {
        // セルの値を取得
        key = cell.getStringCellValue();
        // キーに一致するデータを取得する
        if (key != null && !key.equals("")) {
          Object valueObj = (Object) inData.get(key);
          if (valueObj == null)
            cell.setCellValue("");
          else if (isIntValue(valueObj))
            cell.setCellValue((Integer) valueObj);
          else if (isDoubleValue(valueObj))
            if ((new BigDecimal((Double) valueObj * 10)
                .intValue()) == new BigDecimal((Double) valueObj).intValue() * 10) {
              cell.setCellValue(new BigDecimal((Double) valueObj).intValue());
            } else {
              cell.setCellValue((Double) valueObj);
            }
          else if (isBigDecimalValue(valueObj))
            cell.setCellValue(((BigDecimal) valueObj).doubleValue());
          else if (isLongValue(valueObj))
            cell.setCellValue((Long) valueObj);
          else {
            String tmpVal = ExStringUtils.nullToBlank(valueObj.toString());
            cell.setCellValue(tmpVal);
          }
        }
      }
    }
  }

  /**
   * 行のコピーを行う
   * 
   * @param workbook ワークブック
   * @param worksheet ワークシート
   * @param sourceRowNo コピー元の行No
   * @param newRowNo コピー先の行No
   */
  public static void copyRow(Workbook workbook, Sheet worksheet, int sourceRowNo, int newRowNo) {
    Row newRow = worksheet.getRow(newRowNo);
    Row sourceRow = worksheet.getRow(sourceRowNo);

    if (newRow != null) {
      // コピー先に行が既に存在する場合、１行下にずらす
      worksheet.shiftRows(newRowNo, worksheet.getLastRowNum(), 1);
      newRow = worksheet.createRow(newRowNo);
    } else {
      // 存在しない場合は作成
      newRow = worksheet.createRow(newRowNo);
    }

    // スタイル、セル型をコピーする
    for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
      Cell oldCell = sourceRow.getCell(i);
      Cell newCell = newRow.createCell(i);

      // コピー元の行が存在しない場合、処理を中断
      if (oldCell == null) {
        newCell = null;
        continue;
      }

      // スタイルのコピー
      CellStyle newCellStyle = workbook.createCellStyle();
      newCellStyle.cloneStyleFrom(oldCell.getCellStyle());
      newCell.setCellStyle(newCellStyle);

      // 行の高さをコピー
      short rowHight = sourceRow.getHeight();
      newRow.setHeight(rowHight);

      // セル型のコピー
      newCell.setCellType(oldCell.getCellType());

      // セルの値をコピー
      switch (oldCell.getCellType()) {
        case Cell.CELL_TYPE_BLANK:
          newCell.setCellValue(oldCell.getStringCellValue());
          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());
          break;
        case Cell.CELL_TYPE_NUMERIC:
          newCell.setCellValue(oldCell.getNumericCellValue());
          break;
        case Cell.CELL_TYPE_STRING:
          newCell.setCellValue(oldCell.getRichStringCellValue());
          break;
      }
    }

    // セル結合のコピー
    for (int i = 0; i < worksheet.getNumMergedRegions(); i++) {
      CellRangeAddress cellRangeAddress = worksheet.getMergedRegion(i);
      if (cellRangeAddress.getFirstRow() == sourceRow.getRowNum()) {
        CellRangeAddress newCellRangeAddress = new CellRangeAddress(newRow.getRowNum(),
            (newRow.getRowNum() + (cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow())),
            cellRangeAddress.getFirstColumn(), cellRangeAddress.getLastColumn());
        worksheet.addMergedRegion(newCellRangeAddress);
      }
    }
  }

  /**
   * int型チェック
   * 
   * @param obj
   * @return
   */
  private boolean isIntValue(Object obj) {
    boolean retFlg = false;
    if (obj == null)
      return false;
    try {
      int tmpInt = (Integer) obj;
      if (String.valueOf(obj).equals(String.valueOf(tmpInt))) {
        return true;
      }
    } catch (Exception e) {
      return false;
    }
    return retFlg;
  }

  /**
   * BigDecimal型チェック
   * 
   * @param obj
   * @return
   */
  private boolean isBigDecimalValue(Object obj) {
    try {
      @SuppressWarnings("unused")
      BigDecimal tmpInt = (BigDecimal) obj;
      return true;
    } catch (Exception e) {
      return false;
    }
  }

  /**
   * Long型チェック
   * 
   * @param obj
   * @return
   */
  private boolean isLongValue(Object obj) {
    try {
      @SuppressWarnings("unused")
      Long tmpBig = (Long) obj;
      return true;
    } catch (Exception e) {
      return false;
    }
  }

  /**
   * Double型チェック
   * 
   * @param obj
   * @return
   */
  private boolean isDoubleValue(Object obj) {
    try {
      @SuppressWarnings("unused")
      Double tmpBig = (Double) obj;
      return true;
    } catch (Exception e) {
      return false;
    }
  }

}


```