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

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

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

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

Q&A

解決済

2回答

466閲覧

poiを使用してExcelの値を表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2021/09/16 02:59

編集2021/09/16 06:24

前提・実現したいこと

Excelの「投手」シートの選手の背番号、名前を順に表示していき、最後の行まで読み込み終わると「外野手」シートで同じ処理を行いたい。

発生している問題・エラーメッセージ

Excelの行を一行ずつ見ていき、nullが出るまで処理を続けたいが、値が入っていないセルを見ると次の処理へ移らずNullPointerExceptionが発生する。
![イメージ説明投手シート
イメージ説明外野手シート

Cell cell2 = row2.getCell(0);
この行でエラーが出ているようです。

Java

1Workbook workbook = WorkbookFactory 2 .create(new FileInputStream( 3 "C:Sample.xlsx")); 4 Sheet sheet = workbook.getSheet("投手"); 5 int a = 1; 6 7 Row row = sheet.getRow(a); 8 Cell cell = row.getCell(0); 9 while (cell != null) { 10 Row row2 = sheet.getRow(a); 11 Cell cell2 = row2.getCell(0); 12 Row row3 = sheet.getRow(a); 13 Cell cell3 = row3.getCell(1); 14 switch (cell2.getCellType()) { 15 case NUMERIC: 16 System.out.print("背番号" + (int)cell2.getNumericCellValue()+","); 17 default: 18 break; 19 } 20 switch (cell3.getCellType()) { 21 case STRING: 22 System.out.println("選手名 " + cell3.getStringCellValue()); 23 a++; 24 default: 25 break; 26 } 27 } 28 Workbook workbook2 = WorkbookFactory 29 .create(new FileInputStream( 30 "C:Sample.xlsx")); 31 Sheet sheet2 = workbook2.getSheet("外野手"); 32 int b = 1; 33 Row row4 = sheet2.getRow(b); 34 Cell cell4 = row4.getCell(0); 35 while (cell4 != null) { 36 Row row5 = sheet2.getRow(b); 37 Cell cell5 = row5.getCell(0); 38 Row row6 = sheet2.getRow(b); 39 Cell cell6 = row6.getCell(1); 40 switch (cell5.getCellType()) { 41 case NUMERIC: 42 System.out.print("背番号" + (int)cell5.getNumericCellValue()+","); 43 default: 44 break; 45 } 46 switch (cell6.getCellType()) { 47 case STRING: 48 System.out.println("選手名 " + cell6.getStringCellValue()); 49 b++; 50 default: 51 break; 52 } 53 }

試したこと

なかなかpoiについて詳しく書いている記事がなかったので「poi Excel 繰り返し」「java Excel 値取得 繰り返し」などで検索しても有用な記事を見つけることができませんでした。

while文ではなくfor文を使い、値が入っている部分を条件式として記述すると正常に動作したのですが、それだとExcelに値を追加した際コードもいちいち書き換える必要があるため、while文を使い「値があれば処理を行う」というようにすべきだと思いました。
自分で調べたり試していては埒が明かないと感じたので力をお借りしたいです。

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

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

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

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

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

jimbe

2021/09/16 05:46

> NullPointerExceptionが発生する それはどの行で発生しているのでしょうか。 表示された中に行番号も書かれていたはずです。そして、その行での該当変数には null が入る可能性があり、またその変数が null になることが"何か"(例えば空行であったりデータの終わりであったり)を表すヒントとなる場合もあります。 「なんだ例外か」で終わるのではなく、そのメッセージから情報(「この変数に値を入れているメソッドの戻り値は null もありなのか」)を得た上で調査し、ついでにその現象(「 null になるのはデータがもうないのか」)を利用(「データが無いならループは終わっちゃおう」)することまで思い付くと、イロイロ面白くなってくるかと思います。
退会済みユーザー

退会済みユーザー

2021/09/16 06:32

>それはどの行で発生しているのでしょうか。 ありがとうございます。書き足しました。 >「データが無いならループは終わっちゃおう」 このようにループを抜けることがしたいのですがそのためのコードが思いつきませんでした。
jimbe

2021/09/16 08:16

> このようにループを抜けることがしたいのですが while や for は(switch の中で無ければ) break で抜けられます。
guest

回答2

0

ベストアンサー

参考までに、貴方なら「空白まで繰り返す」という処理はどのように書きますか?

java

1import org.apache.poi.ss.usermodel.*; 2 3import java.nio.file.Path; 4import java.nio.file.Paths; 5 6public class xxHogeHawks { 7 8 public static void main(final String[] args) throws Exception { 9 final Path path = Paths.get("./Sample.xlsx"); 10 final Workbook book = WorkbookFactory.create(path.toFile()); 11 12 for (int sheetIndex = 0; sheetIndex < book.getNumberOfSheets(); sheetIndex++) { 13 final Sheet sheet = book.getSheetAt(sheetIndex); 14 if (sheet.getSheetName().equals("投手") || sheet.getSheetName().equals("外野手")) 15 ; 16 else 17 continue; 18 19 // 20 for (int rowIndex = sheet.getFirstRowNum(); rowIndex < sheet.getLastRowNum(); rowIndex++) { 21 final Row row = sheet.getRow(rowIndex); 22 if (row == null || row.getRowNum() == 0) 23 continue; 24 25 final Cell a = row.getCell(0); 26 final Cell b = row.getCell(1); 27 if (a == null || b == null) 28 continue; 29 30 System.out.println(String.format("背番号 %s, 選手名 %s", cellToString(a), cellToString(b))); 31 } 32 } 33 } 34 35 private static String cellToString(final Cell cell) { 36 assert (cell != null); 37 38 switch (cell.getCellType()) { 39 case NUMERIC: 40 return String.valueOf((int) cell.getNumericCellValue()); 41 case STRING: 42 return cell.getStringCellValue(); 43 default: 44 return cell.toString(); 45 } 46 } 47}

or

java

1 public static void main(final String[] args) throws Exception { 2 final Path path = Paths.get("./Sample.xlsx"); 3 final Workbook book = WorkbookFactory.create(path.toFile()); 4 5 for (Sheet sheet : (Iterable<Sheet>) () -> book.sheetIterator()) { 6 if (sheet.getSheetName().equals("投手") || sheet.getSheetName().equals("外野手")) 7 ; 8 else 9 continue; 10 11 for (Row row : (Iterable<Row>) () -> sheet.rowIterator()) { 12 if (row.getRowNum() == 0) 13 continue; 14 15 final Cell a = row.getCell(0); 16 final Cell b = row.getCell(1); 17 if (a == null || b == null) 18 continue; 19 20 System.out.println(String.format("背番号 %s, 選手名 %s", cellToString(a), cellToString(b))); 21 } 22 } 23 }

投稿2021/09/16 07:30

shiketa

総合スコア3990

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

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

退会済みユーザー

退会済みユーザー

2021/09/16 08:16

上のコードを使用させていただき上手くいきました。 丁寧に回答していただきありがとうございます。
guest

0

値が入っていないセルを見ると次の処理へ移らずNullPointerExceptionが発生する

「値が入っていないセルを見」なければいい。

Returns: Row representing the row-number or null if its not defined on the sheet

Returns: Cell representing that column or null if undefined.

getRow()もgetCell()もnullを返す可能性があるのだから、返された値のメソッドを呼び出す前にnullかどうかをチェックすればいいだけ。

POIも何も関係ありません。


garyageというアカウント名に期待を込めて追記。

これらのドキュメントをみると、nullを返すとは書いていない。NullPointerExceptionを心配せずに値を取得できる。かもしれない。

投稿2021/09/16 03:37

編集2021/09/16 04:04
shiketa

総合スコア3990

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

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

退会済みユーザー

退会済みユーザー

2021/09/16 04:19 編集

返された値のメソッドを呼び出す前にnullかどうかをチェックすればいいだけ。<< if(cell2==nul){nullであることを表示}else{switch分}というようなコードを挿入してみたのですが上手くいきませんでした。 やはりIteratorを使った方がいいですかね。
shiketa

2021/09/16 04:30 編集

> というようなコードを挿入してみたのですが上手くいきませんでした。 cell2だけチェックしたのですか。 rowもcellもrow2もチェックしていますか。ソースが全部ぜんぶ提示されているわけではないのでわかりませんが、そのほかの場所はどうなのでしょうか。ドキュメントにnullを返すとは書いていなくても、それはただのドキュメントなので、実際にnullを返してくるものはありふれています。 > やはりIteratorを使った方がいいですかね。 用途に応じてご随意に。
退会済みユーザー

退会済みユーザー

2021/09/16 04:49

>rowもcellもrow2もチェックしていますか。 cellをチェックしていなかったのはミスでした。ありがとうございます。 row,row2はチェックする必要がないのではないでしょうか。cell,cell2と違いrow,row2にはセルの値がはいるわけではないので。 参考までに、貴方なら「空白まで繰り返す」という処理はどのように書きますか? <「値が入っていないセルを見」なければいい。 と回答していただけましたが、自分ではこの処理を行うためのコードが思いつかないのでもう少し具体的に教えていただけると本当に助かります。
shiketa

2021/09/16 05:19

> 貴方なら.. 提示されているソースだけではナニをしたいのかがわたしにはわかりません。実行可能なソースを提示していただけたなら、考えます。質問欄に追記してください。
退会済みユーザー

退会済みユーザー

2021/09/16 05:48

ありがとうございます。追記します。
shiketa

2021/09/16 05:56

お待ちします。 > row,row2はチェックする必要がないのではないでしょうか。cell,cell2と違いrow,row2にはセルの値がはいるわけではないので ここだけ。 「セルの値がはいる」かどうかは関係ありません。rowがnullのとき`row.getCell(0)`としたらどうなりますか。row2がnullのとき`row2.getCell(0)`としたらどうなりますか。そいうこうことです。
退会済みユーザー

退会済みユーザー

2021/09/16 06:30 編集

やりたいことを具体的にしてみました。 >「セルの値がはいる」かどうかは関係ありません。 ありがとうございます。それも試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問