前提・実現したいこと
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にはコメントが付与
されてはいるが、次のセルにコメントを付与する度に一つ前のセルに付与されたコメントが消えていると想定できる。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/21 01:17
2020/05/21 06:59