アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のような処理を検討しています。

フォーマット.xlsには、タイトル行の雛型(背景色などを定義済)をを作成しておきます。

そのフォーマット.xlsをpoiを利用し読み込み、
■タイトル行
・明細
・明細
・明細
■タイトル行
・明細
・明細
の要領でタイトル行を何度もコピーし、新しいエクセルを出力したいと考えています。
HSSFSheet#shiftRowsは完全なる移動のようですので、
何度もタイトル行を使う場合には不都合がでてしまいます。

単純な行コピーなのでできそうな感じもするのですが、
ご存じな方いらっしゃいましたら、
ご教授いただけますようお願いいたします。

A 回答 (1件)

コピーのようなメソッドは用意されていないんですね。


ちょっと面倒ですが、行の内容を取得して、その中のセルの値およびスタイルをコピーするという方法でしたらどうでしょうか。

  // テンプレートの読み込み
  POIFSFileSystem fs = new POIFSFileSystem(
      new FileInputStream(new File("src.xls")));
  HSSFWorkbook book = new HSSFWorkbook(fs);
  HSSFSheet sheet = book.getSheetAt(0);
  
  // タイトル行(1行目)の取得
  HSSFRow titleRow = sheet.getRow(0);
  
  // タイトル行を別の行(ここでは2行目)へコピーします。
  HSSFRow row = sheet.createRow(1);
  
  // セルをコピーします。
  int length = titleRow.getLastCellNum();
  for (int i=0; i<length; i++) {
    HSSFCell titleCell = titleRow.getCell((short)i);
    HSSFCell cell = row.createCell((short)i);
    if (titleCell != null) {
      // 値を取得
      switch (titleCell.getCellType()) {
        case HSSFCell.CELL_TYPE_BLANK :
          break;
        case HSSFCell.CELL_TYPE_BOOLEAN :
          cell.setCellValue(titleCell.getBooleanCellValue());
          break;
        case HSSFCell.CELL_TYPE_ERROR :
          cell.setCellValue(titleCell.getErrorCellValue());
          break;
        case HSSFCell.CELL_TYPE_FORMULA :
          cell.setCellValue(titleCell.getStringCellValue());
          break;
        case HSSFCell.CELL_TYPE_NUMERIC :
          cell.setCellValue(titleCell.getNumericCellValue());
          break;
        case HSSFCell.CELL_TYPE_STRING :
          cell.setCellValue(titleCell.getStringCellValue());
          break;
        default :
      }
      // スタイルを取得
      cell.setCellStyle(titleCell.getCellStyle());
    }
  }
  
  // 保存
  FileOutputStream fos = new FileOutputStream(new File("dest.xls"));
  book.write(fos);
  fos.close();

※例外処理は抜いています。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!