package com.ruoyi.inspect.util; import com.ruoyi.inspect.pojo.SealUsageLedger; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.TableRowAlign; import org.apache.poi.xwpf.usermodel.TextAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageSz; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr; import java.io.IOException; import java.io.OutputStream; import java.math.BigInteger; import java.time.format.DateTimeFormatter; import java.util.List; public final class SealUsageLedgerWordExporter { private static final String[] HEADERS = {"日期", "印章名称", "检测项目名称", "报告编号", "份数", "用印人签字"}; private static final int[] WIDTHS = {1200, 2300, 1800, 1900, 800, 1400}; private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy.MM.dd"); private SealUsageLedgerWordExporter() { } public static void write(List ledgers, OutputStream outputStream) throws IOException { try (XWPFDocument document = new XWPFDocument()) { configurePage(document); addTitle(document); XWPFTable table = document.createTable(ledgers.size() + 1, HEADERS.length); table.setStyleID("TableGrid"); table.setTableAlignment(TableRowAlign.CENTER); table.setWidth("100%"); XWPFTableRow header = table.getRow(0); header.setRepeatHeader(true); header.setHeight(620); for (int col = 0; col < HEADERS.length; col++) { formatCell(header.getCell(col), HEADERS[col], true, WIDTHS[col]); } for (int index = 0; index < ledgers.size(); index++) { SealUsageLedger ledger = ledgers.get(index); XWPFTableRow row = table.getRow(index + 1); row.setHeight(780); formatCell(row.getCell(0), ledger.getUseTime().format(DATE_FORMAT), false, WIDTHS[0]); formatCell(row.getCell(1), lineBreakSeals(ledger.getSealNames()), false, WIDTHS[1]); formatCell(row.getCell(2), ledger.getProjectName(), false, WIDTHS[2]); formatCell(row.getCell(3), ledger.getReportCode(), false, WIDTHS[3]); formatCell(row.getCell(4), String.valueOf(ledger.getCopies()), false, WIDTHS[4]); formatCell(row.getCell(5), ledger.getUseUserName(), false, WIDTHS[5]); } document.write(outputStream); } } private static void configurePage(XWPFDocument document) { CTSectPr section = document.getDocument().getBody().addNewSectPr(); CTPageSz pageSize = section.addNewPgSz(); pageSize.setW(BigInteger.valueOf(11906)); pageSize.setH(BigInteger.valueOf(16838)); CTPageMar margin = section.addNewPgMar(); margin.setTop(BigInteger.valueOf(1134)); margin.setBottom(BigInteger.valueOf(1134)); margin.setLeft(BigInteger.valueOf(850)); margin.setRight(BigInteger.valueOf(850)); } private static void addTitle(XWPFDocument document) { XWPFParagraph paragraph = document.createParagraph(); paragraph.setAlignment(ParagraphAlignment.CENTER); paragraph.setSpacingAfter(220); XWPFRun run = paragraph.createRun(); run.setText("印章使用登记表"); run.setBold(true); run.setFontFamily("宋体"); run.setFontSize(20); } private static void formatCell(XWPFTableCell cell, String text, boolean header, int width) { cell.setWidth(String.valueOf(width)); cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); XWPFParagraph paragraph = cell.getParagraphs().get(0); paragraph.setAlignment(ParagraphAlignment.CENTER); paragraph.setVerticalAlignment(TextAlignment.CENTER); paragraph.setSpacingBefore(0); paragraph.setSpacingAfter(0); XWPFRun run = paragraph.createRun(); String[] lines = safe(text).split("\\n", -1); for (int i = 0; i < lines.length; i++) { if (i > 0) { run.addBreak(); } run.setText(lines[i]); } run.setBold(header); run.setFontFamily("宋体"); run.setFontSize(header ? 12 : 11); } private static String lineBreakSeals(String names) { return safe(names).replace(",", "\n").replace(",", "\n"); } private static String safe(String value) { return value == null ? "" : value; } }