前提・実現したいこと
apache poiを使用してExcelファイルを作成するプログラムを組んでいます。
Javaのプログラムからデータベースに接続し、取得したデータを
Excelのフォーマットを読み込んで、転記するプログラムになります。
そのプログラムにおいてExcelファイルのシート中のセルを範囲指定し、
同じシートの指定した箇所にコピーしたいと考えています。
具体的には添付のようなイメージで実現したいです。
試したこと
行と列を2次元ループで回す方法など調べてみましたが、添付の通り
コピー元の真横にデータをコピーしていき、3つコピーデータができた
時点で折り返し、取得した件数分コピーを行うといった実装方法が思いつかず
困っています。有識者の方がいらっしゃれば実装方法をご教授いただきたいです。
補足情報(FW/ツールのバージョンなど)
当方の環境は以下の通りです。
Windows10
poi-3.0-FINAL.jar
jre1.5
Excel2013
お力添えの程どうぞ宜しく御願い致します
補足情報(2019/08/20 追記)
Java
1 /** 2 * 指定した範囲のセルをコピーする。 3 * 4 * @param copyRow0 5 * 開始行 6 * @param copyColumn0 7 * 開始列 8 * @param copyRow1 9 * 終了行 10 * @param copyColumn1 11 * 終了列 12 * @param startRow 13 * 貼り付け行 14 * @param startColumn 15 * 貼り付け列 16 */ 17 @SuppressWarnings("deprecation") 18 public void copyCellArea(String orgSheetName, int copyRow0, int copyColumn0, int copyRow1, 19 int copyColumn1, int startRow, int startColumn) { 20 21 // シートオブジェクト生成 22 HSSFSheet sheet = wb.getSheet(orgSheetName); 23 List<Region> appendRegionList = new ArrayList<Region>(); 24 25 for (int i = 0; copyRow0 + i <= copyRow1; i++) { 26 for (int j = 0; copyColumn0 + j <= copyColumn1; j++) { 27 HSSFCell srcCell = getCell(copyRow0 + i, copyColumn0 + j, sheet); 28 HSSFCell destCell = getCell(startRow + i, startColumn + j, sheet); 29 // スタイルを取得 30 destCell.setCellStyle(srcCell.getCellStyle()); 31 destCell.setCellType(srcCell.getCellType()); 32 33 // 値の設定 34 switch (srcCell.getCellType()) { 35 case HSSFCell.CELL_TYPE_BOOLEAN: 36 destCell.setCellValue(srcCell.getBooleanCellValue()); 37 break; 38 case HSSFCell.CELL_TYPE_ERROR: 39 destCell.setCellValue(srcCell.getErrorCellValue()); 40 break; 41 case HSSFCell.CELL_TYPE_FORMULA: 42 destCell.setCellFormula(srcCell.getCellFormula()); 43 break; 44 case HSSFCell.CELL_TYPE_NUMERIC: 45 destCell.setCellValue(srcCell.getNumericCellValue()); 46 break; 47 case HSSFCell.CELL_TYPE_STRING: 48 destCell.setCellValue(srcCell.getStringCellValue()); 49 break; 50 } 51 52 // 結合の設定 53 for (int k = 0; k < sheet.getNumMergedRegions(); k++) { 54 Region region = sheet.getMergedRegionAt(k); 55 // 処理中のコピー元セルが結合セルである場合 56 if (region.contains(i, (short) j)) { 57 int newRow0 = startRow + i; 58 short newCol0 = region.getColumnFrom(); 59 int newRow1 = region.getRowTo() - region.getRowFrom() + startRow + i; 60 short newCol1 = region.getColumnTo(); 61 Region newRegion = new Region(); 62 newRegion.setRowFrom(newRow0); 63 newRegion.setColumnFrom((short) newCol0); 64 newRegion.setRowTo(newRow1); 65 newRegion.setColumnTo((short) newCol1); 66 boolean exist = false; 67 for (int n = 0; n < appendRegionList.size(); n++) { 68 Region exRegion = appendRegionList.get(n); 69 if (exRegion.contains(newRow0, newCol0)) { 70 // 既に存在する 71 exist = true; 72 break; 73 } 74 } 75 if (!exist) { 76 appendRegionList.add(newRegion); 77 break; 78 } else { 79 break; 80 } 81 } 82 } 83 // 幅サイズ調節 84 if (i == 0) { 85 sheet.setColumnWidth((short) (startColumn + j), sheet.getColumnWidth((short) (copyColumn0 + j))); 86 } 87 } 88 } 89 } 90 91 /** 92 * Cell を返す。 93 * 94 * @param row 95 * 行 96 * @param column 97 * 列 98 * @param sheet 99 * オブジェクト 100 * @return Cell 101 */ 102 protected HSSFCell getCell(int row, int column, HSSFSheet sheet) { 103 return HSSFCellUtil.getCell(HSSFCellUtil.getRow(row, sheet), column); 104 }
あなたの回答
tips
プレビュー