• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:jakarta poiを使用し、EXCELの行コピーはできないのでしょうか?)

jakarta poiを使用し、EXCELの行コピーはできないのでしょうか?

このQ&Aのポイント
  • フォーマット.xlsには、タイトル行の雛型を作成しておきます。そのフォーマット.xlsをpoiを利用し読み込み、新しいエクセルを出力する際にタイトル行を何度もコピーしたいと考えています。
  • HSSFSheet#shiftRowsは完全なる移動のため、タイトル行を使う場合には不都合が生じます。単純な行コピーの方法があれば教えていただきたいです。
  • jakarta poiを使用してEXCELの行をコピーする方法をご存じの方がいらっしゃいましたら、教えていただけますと幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • tsumooh
  • ベストアンサー率50% (1/2)
回答No.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(); ※例外処理は抜いています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • POIを使ってのexcel作成について

    最近javaを始めたのですが、POIを使ってexcelデータも作成することになりました。 それでexcelで書式を作ってjava(POI)にて既存の書式を読み込み、読み込んだ書式を使用してデータ(明細行)を追加していこうと思っています。その際に使用するexcelの書式は印刷するページ数分定義が必要なのでしょうか? 個人的には1ページ分の書式を定義し、明細印刷時に次ページになったら 既存の書式を次ページに貼り付けての繰り返しだと思っていたのですが、どうもうまくいきません。 ご存じの方がいましたらよろしくお願いします。

  • POIで出力したExcelファイルで変更メッセージ

    POIで出力したExcelファイルを開いてすぐに閉じると 「'○○.xls'への変更を保存しますか?」といったメッセージが出てしまい、 何とかならないかと困っている状況です。 全体的な流れとしては単純で、テンプレートとなるExcelファイルを用意して それをPOIを利用して読み込み、値をセットして、別名で保存しなおしています。 テンプレートは、SUM関数が書かれただけのシンプルなものです。 POIのバージョンは、3.8です。 JREは、1.5.0_15を使用しています。 プログラムは以下になります。 -----------------------------------------------------   int rowNo = 0;   int colNo = 0;      FileOutputStream fileOutputStream = null;   try{    //EXCEL読み込み    HSSFWorkbook inputWorkbook = new HSSFWorkbook(     new FileInputStream(new File("C:\\Test1.xls")));    fileOutputStream = new FileOutputStream("C:\\結果.xls");        //最初のシートを取得する    HSSFSheet sheet = inputWorkbook.getSheetAt(0);    sheet.setForceFormulaRecalculation(true);        //ROW取得    HSSFRow row = sheet.getRow(rowNo);    if(null == row)row = sheet.createRow(rowNo);    //CELL取得    HSSFCell cell = row.getCell(colNo);    if(null == cell)cell = row.createCell(colNo);    //値を書き込む    cell.setCellValue(1);        //EXCELファイル書き出し    inputWorkbook.write(fileOutputStream);   }catch (Exception e) {    e.printStackTrace();   }finally{    try{     if(null != fileOutputStream)fileOutputStream.close();    }catch (Exception e) {     e.printStackTrace();    }   } ----------------------------------------------------- 以下の一文を除くと、変更メッセージは表示されなくなります。 sheet.setForceFormulaRecalculation(true); しかし、この一文がないとSUM関数の計算が動作しません。 記述、認識の不備、また解決に向けた良い方法がありましたら ご教授のほど、よろしくお願いします。

    • ベストアンサー
    • Java
  • AccessからExcelへ保存

    はじめまして 質問させていただきます。 【処理内容】 1.Accessにて作成したテーブルデータをTEMP.xlsとして出力 2.TEMP.xlsのデータを出力先.xlsへコピーする という処理を作っているのですが、具体的に 2-1.TEMP.xlsを1行コピー 2-2.ヘッダ用.xlsの最終行に貼り付け 2-3.TEMP.xlsの最終行まで繰り返す 2-4.ヘッダ用.xlsの名前を「出力先.xls」として保存する 2-5.ブックを閉じる と行っています。 それぞれに入るデータは TEMP.xls・・・Accessから作成されたエクセルファイル ヘッダ用.xls・・・「出力先.xls」のヘッダー 出力用.xls・・・TEMP.xlsのデータ+ヘッダ用.xlsのデータ というつくりです。 このとき、TEMP.xlsの最終セル位置を取得させているのですが、 なぜか65536行と、最大値を取得してしまいます。 (本来のデータは130件程度) データ件数と取得する行数を一致させたいのですが、どうすればいいでしょうか? 説明下手なうえ、開発環境が手元にない常態での質問で申し訳ないんですが、回答お願いいたします

  • コピーする範囲を指定

    コピーする範囲を指定 コピー元のファイル名が都度変わるので、下記の様なマクロにてコピー元のファイルから、明細シート.xlsというファイルにコピーをする部分での質問です。 コピー元の行は開いてみないと分からないので、多めの行で(Range("A2:BI502").Copy )の様に約500行で設定していたのですが、行は3行程度からが3000行近くになることもあり、コピー元の必要行だけを判断してコピーするにはどの様にしたらよいでしょうか? Dim sTarget As String sTarget = Dir("C:\Documents and Settings\ユーザ名\デスクトップ\Search result" & "*.xls") If sTarget <> "" Then Workbooks.Open Filename:="C:\Documents and Settings\ユーザ名\デスクトップ\" & sTarget Else MsgBox ("該当ファイル無し") End If Workbooks(sTarget).Worksheets("検索結果").Range("A2:BI502").Copy _ Workbooks("明細シート.xls").Worksheets("Sheet1").Range("A2") Windows(sTarget).Activate

  • EXCELファイルをプログラムで作成する方法

    教えて下さい。 エクセルを使わないで、エクセルで読込める.xlsファ イルを作成する方法を教えて下さい。 言語は、Javaで、画面から設定した値を予め行と列を 決められた所に値を割当、.xlsファイルとして出力し 対です。 .xlsファイルのフォーマットが分かればそれに従えば よいと思いますが… 行と列を意識して.csvファイルにして出力し、エクセ ルで読込む事はできたのですが、直接.xls形式のファ イルを作成をしたいと思いました。 すみませんが、宜しくお願いします。

  • EXCELマクロで特定の行以下をコピーしたい

    BookA.xlsファイルからBookB.cvsがあり、 bookB.csvには1から不特定に数字が昇順にならんでいます bookB.csv  A    B 1 1   文字列A 2 2   文字列B 3 54   文字列C 4 100  文字列D 5 101  文字列E BookA.xlsからbookB.csvを読出し、特定の数値(100番)を探し出し その行から下100行をコピー、BookA.xlsのSheetCに貼り付け という作業をするマクロを組みたいと思っています。 'CSVファイルを開く CSVname = Application.GetOpenFilename(Title:="CSVファイル指定", fileFilter:="CSV ファイル (*.CSV), *.csv") If CSVname = False Then MsgBox "ファイルを1個指定して下さい" Exit Sub End If 'ファイルをひらく Workbooks.Open CSVname '100番検索 Set Obj = Cells.Find("100", LookAt:=xlWhole) If Obj Is Nothing Then MsgBox "見つかりませんでした。" Else Tate = Cells.Find("100", LookAt:=xlWhole).Row End If 'A列100番のある行から199行を選択・コピー エラー→Range(Cells(1, Tate), Cells(2, Tate)).Select このように作ってみたのですが、どうしてもここでエラーになり 先に進めません。 どうか解決方法をお教え下さい。 宜しくお願いします。

  • エクセルでデータ.xlsから1行毎に元シート.xlsへコピーし1行毎に多数ファイルを作成したい。

    現在、以下のような繰り返し作業をカット&ペーストで何度も行わないといけません。 手が疲れて困っています。 エクセルマクロで簡単にできる方法を教えてください。 以下の例のようにデータ.xlsは、一番上の行に元シート.xlsに差込む位置、 次の行から1行ごとのデータがあります。 データ.xls A B C D E F 1 A2 A3 B3 C2 D2 D3 <- 元シート.xlsにコピーする位置 2 test 123 456 789 012 345 3 test2 456 789 012 345 678 4 test 456 123 789 012 345 ... 元シート.xlsは固定文字や罫線等があります。 元シート.xls A B C D 1 ------------------------------ 2 3 4 abcdefg 9876543 5 ------------------------------ 元シート.xlsに、データ.xlsの1行ごとのデータを、指定したセルに入れ、 A列の名前で多数のファイルを作成したいのです。 ただし、A列で同じファイル名がある時は、ファイル名の後に_2等を付けて保存したいのです。 以下のような多数のファイルを自動的に作成する方法を教えて下さい。 宜しくお願い致します。 test.xls ------------------------------ test 789 012 123 456 345 abcdefg 9876543 ------------------------------ test2.xls ------------------------------ test2 012 345 456 789 678 abcdefg 9876543 ------------------------------ test_2.xls ------------------------------ test2 789 012 456 123 345 abcdefg 9876543 ------------------------------ ...

  • POIでExcelに時刻(h:mm)の値を出力したい

    お世話になっております。 現在JAVA勉強という名目でEXCELで運用している社内勤務表をWebから入力できるシステムを開発しています。(好みによりExcel直接編集とWebによる編集どちらかを選べる) 現状の問題としてはPOIライブラリにより勤務開始時間、勤務終了時間の値をExcelのセルに出力するところで h:mm (例えば[10:30])という値が出力できないことです。(既存の書式に合わせた値の出力ができない) 文字列(先頭に'が付く)やシリアル値として出力することは可能ですが、ただ単純に[10:30]と出力することができません。 【実現したいExcelの出力結果】(JavaのString文字列"10:30"を元に出力) 値:[10:30] 表示:[10:30] ※Excelのセルは表示と値が異なる場合があるが両方共 h:mm 形式で出力したい。 【試行錯誤した出力結果】 (1)文字列として出力する 値:['10:30] 表示:[10:30] ※表示は期待通りだが値の先頭に'がついてしまいうまくいかない。 ※出力した値は他のセルの計算式で参照するので'がついてるのは問題あり。 (2)Date型で出力し書式を h:mm 形式にする 値:[613666:30:00] 表示:[10:30] ※表示は期待通りだが値がシリアル値になってしまいうまくいかない。 ※ただし m/d/yy h:mm 形式を出力するとシリアル値にならない。(何故だろう) ※シリアル値ではExcel直接編集の際に人が編集しにくい値なので問題。 実際Excelでは値も表示も[10:30]というセルはキーボード入力で簡単に作成できるのでPOIで出力できないとはとても思えません。 どうすれば[10:30]という値が出力できるか教えていただけないでしょうか。 よろしくお願いいたします。 ----------------------------------------------------------------------- 【使用しているPOI】 バージョン:3.2 ダウンロードしたファイル:poi-bin-3.2-FINAL-20081019.zip ----------------------------------------------------------------------- 【試行錯誤したプログラム】 public class CellOutput{ public static void main(String[] args){ HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(); HSSFRow row = sheet.createRow(1); HSSFCellStyle style = workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat("h:mm")); try { // テスト1(文字列で出力) HSSFCell cell1 = row.createCell((short)0); cell1.setCellValue("10:30"); // テスト2(Dateで出力 書式設定無) HSSFCell cell2 = row.createCell((short)1); SimpleDateFormat hhmmFormat = new SimpleDateFormat("h:mm"); Date time = hhmmFormat.parse("10:30"); cell2.setCellValue(time); // テスト3(Dateで出力 書式設定有) HSSFCell cell3 = row.createCell((short)2); cell3.setCellValue(time); cell3.setCellStyle(style); // テスト4(Dateで出力 m/d/yy h:mm形式) HSSFCell cell4 = row.createCell((short)3); HSSFCellStyle style2 = workbook.createCellStyle(); style2.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); cell4.setCellValue(time); cell4.setCellStyle(style2); } catch(Exception e){ } FileOutputStream out = null; try{ out = new FileOutputStream("sample.xls"); workbook.write(out); }catch(IOException e){ System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ System.out.println(e.toString()); } } } } -----------------------------------------------------------------------

    • ベストアンサー
    • Java
  • エクセルのブック間ででデータをコピーするPG

    エクセル2000でブック間のデータのコピーをやっていての質問です。 あるディレクトリ内に「統合するファイル.xls」と「統合されるファイル.xls」があります。両方のファイルにはC列からG列、2行目以下に数字のデータが入っています。(C2~G2、C3~G3・・・・というように続きます) 「統合されるファイル」のC列からG列のデータをコピーして「統合するファイル」のデータの下に貼り付けるプログラムを作っています。プログラムは以下です。 Dim sBase As String Dim sMyPath As String Dim lLine As Long Dim lStartRow As Long Application.ScreenUpdating = False '統合するファイル名・ディレクトリ名取得 sBase = ActiveWorkbook.Name sMyPath = ActiveWorkbook.Path & "\" Workbooks.Open Filename:=sMyPath & "統合されるファイル.xls" lLine = Workbooks("統合されるファイル.xls").Worksheets("Sheet1").Cells(ActiveSheet.Rows.Count, 3).End(xlUp).Row '統合するファイルの最終行を抽出 lStartRow = 0 lStartRow = Workbooks(sBase).Worksheets("Sheet1").Cells(ActiveSheet.Rows.Count, 3).End(xlUp).Row '統合されるファイルからコピーして統合するファイルの最終行より下に貼り付け Workbooks("統合されるファイル.xls").Worksheets("Sheet1").Range(Cells(2, 3), Cells(lLine, 7)).Copy Destination:=Workbooks(sBase).Worksheets("Sheet1").Range(Cells(lStartRow + 1, 3)) Workbooks("統合されるファイル.xls").Close SaveChanges:=False Application.ScreenUpdating = True 現在、このプログラムを走らせると、コピーして貼り付けるところで「アプリケーション定義またはオブジェクト定義のエラーです」という警告が出てコピーされない状況です。 何が悪いのでしょうか?

  • 見積書 場合によって合計の行が変わる場合

    うまく言葉にできないので、よくわからない質問かもしれませんが。ご了承ください。 見積書の雛形を作成しています。 メーカーからpdfできますので、OCRソフトで変換してから作成します。OCRソフトだと、きちんとレイアウトされないので、あらかじめレイアウトは作っておいて、その都度そのレイアウトに明細をコピーするようにしようと思っています。 ただ、見積によって明細の行数が異なります。 よって、合計を記載する行(セル)も異なってきますので、これはどのようなマクロを作れば可能になるのでしょうか? VBAは、少しだけ勉強したことがある程度のレベルです。簡単でよい案があれば教えてください。 よろしくお願いします。