<!-- https://mvnrepository.com/artifact/org.jxls/jxls-poi -->
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>3.0.0</version>
</dependency>
メジャーバージョンが3に上がり、Javaコードを殆ど書き直すことになったため、そのメモを残す。
参考URL:https://jxls.sourceforge.net/migration-to-v3-0.html
Jxls 2
ほぼ全てが変わったので、比較対象にならないが、変更前のコードは下記の通りとなっている。
import org.jxls.area.Area;
import org.jxls.builder.AreaBuilder;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.CellRef;
import org.jxls.common.Context;
import org.jxls.util.TransformerFactory;
// 出力部分抜粋
try (InputStream is = getTemplateSource(getUrl(), request);
OutputStream os = response.getOutputStream()) {
var transformer = TransformerFactory.createTransformer(is, os);
AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
List<Area> xlsAreaList = areaBuilder.build();
var xlsArea = xlsAreaList.get(0);
var context = new Context();
model.entrySet().forEach(mode -> context.putVar(mode.getKey(), mode.getValue()));
xlsArea.applyAt(new CellRef("Sheet1!A1"), context);
transformer.write();
}
※getTemplateSourceはテンプレート用のエクセルファイルを読み込んでいるメソッド。
Jxls 3
Java部分は下記の通りかなりシンプルになった。テンプレートファイル自体は変更の必要はなかった。
import org.jxls.builder.JxlsStreaming;
import org.jxls.transform.poi.JxlsPoiTemplateFillerBuilder;
// 出力部分抜粋
try (InputStream is = getTemplateSource(getUrl(), request);
OutputStream os = response.getOutputStream()) {
JxlsPoiTemplateFillerBuilder.newInstance()
.withStreaming(JxlsStreaming.STREAMING_ON)
.withTemplate(is)
.buildAndFill(model, new JxlsOutputStream(os));
}
ファイル出力用のクラスはファイルをローカルに保存するJxlsOutputFile.classのみ提供されているため、必要に応じて自分で実装する。今回はHttpResponseのOutputStreamに直接乗せたかったので、下記の通り実装した。
import java.io.IOException;
import java.io.OutputStream;
import org.jxls.builder.JxlsOutput;
/**
* Excelを書き込むためのOutputStreamを提供するクラス.
*/
public class JxlsOutputStream implements JxlsOutput {
private OutputStream os;
public JxlsOutputStream(OutputStream os) {
this.os = os;
}
/**
* {@inheritDoc}
*/
@Override
public OutputStream getOutputStream() throws IOException {
return os;
}
}