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