apache-poi について
apache-poiは、Apache POIでExcelワークブックを読み書きするJava開発者向けのクイックリファレンススキルです。実用的な処理例、リソースとメモリの管理、表計算に関する一般的な問題の調査を扱います。
主な機能
- 01Excelワークブックの作成と出力
- 02セルスタイルの再利用
- 03大規模ワークブックのストリーミング書き込み
- 04イベントベースの大容量ファイル読み取り
- 05ExcelとPOIの一般的なエラー診断
活用シーン
- 01アプリケーションデータからExcelを生成
- 02RESTエンドポイントでワークブックを配信
- 03メモリ使用量を抑えた大規模表の処理
- 04セルの型や書式の問題解決
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill apache-poiインストール後、Claude Code で/apache-poiを入力して読み込まれたか確認します。
詳細
Apache POI - クイックリファレンス
このスキルを使用しない場合
- CSV ファイル - CSV には OpenCSV、Apache Commons CSV、または
Files.lines()を使用してください - PDF の生成 - 代わりに Apache PDFBox または iText を使用してください
- 大きな Excel ファイル(100k 行超) -
SXSSFWorkbookを使用するか、CSV へのエクスポートを検討してください - Excel の数式/マクロ - POI のマクロサポートは限定的です。VBA の代替手段を検討してください
- リアルタイムの Excel 編集 - POI は生成/解析向けであり、共同編集には対応していません
詳細情報: 包括的な API ドキュメント、高度な書式設定、数式の処理については、technology:
apache-poiを指定してmcp__documentation__fetch_docsを使用してください。
基本パターン
Maven
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version>
</dependency>
Excel の作成
try (Workbook workbook = new XSSFWorkbook()) {
Sheet sheet = workbook.createSheet("Data");
// Header
Row header = sheet.createRow(0);
header.createCell(0).setCellValue("Name");
header.createCell(1).setCellValue("Email");
// Data
Row row = sheet.createRow(1);
row.createCell(0).setCellValue("John");
row.createCell(1).setCellValue("[email protected]");
// Auto-size
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
// Write
workbook.write(new FileOutputStream("output.xlsx"));
}
エクスポートサービス
@Service
public class ExportService {
public byte[] exportToExcel(List<User> users) throws IOException {
try (Workbook wb = new XSSFWorkbook();
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
Sheet sheet = wb.createSheet("Users");
// ... populate rows
wb.write(out);
return out.toByteArray();
}
}
}
REST ダウンロードエンドポイント
@GetMapping("/export")
public ResponseEntity<byte[]> export() throws IOException {
byte[] data = exportService.exportToExcel(users);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=data.xlsx")
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(data);
}
セルのスタイル
CellStyle headerStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
headerStyle.setFont(font);
cell.setCellStyle(headerStyle);
アンチパターン
| アンチパターン | 問題点 | 正しい方法 |
|---|---|---|
| ワークブックを閉じない | メモリーリーク、ファイルロック | try-with-resources を使用します:try (Workbook wb = new XSSFWorkbook()) |
| ループ内でスタイルを作成する | ワークブックのスタイル数は最大 64,000 個です | スタイルは一度だけ作成し、セル間で再利用します |
大きなファイルに XSSFWorkbook を使用する | 100k 行を超えると OutOfMemoryError が発生します | ストリーミング書き込みには SXSSFWorkbook を使用します |
| ファイル全体をメモリーに読み込む | 大きなファイルではメモリーが枯渇します | 読み込みにはイベントベースの解析(SAX)を使用します |
| セルの型を設定しない | データが正しく解釈されません | セルの型を明示的に設定します:cell.setCellType(CellType.NUMERIC) |
すべての列に autoSizeColumn() を使用する | 特に行数が多い場合、非常に遅くなります | 幅を手動で設定するか、使用を最小限にします |
| 列インデックスをハードコードする | 変更に弱く、列の変更で壊れます | 定数または列名のマップを使用します |
| 大規模なデータセットを Excel に出力する | Excel には 100 万行の上限があり、処理も遅くなります | 代わりに CSV またはデータベースへのエクスポートを検討してください |
よくある問題の解決方法
| 問題 | 原因 | 解決策 |
|---|---|---|
大きな Excel ファイルで OutOfMemoryError が発生する | XSSFWorkbook を使用しているため、すべてのデータがメモリーに読み込まれています | ストリーミングには SXSSFWorkbook に切り替えます |
IllegalStateException: Cannot get a STRING value from a NUMERIC cell | セルの型に合わない取得メソッドを使用しています | 読み込み前に cell.getCellType() で型を確認します |
| 生成後にファイルが破損する | ワークブックが正しく閉じられていません | try-with-resources を使用するか、wb.close() を明示的に呼び出します |
| スタイルが適用されない | 64,000 個のスタイル上限を超えています | CellStyle オブジェクトを再利用し、ループ内で作成しないでください |
| Excel で数値がテキストとして表示される | セルの型が設定されていません | cell.setCellType(CellType.NUMERIC) を使用し、数値として値を設定します |
| 数式が計算されない | 数式モードが設定されていません | cell.setCellFormula("SUM(A1:A10)") を使用するか、再計算を強制します |
| 生成が非常に遅い | 大きなシートで autoSizeColumn() を使用しています | 削除するか、重要な列にのみ呼び出します |
| 日付の書式が正しくない | 既定の書式が適していません | カスタム書式を指定した日付用 CellStyle を作成します |
関連スキル
参考資料
コメント
Markdown 対応