ExcelBuilder.java

package no.nav.data.common.export;

import no.nav.data.common.exceptions.TechnicalException;
import org.docx4j.openpackaging.packages.SpreadsheetMLPackage;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.SpreadsheetML.WorksheetPart;
import org.xlsx4j.jaxb.Context;
import org.xlsx4j.sml.CTRst;
import org.xlsx4j.sml.CTXstringWhitespace;
import org.xlsx4j.sml.ObjectFactory;
import org.xlsx4j.sml.STCellType;

import java.io.ByteArrayOutputStream;

public class ExcelBuilder {

    public static final String SPREADSHEETML_SHEET_MIME = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    private static final ObjectFactory fac = Context.getsmlObjectFactory();

    private final SpreadsheetMLPackage pack;
    private final WorksheetPart sheet;

    long rowN = 0;

    public ExcelBuilder(String sheetName) {
        try {
            pack = SpreadsheetMLPackage.createPackage();
            sheet = pack.createWorksheetPart(new PartName("/xl/worksheets/sheet1.xml"), sheetName, 1);
        } catch (Exception e) {
            throw new TechnicalException("excel error", e);
        }
    }

    public ExcelRow addRow() {
        return new ExcelRow();
    }

    public class ExcelRow {

        org.xlsx4j.sml.Row row = fac.createRow();
        char col = 'A';

        public ExcelRow() {
            row.setR(++rowN);
            sheet.getJaxbElement().getSheetData().getRow().add(row);
        }

        public ExcelRow addCell(String content) {
            var cell = fac.createCell();

            CTXstringWhitespace t = fac.createCTXstringWhitespace();
            t.setValue(content);
            CTRst ctRst = fac.createCTRst();
            ctRst.setT(t);

            cell.setIs(ctRst);
            cell.setR("%s%s".formatted(col++, rowN));
            cell.setT(STCellType.INLINE_STR);
            row.getC().add(cell);
            return this;
        }

        public ExcelRow addCell(Number number) {
            var cell = fac.createCell();

            cell.setV(number != null ? String.valueOf(number) : "");
            cell.setR("%s%s".formatted(col++, rowN));
            cell.setT(STCellType.N);
            row.getC().add(cell);
            return this;
        }

    }

    public byte[] build() {
        try {
            var outStream = new ByteArrayOutputStream();
            pack.save(outStream);
            return outStream.toByteArray();
        } catch (Exception e) {
            throw new TechnicalException("excel error", e);
        }
    }
}