読者です 読者をやめる 読者になる 読者になる

GOOGZONW

ふと思い立ったことをまとめたら記事にあげるブログ

MENU

Apache POIを使ってExcelでシート間のコピー

f:id:katamichinijikan:20170303085249j:plain

たくさんシートがあるExcelファイルを読み込み、各シートの内容を別のシートに集計した。

 

セルの結合を別のシートにコピーする

FileInputStream fs = new FileInputStream("ihatejava.xls");
HSSFWorkbook workbook = new HSSFWorkbook(fs);

//sheet1からsheet2へコピーする
//getSheetメソッドの引数は、シート名を指定する。
//getSheetNameメソッドを使えばシートの番号(一番左が0)
HSSFSheet sheet1 = workbook.getSheet(workbook.getSheetName(シートのインデックス番号));
HSSFSheet sheet2= workbook.getSheet(workbook.getSheetName(シートのインデックス番号));

//結合セルの情報はよくわからない順番で格納されているので、すべてループさせて1つずつコピーする
for (int i = 0; i < sheet.getNumMergedRegions(); i++)
{
Region mergedRegion = sheet.getMergedRegionAt(i); //i番目の結合セルのアドレスを取得
//コピー先で別のセル位置を指定する場合にはこうする方がわかりやすい気がする。
//同じ位置にコピーするなら以下4行は不要。
//行番号・列番号は0開始の数値(int型)
mergedRegion.setRowFrom(コピー先の行番号の先頭);
mergedRegion.setRowTo(コピー先の行番号の末尾);
mergedRegion.setColumnFrom(コピー先の列番号の先頭);
mergedRegion.setColumnTo(コピー先の列番号の末尾);
//コピー先のシートに対して、addMergedRegionメソッドを利用してセル結合
sheet2.addMergedRegion(mergedCell);
}

 HSSFである(^^;


すべてのシートをループで見ていく

for (int i = 1; i < workbook.getNumberOfSheets() - 1; i++) { }

  スポンサードリンク

 

値をコピーする

どうにも都合の良いメソッドはないようなので、単純にコピーしたい範囲を行と列で2重ループさせる。


コピーする時、コピー先の行がnullだと値の代入(setCellValueメソッド)ができない。
getRowメソッドでは、何もない行の場合nullが帰ってくるのでチェックした上で、nullの場合にはcreateRowメソッドで行を追加する。

 

if (destinationRow == null)
{
destinationRow = sheet.createRow(currentRow);
}

 



コピーする時は、特に意図がなければセルタイプ(書式)ごとにコピーしておいた方がいいかもしれない。
以下のコードでは、コピー先にコピー元と同じセルタイプ(数値とか文字列とか日付とか)を設定し、値を設定し、更に書式(罫線とか文字サイズとかの方)をコピーしている。
また、BLANKとERRORのセルは値はコピーせず、タイプと書式設定のみコピーしている。


switch (sourceCell.getCellType())
{
case HSSFCell.CELL_TYPE_NUMERIC:
destinationCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
destinationCell.setCellValue(sourceCell.getNumericCellValue());
destinationCell.setCellStyle(sourceCell.getCellStyle());
break;
case HSSFCell.CELL_TYPE_STRING:
destinationCell.setCellType(HSSFCell.CELL_TYPE_STRING);
destinationCell.setCellValue(sourceCell.getRichStringCellValue());
destinationCell.setCellStyle(sourceCell.getCellStyle());
break;
case HSSFCell.CELL_TYPE_FORMULA:
destinationCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
destinationCell.setCellValue(sourceCell.getRichStringCellValue());
destinationCell.setCellStyle(sourceCell.getCellStyle());
break;
case HSSFCell.CELL_TYPE_BLANK:
destinationCell.setCellType(HSSFCell.CELL_TYPE_BLANK);
destinationCell.setCellStyle(sourceCell.getCellStyle());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
destinationCell.setCellType(HSSFCell.CELL_TYPE_BOOLEAN);
destinationCell.setCellValue(sourceCell.getBooleanCellValue());
destinationCell.setCellStyle(sourceCell.getCellStyle());
break;
case HSSFCell.CELL_TYPE_ERROR:
destinationCell.setCellType(HSSFCell.CELL_TYPE_ERROR);
destinationCell.setCellStyle(sourceCell.getCellStyle());
break;
}