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<SealUsageLedger> 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;
|
}
|
}
|