実現したいこと
現在、エクセルファイルを読み込んでセルを一つ一つ取り出して
一次元配列に格納し、その配列を二次元配列のListに格納したいと考えています。
発生している問題・エラーメッセージ
ループの中でエクセルの1レコード(行)を配列に格納して1レコード
読み終わると、二次元配列に格納させようとしているのですが、実行結果は
すべて、最後に読み込んだレコードになってしまいます。
例)下記のようなエクセルファイルがあったとき
111 ああああ 大阪
222 いいいい 東京
333 うううう 神戸
下記を1レコード終わるたびに登録させていく。
xlsxData[0] ← 111 ああああ 大阪
に格納してcsvData.add(xlsxData)で登録していきたい。
実行結果)
333 うううう 神戸
333 うううう 神戸
333 うううう 神戸
になってしまいます。
1レコード二次元配列に格納して、次の要素([0][2])に格納していきたいのですが、
格納できず困っています。
どなたかお力添え頂けないでしょうか。
該当のソースコード
xlsxData[] : セルの情報を格納していく配列。
csvData :xlsxData配列を格納していく二次元配列。
// 格納する二次元配列に **List<String[]> csvData = new ArrayList<>();** // List<String[]> xlsxData = new ArrayList<>(); // エクセルファイルのとき /** ファイルのあるフォルダ */ final String FILE_DIR = "C:/pleiades/workspace/DataConvertSystem/src/main/WebContent/xlsx/"; ExelFileRead EFR = new ExelFileRead(); List<String> filePathList = ExelFileRead.getFilePathList(FILE_DIR); for (String filePath : filePathList) { //Excelを開く File file = new File(filePath); Workbook workbook; // シートの全列をループで表示する処理 try { workbook = WorkbookFactory.create(new FileInputStream(file)); //シート1枚目を開く Sheet sheet = workbook.getSheetAt(0); // ヘッダ行だけの二次元配列を作成 // ヘッダ行のみ取得 Row rowhead = sheet.getRow(0); System.out.println("★:" + rowhead.getLastCellNum()); int element = rowhead.getLastCellNum(); // セル情報格納用の配列を作成 String[] xlsxData = new String[element]; // すべての行のセルを確認しに行っている。 int loopcnt=0; int rowcnt = 0; ** for (Row row : sheet) { System.out.println("row:" + row); for (Cell cell : row) { // セルの文字列か数値の確認を行って値を取得 //セルの型を判定する CellType cType = cell.getCellType(); switch(cType) { case STRING: // 文字型 System.out.println("文字型です。"); System.out.println(cell.getStringCellValue() + "\t"); xlsxData[loopcnt] = cell.getStringCellValue(); break; case NUMERIC: // 数値型、日付型 ※日付もNUMERICと判定されます // 小数点の判定が必要 System.out.println("数値型です。"); System.out.println((int)cell.getNumericCellValue() + "\t"); String Intcell = String.valueOf((int)cell.getNumericCellValue()); System.out.println("文字列変換:" + Intcell); xlsxData[loopcnt] = Intcell; //xlsxData.add(cell.getNumericCellValue()); break; case FORMULA: // Excel関数型 ※例)NOW()、SUM()などのExcelの関数 System.out.println("関数です。"); break; case BOOLEAN: // 真偽型 ※例)TRUE、FALSE System.out.println("真偽型です。"); break; case BLANK: //空 ※セルに値がセットされていない場合の型です System.out.println("空です。"); break; // セルタイプを確認してもじれつが } loopcnt ++; } csvData.add(xlsxData); rowcnt ++; loopcnt=0;** }
試したこと
直接格納させる二次元配列(csvData )にエクセルから取得したセルの値を格納するなど
試みたのですが、型の不一致のエラーが発生してうまく動作させることができませんでした。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/10/03 14:30