例えば、日常の業務の中で、複数のシート(または複数のファイル)に分けられた
エクセルファイルを一つのシートにまとめたいというようなルーチンワークが
あったとした場合には、下記のようなプログラムを書いてあげれば簡単に上記の
作業は終了してしまいます。
今回の例では、複数シートを例に書いて見ましたが、ちょっと応用すると
複数のファイルの場合も簡単に統合できるようになると思います。
ちなみに今までには出ていこなかったものをあるのでそれは、個別に説明すると、
セルのスタイルのコピーを作成する方法としては、
wstyle.cloneStyleFrom(rstyle);
http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/CellStyle.html#cloneStyleFrom(org.apache.poi.ss.usermodel.CellStyle)
というのを利用すれば可能です。
あとは、
シートの行数の取得
getNumberOfSheets()
行のセルの数の取得
getPhysicalNumberOfCells()
結合セルの数の取得
getNumMergedRegions()
なんかを利用しています。
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.util.CellRangeAddress; public class IntegrateSheetMain { public static void main(String[] args) throws FileNotFoundException, IOException{ String readFileName="C:\\Users\\XXXXXX\\Desktop\\【見本1-1】複数シート統一.xls"; String writeFileName="C:\\Users\\XXXXXX\\Desktop\\結果.xls"; //xlsファイルを開くときの書き方 POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(readFileName)); //エクセル全体を最初に開く HSSFWorkbook rwb = new HSSFWorkbook(fs); //エクセルを作成(書き込み用) HSSFWorkbook wwb = new HSSFWorkbook(); //名称を指定してシートを作成。 HSSFSheet wsheet = wwb.createSheet("統合シート"); //行を作成 (0から始まるので1は2行目を意味する。) short writeRowNumber=0; //1番目のシートを開く(プログラム上は、0から始まるので、0が1番目を意味して1は2番目を意味する) for (int i=0;i<rwb.getNumberOfSheets();i++){ HSSFSheet rsheet = rwb.getSheetAt(i); int swriteRowNumber=writeRowNumber; //行のデータをコピー先に持っていく。 for (int j=0;j<rsheet.getPhysicalNumberOfRows();j++){ HSSFRow rrow = rsheet.getRow(j); HSSFRow wrow = wsheet.createRow(writeRowNumber); writeRowNumber++; wrow.setHeight(rrow.getHeight()); // 行の高さをコピー for (int k=0;k<rrow.getPhysicalNumberOfCells();k++){ HSSFCell wcell = wrow.createCell(k); HSSFCell rcell=rrow.getCell(k); //ここから巣スタイルのコピー HSSFCellStyle wstyle =wwb.createCellStyle(); HSSFCellStyle rstyle = rcell.getCellStyle(); wstyle.cloneStyleFrom(rstyle); wcell.setCellStyle(wstyle); //セルの値のコピー wcell.setCellValue(rcell.getStringCellValue()); } } //結合セルの状態をコピー for (int j=0;j<rsheet.getNumMergedRegions();j++){ CellRangeAddress mr = rsheet.getMergedRegion(j); //swriteRowNumberはコピー先の開始行を意味している。 //コピー元の位置から平行移動させるため。 CellRangeAddress cpmr= new CellRangeAddress(mr.getFirstRow()+swriteRowNumber ,mr.getLastRow()+swriteRowNumber ,mr.getFirstColumn() ,mr.getLastColumn()); wsheet.addMergedRegion(cpmr); } } FileOutputStream fileOut = new FileOutputStream(writeFileName); wwb.write(fileOut); fileOut.close(); } }
このプログラムを下記あたりを参照にしながらより見ていけば
理解を深めることができるように思います。
http://poi.apache.org/apidocs/index.html?org/apache/poi/ss/usermodel/CellStyle.html
0 件のコメント:
コメントを投稿