# apache-poi
> Apache POI for Excel file manipulation in Java applications.
USE WHEN: user mentions "Apache POI", "Excel generation", asks about "Java Excel", "XLSX export", "Excel import", "POI workbook", "spreadsheet generation"
DO NOT USE FOR: CSV files - use OpenCSV or standard Java CSV libraries
- Author: mariepellegrino89
- Repository: claude-dev-suite/claude-dev-suite
- Version: 20260206202537
- Stars: 0
- Forks: 0
- Last Updated: 2026-02-06
- Source: https://github.com/claude-dev-suite/claude-dev-suite
- Web: https://mule.run/skillshub/@@claude-dev-suite/claude-dev-suite~apache-poi:20260206202537
---
---
name: apache-poi
description: |
Apache POI for Excel file manipulation in Java applications.
USE WHEN: user mentions "Apache POI", "Excel generation", asks about "Java Excel", "XLSX export", "Excel import", "POI workbook", "spreadsheet generation"
DO NOT USE FOR: CSV files - use OpenCSV or standard Java CSV libraries
allowed-tools: Read, Grep, Glob, Write, Edit
---
# Apache POI - Quick Reference
## When NOT to Use This Skill
- **CSV files** - Use OpenCSV, Apache Commons CSV, or `Files.lines()` for CSV
- **PDF generation** - Use Apache PDFBox or iText instead
- **Large Excel files (> 100k rows)** - Use `SXSSFWorkbook` or consider CSV export
- **Excel formulas/macros** - POI has limited macro support; consider VBA alternatives
- **Real-time Excel editing** - POI is for generation/parsing, not collaborative editing
> **Deep Knowledge**: Use `mcp__documentation__fetch_docs` with technology: `apache-poi` for comprehensive API documentation, advanced formatting, and formula handling.
## Pattern Essenziali
### Maven
```xml
org.apache.poi
poi-ooxml
5.2.5
```
### Create Excel
```java
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("john@email.com");
// Auto-size
sheet.autoSizeColumn(0);
sheet.autoSizeColumn(1);
// Write
workbook.write(new FileOutputStream("output.xlsx"));
}
```
### Export Service
```java
@Service
public class ExportService {
public byte[] exportToExcel(List 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 Download Endpoint
```java
@GetMapping("/export")
public ResponseEntity 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);
}
```
## Cell Styles
```java
CellStyle headerStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
headerStyle.setFont(font);
cell.setCellStyle(headerStyle);
```
## Anti-Patterns
| Anti-Pattern | Why It's Wrong | Correct Approach |
|-------------|----------------|------------------|
| Not closing workbook | Memory leak, file locks | Use try-with-resources: `try (Workbook wb = new XSSFWorkbook())` |
| Creating styles in loops | Workbook has max 64,000 styles limit | Create styles once, reuse across cells |
| Using `XSSFWorkbook` for large files | OutOfMemoryError for > 100k rows | Use `SXSSFWorkbook` for streaming writes |
| Reading entire file into memory | Memory exhaustion on large files | Use event-based parsing (SAX) for reading |
| Not setting cell types | Data interpreted incorrectly | Explicitly set cell type: `cell.setCellType(CellType.NUMERIC)` |
| Using `autoSizeColumn()` for every column | Very slow, especially with many rows | Manually set widths or use sparingly |
| Hardcoding column indices | Brittle, breaks on column changes | Use constants or column name maps |
| Generating Excel for large datasets | Excel has 1M row limit, slow | Consider CSV or database export instead |
## Quick Troubleshooting
| Issue | Diagnosis | Solution |
|-------|-----------|----------|
| `OutOfMemoryError` on large Excel | Using `XSSFWorkbook`, all data in memory | Switch to `SXSSFWorkbook` for streaming |
| `IllegalStateException: Cannot get a STRING value from a NUMERIC cell` | Wrong cell type getter | Check type with `cell.getCellType()` before reading |
| File corrupted after generation | Workbook not closed properly | Use try-with-resources or explicitly call `wb.close()` |
| Styles not applying | Exceeding 64,000 style limit | Reuse CellStyle objects, don't create in loops |
| Numbers displayed as text in Excel | Cell type not set | Use `cell.setCellType(CellType.NUMERIC)` and set value as number |
| Formula not calculating | Formula mode not set | Use `cell.setCellFormula("SUM(A1:A10)")` or force recalc |
| Very slow generation | `autoSizeColumn()` on large sheets | Remove or call only on critical columns |
| Date formatting incorrect | Default format not desired | Create date CellStyle with custom format |
## Related Skills
- [Spring Boot](../../backend-frameworks/spring-boot/SKILL.md)
- [Java](../../languages/java/SKILL.md)
## References
- [Apache POI Official Docs](https://poi.apache.org/)