LoginSignup
0
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-06-02

Apache POIを使用する際の注意点

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

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

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

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) {
      // コピー先に行が既に存在する場合、1行下にずらす
      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;
    }
  }

}


0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1