2010年4月21日水曜日

第9回:複数のシートのデータをひとつのシートに変換するプログラムの作成

今回は、今までのものを総括して少しだけ実用的なプログラムを作ってみたいと思います。

例えば、日常の業務の中で、複数のシート(または複数のファイル)に分けられた
エクセルファイルを一つのシートにまとめたいというようなルーチンワークが
あったとした場合には、下記のようなプログラムを書いてあげれば簡単に上記の
作業は終了してしまいます。

今回の例では、複数シートを例に書いて見ましたが、ちょっと応用すると
複数のファイルの場合も簡単に統合できるようになると思います。

ちなみに今までには出ていこなかったものをあるのでそれは、個別に説明すると、

セルのスタイルのコピーを作成する方法としては、

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 件のコメント:

コメントを投稿