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

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

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

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

Q&A

1回答

1782閲覧

JavaライブラリのApache POIを用いて読み込んだエクセルファイルの複数セルにコメントが付与できない問題について

tukigami_555

総合スコア1

Java

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

0グッド

0クリップ

投稿2020/05/19 01:00

前提・実現したいこと

Apache POI を用いて、読み込んだエクセルファイルの
「複数」セルにコメントを付与する方法を皆様からご教授いただきたい。

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

下記「該当のソースコード」のswitch文内で 各条件に合致したセルにコメントを付与する処理を記述した。 A2~D2の各セルにコメントが付与される想定だが セルD2のみにしかコメントを付与しない。 なお、用意したエクセルファイル「コメント挿入.xlsx」には以下を記述 A1セル→文字列 A2セル→ABC B1セル→数字 B2セル→1 C1セル→真偽値 C2セル→TRUE D1セル→計算式 D2セル→=SUM(1+1)【備考:セル上では「2」と表示】

該当のソースコード

java

1package com.example.demo; 2 3import java.io.File; 4import java.io.FileInputStream; 5import java.io.FileOutputStream; 6import java.io.IOException; 7import java.io.InputStream; 8import java.io.OutputStream; 9 10import org.apache.poi.ss.usermodel.Cell; 11import org.apache.poi.ss.usermodel.CellType; 12import org.apache.poi.ss.usermodel.ClientAnchor; 13import org.apache.poi.ss.usermodel.Comment; 14import org.apache.poi.ss.usermodel.CreationHelper; 15import org.apache.poi.ss.usermodel.Drawing; 16import org.apache.poi.ss.usermodel.RichTextString; 17import org.apache.poi.ss.usermodel.Row; 18import org.apache.poi.ss.usermodel.Sheet; 19import org.apache.poi.ss.usermodel.Workbook; 20import org.apache.poi.ss.usermodel.WorkbookFactory; 21import org.apache.poi.xssf.usermodel.XSSFClientAnchor; 22import org.springframework.boot.SpringApplication; 23import org.springframework.boot.autoconfigure.SpringBootApplication; 24 25@SpringBootApplication 26public class insertComment { 27 28 public static void main(String[] args) throws IOException { 29 SpringApplication.run(insertComment.class, args); 30 31 // サンプルテスト開始 32 System.out.println("コメント挿入開始"); 33 Row row = null; 34 Cell cell = null; 35 36 OutputStream os = null; 37 InputStream in = new FileInputStream("C:\work\tech\コメント挿入.xlsx"); 38 Workbook wb = WorkbookFactory.create(in); 39 Sheet sheet = wb.getSheetAt(0); 40 41 //コメント設定関連 42 Drawing<?> patriarch = sheet.createDrawingPatriarch(); 43 ClientAnchor anchor = new XSSFClientAnchor(); 44 Comment comment = patriarch.createCellComment(anchor); 45 CreationHelper creationHelper = wb.getCreationHelper(); 46 RichTextString text = creationHelper.createRichTextString("コメントです。"); 47 comment.setString(text); 48 49 try { 50 for (int i = 1; i < 2; i++) { 51 row = sheet.getRow(1); 52 53 for (int j = 0; j < 4; j++) { 54 cell = row.getCell(j); 55 cell.setCellComment(comment); 56 57 CellType cellType = cell.getCellType(); 58 59 switch (j) { 60 case 0: 61 if (cellType == CellType.STRING) { 62 cell.setCellComment(comment); 63 break; 64 }else { 65 System.out.println("No STRING"); 66 } 67 case 1: 68 if (cellType == CellType.NUMERIC) { 69 cell.setCellComment(comment); 70 break; 71 }else { 72 System.out.println("No NUMERIC"); 73 } 74 case 2: 75 if (cellType == CellType.BOOLEAN) { 76 cell.setCellComment(comment); 77 break; 78 }else { 79 System.out.println("No BOOLEAN"); 80 } 81 case 3: 82 if (cellType == CellType.FORMULA) { 83 cell.setCellComment(comment); 84 break; 85 }else { 86 System.out.println("No FORMULA"); 87 } 88 } 89 } 90 } 91 } catch (Exception e) { 92 System.out.println(e.toString()); 93 } finally { 94 os = new FileOutputStream(new File("C:\work\tech\コメント挿入_チェック済み.xlsx")); 95 wb.write(os); 96 wb.close(); 97 os.close(); 98 System.out.println("処理終了"); 99 } 100 } 101}

試したこと

・エクセルのA2~D2セルにはswitchのセルタイプ条件に合致する値を記述しログには
下記が表示されていることを確認。(swich文内のelseには分岐していないことがわかる)

 コメント挿入開始
処理終了

・swich文の条件は上記の「該当のソースコード」ではSTRING、NUMERIC、BOOLEAN、FOMURAだが
「FOMURAの条件を削除」、「セルの取得をA2~D2→A2~C2までに変更(for (int j = 0; j < 3; j++)に変更)」
し処理を実行したところ、今度はC2セルのみにコメントが付与されていた。以上のことから、A2、B2、C2にはコメントが付与
されてはいるが、次のセルにコメントを付与する度に一つ前のセルに付与されたコメントが消えていると想定できる。

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

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

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

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

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

guest

回答1

0

コードを読んだ限りですが、発生している状況は、多分、以下の通り。
1.Comment comment = patriarch.createCellComment(anchor); で、コメントオブジェクトを作成
2.case 0 のcell.setCellComment(comment); で該当セルにコメントを設定し、コメントオブジェクトに対象セルとして、A2を設定
3.case 1 のcell.setCellComment(comment); で該当セルにコメントを設定し、コメントオブジェクトに対象セルとして、A2を消して、B2を設定
以下略。

なので、Commentをループの中で作成すれば、全部のセルにコメントが付与されるでしょう。

POIのCommentインターフェースドキュメント
int getColumn()とか、単独セルとの結合のみであることを示唆しています。

投稿2020/05/19 02:03

YT0014

総合スコア1750

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

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

tukigami_555

2020/05/21 01:17

YT0014様 おはようございます。tukigamiです。 ご教授いただいた方法でコードを修正→実行しエクセルファイルを開いたところ以下のような問題が生じました。 ネットでエクセルのxmlエラーについて調べても有益な情報が得られず、何か知っていることが あれば教えていただけるとありがたいです。 詳細は以下となっております。 ■問題 ①一部の内容で問題が発生した旨のダイアログが表示 ②内容の回復をするか問われたため「はい」をクリック ③クリック後、以下の文言がダイアログで表示 「削除されたパーツ: /xl/comments1.xml パーツに XML エラーがありました。 (コメント) 致命的なエラーです。場所は、行 2、列 149 です。」 ④修復のログファイルも見れるため表示 「<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><logFileName>error066840_01.xml</logFileName><summary>ファイル 'C:\work\tech\コメント挿入_チェック済み.xlsx' にエラーが検出されました</summary><removedParts><removedPart>削除されたパーツ: /xl/comments1.xml パーツに XML エラーがありました。 (コメント) 致命的なエラーです。場所は、行 2、列 149 です。</removedPart></removedParts></recoveryLog>」 ■試したこと ネットで「エクセル xmlエラー」等で検索を行いましたが有効な情報は得られず ■修正ソース →「該当のソースコード」のswich文内の各caseのみを修正(swich文以外は修正なし) package com.example.demo; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.Comment; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class insertComment { public static void main(String[] args) throws IOException { SpringApplication.run(insertComment.class, args); // サンプルテスト開始 System.out.println("コメント挿入開始"); Row row = null; Cell cell = null; OutputStream os = null; InputStream in = new FileInputStream("C:\work\tech\コメント挿入.xlsx"); Workbook wb = WorkbookFactory.create(in); Sheet sheet = wb.getSheetAt(0); //コメント設定関連 Drawing<?> patriarch = sheet.createDrawingPatriarch(); ClientAnchor anchor = new XSSFClientAnchor(); //Comment comment = patriarch.createCellComment(anchor); CreationHelper creationHelper = wb.getCreationHelper(); RichTextString text = creationHelper.createRichTextString("コメントです。"); //comment.setString(text); try { for (int i = 1; i < 2; i++) { row = sheet.getRow(1); for (int j = 0; j < 4; j++) { cell = row.getCell(j); CellType cellType = cell.getCellType(); switch (j) { case 0: if (cellType == CellType.STRING) { Comment comment0 = patriarch.createCellComment(anchor); cell.setCellComment(comment0); break; }else { System.out.println("No STRING"); } case 1: if (cellType == CellType.NUMERIC) { Comment comment1 = patriarch.createCellComment(anchor); cell.setCellComment(comment1); break; }else { System.out.println("No NUMERIC"); } case 2: if (cellType == CellType.BOOLEAN) { Comment comment2 = patriarch.createCellComment(anchor); cell.setCellComment(comment2); break; }else { System.out.println("No BOOLEAN"); } case 3: if (cellType == CellType.FORMULA) { Comment comment3 = patriarch.createCellComment(anchor); cell.setCellComment(comment3); break; }else { System.out.println("No FORMULA"); } } } } } catch (Exception e) { System.out.println(e.toString()); } finally { os = new FileOutputStream(new File("C:\work\tech\コメント挿入_チェック済み.xlsx")); wb.write(os); wb.close(); os.close(); System.out.println("処理終了"); } } }
YT0014

2020/05/21 06:59

新しくエクセルファイルを作成して、プログラムを実行し、再現するか、ご確認ください。 不具合のあるままの実行が影響していた可能性があります。 再現した場合、修復はせずに、該当ファイルのコピーをZIPとして展開し、該当のXMLファイルを取得して、内容をご確認ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問