例えば、日常の業務の中で、複数のシート(または複数のファイル)に分けられた
エクセルファイルを一つのシートにまとめたいというようなルーチンワークが
あったとした場合には、下記のようなプログラムを書いてあげれば簡単に上記の
作業は終了してしまいます。
今回の例では、複数シートを例に書いて見ましたが、ちょっと応用すると
複数のファイルの場合も簡単に統合できるようになると思います。
ちなみに今までには出ていこなかったものをあるのでそれは、個別に説明すると、
セルのスタイルのコピーを作成する方法としては、
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 件のコメント:
コメントを投稿