Skip to content

Commit dc20e70

Browse files
authored
BAEL-8684: Comparison with HSSFWorkbook, XSSFWorkbook, and SXSSFWorkbook in Apache POI (#17812)
1 parent d556438 commit dc20e70

File tree

3 files changed

+213
-2
lines changed

3 files changed

+213
-2
lines changed

apache-poi-3/pom.xml

+13-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,17 @@
7878
<groupId>ch.qos.logback</groupId>
7979
<artifactId>logback-core</artifactId>
8080
<version>${logback-core.version}</version>
81-
</dependency>
81+
</dependency>
82+
<dependency>
83+
<groupId>org.openjdk.jmh</groupId>
84+
<artifactId>jmh-core</artifactId>
85+
<version>${jmh.version}</version>
86+
</dependency>
87+
<dependency>
88+
<groupId>org.openjdk.jmh</groupId>
89+
<artifactId>jmh-generator-annprocess</artifactId>
90+
<version>${jmh.version}</version>
91+
</dependency>
8292
</dependencies>
8393

8494
<properties>
@@ -90,7 +100,8 @@
90100
<jxl.version>2.6.12</jxl.version>
91101
<poitl.version>1.12.2</poitl.version>
92102
<logback-classic.version>1.5.6</logback-classic.version>
93-
<logback-core.version>1.5.6</logback-core.version>
103+
<logback-core.version>1.5.6</logback-core.version>
104+
<jmh.version>1.37</jmh.version>
94105
</properties>
95106

96107
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package com.baeldung.poi.benchmark;
2+
3+
import java.io.IOException;
4+
import java.util.concurrent.TimeUnit;
5+
6+
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
7+
import org.apache.poi.ss.usermodel.Cell;
8+
import org.apache.poi.ss.usermodel.Row;
9+
import org.apache.poi.ss.usermodel.Sheet;
10+
import org.apache.poi.ss.usermodel.Workbook;
11+
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
12+
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
13+
import org.openjdk.jmh.annotations.*;
14+
import org.openjdk.jmh.infra.Blackhole;
15+
import org.openjdk.jmh.profile.MemPoolProfiler;
16+
import org.openjdk.jmh.runner.Runner;
17+
import org.openjdk.jmh.runner.options.Options;
18+
import org.openjdk.jmh.runner.options.OptionsBuilder;
19+
20+
@State(Scope.Benchmark)
21+
@BenchmarkMode(Mode.AverageTime)
22+
@Warmup(iterations = 1, time = 2)
23+
@Measurement(iterations = 3, time = 1)
24+
@OutputTimeUnit(TimeUnit.MILLISECONDS)
25+
@Fork(value = 1)
26+
public class WorkbookBenchmark
27+
{
28+
29+
@Benchmark
30+
public static void write2500RowsToHSSFWorkbook(Blackhole blackhole) throws IOException {
31+
writeRowsToWorkbook(new HSSFWorkbook(), 2500, blackhole);
32+
}
33+
34+
@Benchmark
35+
public static void write5000RowsToHSSFWorkbook(Blackhole blackhole) throws IOException {
36+
writeRowsToWorkbook(new HSSFWorkbook(), 5000, blackhole);
37+
}
38+
39+
@Benchmark
40+
public static void write10000RowsToHSSFWorkbook(Blackhole blackhole) throws IOException {
41+
writeRowsToWorkbook(new HSSFWorkbook(), 10000, blackhole);
42+
}
43+
44+
@Benchmark
45+
public static void write20000RowsToHSSFWorkbook(Blackhole blackhole) throws IOException {
46+
writeRowsToWorkbook(new HSSFWorkbook(), 20000, blackhole);
47+
}
48+
49+
@Benchmark
50+
public static void write40000RowsToHSSFWorkbook(Blackhole blackhole) throws IOException {
51+
writeRowsToWorkbook(new HSSFWorkbook(), 40000, blackhole);
52+
}
53+
54+
@Benchmark
55+
public static void write2500RowsToXSSFWorkbook(Blackhole blackhole) throws IOException {
56+
writeRowsToWorkbook(new XSSFWorkbook(), 2500, blackhole);
57+
}
58+
59+
@Benchmark
60+
public static void write5000RowsToXSSFWorkbook(Blackhole blackhole) throws IOException {
61+
writeRowsToWorkbook(new XSSFWorkbook(), 5000, blackhole);
62+
}
63+
64+
@Benchmark
65+
public static void write10000RowsToXSSFWorkbook(Blackhole blackhole) throws IOException {
66+
writeRowsToWorkbook(new XSSFWorkbook(), 10000, blackhole);
67+
}
68+
69+
@Benchmark
70+
public static void write20000RowsToXSSFWorkbook(Blackhole blackhole) throws IOException {
71+
writeRowsToWorkbook(new XSSFWorkbook(), 20000, blackhole);
72+
}
73+
74+
@Benchmark
75+
public static void write40000RowsToXSSFWorkbook(Blackhole blackhole) throws IOException {
76+
writeRowsToWorkbook(new XSSFWorkbook(), 40000, blackhole);
77+
}
78+
79+
@Benchmark
80+
public static void write2500RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException {
81+
writeRowsToWorkbook(new SXSSFWorkbook(), 2500, blackhole);
82+
}
83+
84+
@Benchmark
85+
public static void write5000RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException {
86+
writeRowsToWorkbook(new SXSSFWorkbook(), 5000, blackhole);
87+
}
88+
89+
@Benchmark
90+
public static void write10000RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException {
91+
writeRowsToWorkbook(getSXSSFWorkbook(), 10000, blackhole);
92+
}
93+
94+
@Benchmark
95+
public static void write20000RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException {
96+
writeRowsToWorkbook(getSXSSFWorkbook(), 20000, blackhole);
97+
}
98+
99+
@Benchmark
100+
public static void write40000RowsToSXSSFWorkbook(Blackhole blackhole) throws IOException {
101+
writeRowsToWorkbook(getSXSSFWorkbook(), 40000, blackhole);
102+
}
103+
104+
private static SXSSFWorkbook getSXSSFWorkbook() {
105+
SXSSFWorkbook workbook = new SXSSFWorkbook();
106+
workbook.setCompressTempFiles(true);
107+
return workbook;
108+
}
109+
110+
public static void writeRowsToWorkbook(Workbook workbook, int iterations, Blackhole blackhole) throws IOException {
111+
Sheet sheet = workbook.createSheet();
112+
for (int n=0;n<iterations;n++) {
113+
Row row = sheet.createRow(sheet.getLastRowNum()+1);
114+
for (int c=0;c<256;c++) {
115+
Cell cell = row.createCell(c);
116+
cell.setCellValue("abcdefghijklmnopqrstuvwxyz");
117+
}
118+
}
119+
workbook.close();
120+
blackhole.consume(workbook);
121+
}
122+
123+
public static void main(String[] args) throws Exception {
124+
Options options = new OptionsBuilder()
125+
.include(WorkbookBenchmark.class.getSimpleName()).threads(1)
126+
.shouldFailOnError(true)
127+
.shouldDoGC(true)
128+
.addProfiler(MemPoolProfiler.class)
129+
.jvmArgs("-server").build();
130+
new Runner(options).run();
131+
}
132+
133+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.baeldung.poi.benchmark;
2+
3+
import org.apache.poi.ss.usermodel.Cell;
4+
import org.apache.poi.ss.usermodel.FormulaEvaluator;
5+
import org.apache.poi.ss.usermodel.Row;
6+
import org.apache.poi.ss.usermodel.Sheet;
7+
import org.apache.poi.ss.usermodel.Workbook;
8+
import org.apache.poi.xssf.streaming.SXSSFFormulaEvaluator;
9+
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
10+
import org.junit.jupiter.api.AfterEach;
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
14+
import java.io.*;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.junit.jupiter.api.Assertions.*;
18+
19+
class SXSSFWorkbookFunctionTest {
20+
21+
private Workbook workbook;
22+
private Sheet sheet;
23+
24+
@BeforeEach
25+
void setup() {
26+
workbook = new SXSSFWorkbook(1);
27+
sheet = workbook.createSheet("Test Sheet");
28+
sheet.createRow(0).createCell(0).setCellValue(5);
29+
sheet.createRow(1).createCell(0).setCellValue(15);
30+
}
31+
32+
@Test
33+
void whenAutoSizeColumnOnSXSSFWorkbook_thenThrowsIllegalStateException() {
34+
assertThrows(IllegalStateException.class, () -> sheet.autoSizeColumn(0));
35+
}
36+
37+
@Test
38+
void whenCloneSheetOnSXSSFWorkbook_thenThrowsIllegalStateException() {
39+
assertThrows(IllegalStateException.class, () -> workbook.cloneSheet(0));
40+
}
41+
42+
@Test
43+
void whenEvaluateFormulaCellOnSXSSFWorkbook_thenThrowsIllegalStateException() {
44+
Cell formulaCell = sheet.createRow(sheet.getLastRowNum()).createCell(0);
45+
formulaCell.setCellFormula("SUM(A1:B1)");
46+
47+
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
48+
assertThrows(SXSSFFormulaEvaluator.RowFlushedException.class, () -> evaluator.evaluateFormulaCell(formulaCell));
49+
}
50+
51+
@Test
52+
void whenGetRowOnSXSSFWorkbook_thenReturnNull() {
53+
Row row = sheet.getRow(0);
54+
assertThat(row).isNull();
55+
}
56+
57+
@Test
58+
void whenShiftColumnsOnSXSSFWorkbook_thenThrowsUnsupportedOperationException() {
59+
assertThrows(UnsupportedOperationException.class, () -> sheet.shiftColumns(0, 2, 1));
60+
}
61+
62+
@AfterEach
63+
void cleanUp() throws IOException {
64+
workbook.close();
65+
}
66+
67+
}

0 commit comments

Comments
 (0)