質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

360閲覧

二次元配列に配列を格納する方法について教えてください。

magmag123

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

1グッド

0クリップ

投稿2023/10/03 12:19

実現したいこと

現在、エクセルファイルを読み込んでセルを一つ一つ取り出して
一次元配列に格納し、その配列を二次元配列の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 )にエクセルから取得したセルの値を格納するなど
試みたのですが、型の不一致のエラーが発生してうまく動作させることができませんでした。

neko_the_shadow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

String[] xlsxData = new String[element];
の書く場所を行のループが始まる場所にしてください。

java

1** for (Row row : sheet) { 2ここ String[] xlsxData = new String[element];` 3 System.out.println("row:" + row);

行ごとにnewをしないと同じオブジェクトを使いまわすので、同じデータが複数個かつ
データ自体は最後のデータになってしまいます。

異なるオブジェクトを格納すればよいので、
csvData.add(xlsxData);

csvData.add(xlsxData.clone());
にしてもうまくいくはずです

投稿2023/10/03 14:19

編集2023/10/03 14:27
momon-ga

総合スコア4828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

magmag123

2023/10/03 14:30

ありがとうございます! 無事にすべてのレコードを取得し、二次元配列に格納させることができました! ループするごとに、格納させる配列はnewしないといけないんですね。 また、別回答の「clone()」もありがとうございます。 こちらでも実行できるか確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問