One-liner API for Spreadsheets
List<Product> products = Sheetz.read("data.xlsx", Product.class);
Sheetz.write(products, "output.xlsx");
No Workbook objects. No Cell iteration. No boilerplate. Just data.
Quick Start
Maven
<dependency>
<groupId>io.github.chitralabs.sheetz</groupId>
<artifactId>sheetz-core</artifactId>
<version>1.1.0</version>
</dependency>
Gradle
implementation 'io.github.chitralabs.sheetz:sheetz-core:1.1.0'
Features
| Feature |
Description |
| One-liner API |
Sheetz.read(), Sheetz.write(), Sheetz.stream(), Sheetz.validate() |
| True SAX Streaming |
Constant ~10MB memory for files of any size |
| 19 Auto Converters |
LocalDate, BigDecimal, UUID, Enum, Boolean, and more |
| Thread-Safe |
Safe for concurrent use without synchronization |
| Row-Level Validation |
Per-row errors with column name, value, and root cause |
| @Style Annotation |
Fonts, colors, borders, alignment, hyperlinks, merged cells |
| @Column Annotation |
Map to any header name, index, required, default, format |
| Multi-Sheet Workbook |
Write different model types to different sheets |
| Multi-Format |
XLSX, XLS, CSV, and ODS from one unified API |
| Extensible |
Implement Converter<T> for custom types |
Read & Write
// Read from any format
List<Product> products = Sheetz.read("products.xlsx", Product.class);
List<Product> csvData = Sheetz.read("products.csv", Product.class);
List<Product> odsData = Sheetz.read("products.ods", Product.class);
// Write to any format
Sheetz.write(products, "output.xlsx");
Sheetz.write(products, "output.csv");
Sheetz.write(products, "output.ods");
Annotation Mapping
public class Invoice {
@Column("Invoice #")
public String invoiceNumber;
@Column(required = true)
public String customerId;
@Column(defaultValue = "pending")
public String status;
@Column(format = "dd/MM/yyyy")
public LocalDate dueDate;
@Column(converter = MoneyConverter.class)
public BigDecimal total;
}
Streaming Large Files
Process million-row files with constant ~10MB memory:
try (StreamingReader<Product> reader = Sheetz.stream("huge.xlsx", Product.class)) {
for (Product p : reader) {
database.save(p);
}
}
// Batch processing
Sheetz.stream("huge.xlsx", Product.class)
.batch(1000)
.forEach(batch -> database.bulkInsert(batch));
Cell Styling
@Style Annotation
public class StyledProduct {
@Column("Product Name")
@Style(bold = true, fontColor = "#0000FF")
public String name;
@Style(backgroundColor = "#FFFF00", horizontalAlignment = "CENTER")
public Double price;
@Style(hyperlink = true)
public HyperlinkValue website;
}
Programmatic Styles
CellStyleDef headerStyle = CellStyleBuilder.create()
.bold(true)
.backgroundColor("#003366")
.fontColor("#FFFFFF")
.horizontalAlignment("CENTER")
.build();
Sheetz.writer(Product.class)
.data(products)
.file("styled.xlsx")
.headerStyle(headerStyle)
.autoFilter(true)
.write();
Validation
ValidationResult<Product> result = Sheetz.validate("data.xlsx", Product.class);
System.out.printf("Valid: %d | Errors: %d | Rate: %.1f%%%n",
result.validCount(), result.errorCount(), result.successRate());
result.errors().forEach(error ->
System.out.printf("Row %d [%s]: %s%n",
error.row(), error.column(), error.message()));
Multi-Sheet Workbook
Sheetz.workbook()
.sheet("Products", products)
.sheet("Employees", employees)
.sheet("Orders", orders)
.write("monthly-report.xlsx");
Supported Types
| Type |
Example |
Notes |
String |
Any text |
Trimmed by default |
Integer / Long / Double |
42, 3.14 |
Standard numeric |
BigDecimal |
99.99 |
Precise decimals |
Boolean |
true, yes, 1, on |
Case-insensitive |
LocalDate |
2024-01-15 |
Configurable format |
LocalDateTime |
2024-01-15 10:30:00 |
Configurable format |
UUID |
550e8400-... |
Standard UUID |
Enum |
ACTIVE |
Case-insensitive |
| Custom |
Anything |
Implement Converter<T> |
ODS Support
Add the optional dependency for LibreOffice .ods files:
<dependency>
<groupId>org.odftoolkit</groupId>
<artifactId>odfdom-java</artifactId>
<version>0.12.0</version>
</dependency>
List<Product> products = Sheetz.read("products.ods", Product.class);
Sheetz.write(products, "output.ods");
Resources