package com.ruben.utils.coreUtils;
import cn.hutool.core.date.DateUtil; import com.ruben.utils.FileUtils; import com.ruben.utils.StringKit; import com.ruben.utils.StringUtils; import com.ruben.utils.collection.MapUtil; import com.spire.doc.*; import com.spire.doc.collections.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; import com.spire.doc.formatting.CharacterFormat; import com.spire.doc.formatting.ParagraphFormat; import lombok.extern.slf4j.Slf4j;
import java.io.*; import java.net.URLEncoder; import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Pattern;
@Slf4j public class WordCoreUtils {
public static final String CHECKED = "■"; public static final String NO_CHECK = "□"; public static final String ENCLOSURE = "☼"; public static final String DATE_TIME_PATTERN_UTC = "yyyy-MM-dd'T'HH:mm:ss.sss'Z'"; private static final ThreadLocal<DateFormat> DATE_FORMAT_THREAD_LOCAL = ThreadLocal.withInitial(() -> new SimpleDateFormat(DATE_TIME_PATTERN_UTC));
public static void check(Document doc, String bookmarkName) { check(doc, bookmarkName, "", true); }
public static void check(Document doc, String bookmarkName, String text, boolean checked) { if (checked) {
text = CHECKED + text; } else { text = NO_CHECK + text; } BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(doc); bookmarkNavigator.moveToBookmark(bookmarkName); Paragraph para = new Paragraph(doc); TextRange textRange = para.appendText(text); CharacterFormat format = textRange.getCharacterFormat(); if (checked) {
format.setFontSize(15); } else { format.setFontSize(9); } TextBodyPart bodyPart = new TextBodyPart(doc); bodyPart.getBodyItems().add(para); try { bookmarkNavigator.replaceBookmarkContent(bodyPart); } catch (Exception e) { log.error("书签《" + bookmarkName + "》丢失", e); } }
public static void check(Document doc, Set<String> set) { set.forEach(s -> check(doc, s)); }
public static void check(boolean condition, Document doc, String bookmarkName) { if (!condition) { return; } check(doc, bookmarkName); }
public static void fillText(Document doc, String bookmarkName, String content) { fillText(doc, bookmarkName, content, Boolean.TRUE); }
public static void fillText(boolean condition, Document doc, String bookmarkName, String content) { if (!condition) { return; } fillText(doc, bookmarkName, content); }
public static final Pattern HTML_PATTERN = Pattern.compile("<.+?>");
public static void copyTable(Table table, int start, int rows) { int end = start + rows; for (int j = start; j < end; j++) { TableRow row = table.getRows().get(j).deepClone(); table.getRows().insert(j + rows, row); } }
public static void deepClone(boolean needCopy, TableRow tableRow) { if (!needCopy) { return; } tableRow = tableRow.deepClone(); }
public static void insertRow(boolean needCopy, Table table, int start, int rows, TableRow tableRow) { if (!needCopy) { return; } table.getRows().insert(start + rows, tableRow); }
public static void fillTableCell(boolean needCopy, TableCell tableCell, String value) { if (!needCopy) { for (int i = 0; i < tableCell.getParagraphs().getCount(); i++) { tableCell.getParagraphs().removeAt(i); } } tableCell.addParagraph().appendText(value); }
public static void appendCheck(boolean checked, Paragraph para) { if (checked) { TextRange textRange = para.appendText("\uF052"); CharacterFormat format = textRange.getCharacterFormat(); format.setFontName("Wingdings 2"); format.setFontSize(9); } else { para.appendText(NO_CHECK); } }
public static Document mergeBigTable(Document... documents) { return mergeAddSectionTable(null, documents); }
public static void fillOnlyText(Document doc, String bookmarkName, String v) { fillText(doc, bookmarkName, v, Boolean.FALSE); }
public static void fillOnlyText(boolean condition, Document doc, String bookmarkName, String v) { if (!condition) { return; } fillText(doc, bookmarkName, v, Boolean.FALSE); }
public static void fillDate(Document doc, Date date, String yearBookmark, String monthBookmark, String dayBookmark) { if (Objects.isNull(date)) { return; } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); WordCoreUtils.fillOnlyText(doc, yearBookmark, String.valueOf(calendar.get(Calendar.YEAR))); WordCoreUtils.fillOnlyText(doc, monthBookmark, String.valueOf(calendar.get(Calendar.MONTH) + 1)); WordCoreUtils.fillOnlyText(doc, dayBookmark, String.valueOf(calendar.get(Calendar.DATE))); }
public static void checkBox(Document doc, Map<String, String> map, String value) { map.forEach((k, v) -> check(value.contains(v), doc, k)); }
public static void fillOnlyText(Document doc, Map<String, String> normalMap) { if (MapUtil.isEmpty(normalMap)) { return; } normalMap.forEach((k, v) -> fillOnlyText(StringKit.isNotBlank(v), doc, k, v)); }
public static void fillText(Document doc, Map<String, String> underLineMap) { if (MapUtil.isEmpty(underLineMap)) { return; } underLineMap.forEach((k, v) -> fillText(StringKit.isNotBlank(v), doc, k, v)); }
public static Document mergeAutoFitTable(AutoFitBehaviorType autoFit, Document... documents) { Document result = new Document(); Section section = Optional.ofNullable(result.getLastSection()).orElse(result.addSection()); TableCollection tableCollection = section.getTables(); int count = tableCollection.getCount(); Table table = count > 0 ? tableCollection.get(count - 1) : section.addTable(true); for (int i = 0; i < documents.length; i++) { SectionCollection sections = documents[i].getSections(); TableCollection tables = sections.get(0).getTables(); RowCollection rows = tables.get(0).getRows(); for (int j = 0; j < rows.getCount(); j++) { table.getRows().add(rows.get(j).deepClone()); } if (Objects.nonNull(autoFit)) { table.autoFit(autoFit); } } return result; }
public static Document mergeSectionsTable(AutoFitBehaviorType autoFit, Document... documents) { Document result = new Document(); for (Document document : documents) { Section section = Optional.ofNullable(result.getLastSection()).orElse(result.addSection()); Table table = section.getTables().getCount() == 0 ? section.addTable(true) : section.getTables().get(section.getTables().getCount() - 1); SectionCollection sections = document.getSections(); for (int k = 0; k < sections.getCount(); k++) { TableCollection tables = sections.get(k).getTables(); Table currentTable = tables.get(0); RowCollection rows = currentTable.getRows(); for (int j = 0; j < rows.getCount(); j++) { TableRow row = rows.get(j).deepClone(); onePageShow(row); table.getRows().add(row); } } if (Objects.nonNull(autoFit)) { table.autoFit(autoFit); } } return result; }
private static void onePageShow(TableRow row) { CellCollection cells = row.getCells(); for (int i = 0; i < cells.getCount(); i++) { ParagraphCollection paragraphs = cells.get(i).getParagraphs(); for (int l = 0; l < paragraphs.getCount(); l++) { ParagraphFormat format = paragraphs.get(l).getFormat(); format.setKeepFollow(true); } } }
public static Document mergeSectionsTable(Document... documents) { return mergeSectionsTable(AutoFitBehaviorType.Auto_Fit_To_Window, documents); }
public static void fillTexts(Document doc, String bookmarkName, String value, int lines) { if (StringKit.isEmpty(value)) { return; } StringBuilder valueBuilder = new StringBuilder(" " + value); while (valueBuilder.length() < 47) { valueBuilder.append(" "); } while (valueBuilder.length() < 86 * lines) { valueBuilder.append("\n "); } value = valueBuilder.toString(); fillText(doc, bookmarkName, value); }
public static void fillTextOneLine(Document doc, Map<String, String> underlineMap) { if (underlineMap.isEmpty()) { return; } underlineMap.forEach((bookmarkName, value) -> { StringBuilder valueBuilder = new StringBuilder(" " + value); while (valueBuilder.length() < 53) { valueBuilder.append(" "); } value = valueBuilder.toString(); fillText(doc, bookmarkName, value); }); }
public static Document concatWord(Document... documents) { Document result = new Document(); for (Document document : documents) { Section addSection = result.addSection(); for (Section section : (Iterable<Section>) document.getSections()) { for (DocumentObject obj : (Iterable<DocumentObject>) section.getBody().getChildObjects()) { addSection.getBody().getChildObjects().add(obj.deepClone()); } } } return result; }
public static void picture(Document doc, String bookmarkName, String filePath) { if (StringKit.isBlank(filePath)) { return; } try { filePath = filePath.replace("程序附件", URLEncoder.encode("程序附件", "utf-8")); BookmarksNavigator bookmarksNavigator1 = new BookmarksNavigator(doc); bookmarksNavigator1.moveToBookmark(bookmarkName, true, false); Paragraph para = new Paragraph(doc); byte[] bytes = FileUtils.loadPicture(filePath); if (Objects.isNull(bytes)) { log.error("图片无法加载"); return; } DocPicture picture = para.appendPicture(bytes); picture.setWidth(100f); picture.setHeight(100f); picture.setDistanceLeft(50f); try { bookmarksNavigator1.insertParagraph(para); } catch (NullPointerException e) { log.error("书签《" + bookmarkName + "》丢失", e); } para.getFormat().setHorizontalAlignment(HorizontalAlignment.Center); } catch (Exception e) { log.error("错误", e); } }
public static void setTableAutoFit(AutoFitBehaviorType autoFitType, Document doc) { SectionCollection sections = doc.getSections(); for (int i = 0; i < sections.getCount(); i++) { TableCollection tables = sections.get(i).getTables(); for (int j = 0; j < tables.getCount(); j++) { tables.get(j).autoFit(autoFitType); } } }
public static void setTableIsBreakAcrossPages(boolean isBreakAcrossPages, Document doc) { SectionCollection sections = doc.getSections(); for (int i = 0; i < sections.getCount(); i++) { TableCollection tables = sections.get(i).getTables(); for (int j = 0; j < tables.getCount(); j++) { tables.get(j).getTableFormat().isBreakAcrossPages(isBreakAcrossPages); } } }
public static void applyVerticalMerge(Document doc, int cells, int startRows, int endRows) { SectionCollection sections = doc.getSections(); for (int i = 0; i < sections.getCount(); i++) { TableCollection tables = sections.get(i).getTables(); for (int j = 0; j < tables.getCount(); j++) { tables.get(j).applyVerticalMerge(cells, startRows, endRows); } } }
public static void fillEnclosure(boolean condition, Document doc, String bookmarkName) { if (!condition) { return; } fillEnclosure(doc, bookmarkName); }
public static void fillEnclosure(String file, Document doc, String bookmarkName, String enclosureMark) { if (StringKit.isBlank(file)) { return; } BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(doc); bookmarkNavigator.moveToBookmark(bookmarkName); Paragraph para = new Paragraph(doc); TextRange textRange = para.appendText(enclosureMark); CharacterFormat format = textRange.getCharacterFormat(); format.setFontName("Segoe UI Symbol"); format.setFontSize(9); TextBodyPart bodyPart = new TextBodyPart(doc); bodyPart.getBodyItems().add(para); try { bookmarkNavigator.replaceBookmarkContent(bodyPart); } catch (Exception e) { log.error("书签《" + bookmarkName + "》丢失", e); } }
public static void fillEnclosure(String file, Document doc, String bookmarkName) { if (StringKit.isEmpty(file)) { return; } fillEnclosure(doc, bookmarkName); }
public static void fillEnclosure(Document doc, String bookmarkName) { fillEnclosure(WordCoreUtils.CHECKED, doc, bookmarkName, WordCoreUtils.ENCLOSURE); }
public static void fillReplaceHtml(Document doc, String bookmarkName, String data) { BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(doc); bookmarkNavigator.moveToBookmark(bookmarkName); Paragraph para = new Paragraph(doc); TextRange textRange = para.appendText(StringUtils.replaceHtml(data)); CharacterFormat format = textRange.getCharacterFormat(); format.setFontSize(9); TextBodyPart bodyPart = new TextBodyPart(doc); bodyPart.getBodyItems().add(para); try { bookmarkNavigator.replaceBookmarkContent(bodyPart); } catch (Exception e) { log.error("书签《" + bookmarkName + "》丢失", e); } }
public static void fillText(Document doc, String bookmarkName, String content, boolean underline) { if (StringKit.isBlank(content)) { return; } BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(doc); bookmarkNavigator.moveToBookmark(bookmarkName); Paragraph para = new Paragraph(doc); TextRange textRange = para.appendText(StringUtils.replaceHtml(content)); CharacterFormat format = textRange.getCharacterFormat(); if (underline) {
} format.setFontSize(9); format.setFontName("宋体"); TextBodyPart bodyPart = new TextBodyPart(doc); bodyPart.getBodyItems().add(para); try { bookmarkNavigator.replaceBookmarkContent(bodyPart); } catch (NullPointerException e) { log.error("书签《" + bookmarkName + "》丢失", e); } }
public static void fillHtml(Document doc, String bookmarkName, String htmlStr) { if (StringKit.isBlank(htmlStr)) { return; } htmlStr = htmlStr.replaceAll("<[/]*p[ ]*>\\\\+[A-Za-z]", "</br>") .replaceAll("\t", "") .replaceAll("\n", "") .replaceAll(" ", " ") .replaceAll("<[/]*p[ ]*>", ""); if (!HTML_PATTERN.matcher(htmlStr).matches()) { fillOnlyText(doc, bookmarkName, htmlStr); return; } BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(doc); bookmarksNavigator.moveToBookmark(bookmarkName, true, false); Paragraph para = doc.addSection().addParagraph(); para.appendHTML("<span style=\\\"font-family:'宋体'\\\">" + htmlStr + "</span>"); try { bookmarksNavigator.insertParagraph(para); } catch (NullPointerException e) { log.error("书签《" + bookmarkName + "》丢失", e); } }
private static void fillLocalImage(byte[] bytes, Document doc, String bookmarkName, float width, float height) { if (Objects.isNull(bytes)) { return; } BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(doc); bookmarksNavigator.moveToBookmark(bookmarkName, true, false); Paragraph para = new Paragraph(doc); DocPicture picture = para.appendPicture(bytes); if (picture.getHeightScale() > width) { picture.setWidth(width); } if (picture.getHeightScale() > height) { picture.setHeight(height); }
try { bookmarksNavigator.insertParagraph(para); } catch (NullPointerException e) { log.error("书签《" + bookmarkName + "》丢失", e); } }
private static byte[] loadLocalImgToByteArray(String picturePath) { InputStream dataInputStream = null; ByteArrayOutputStream output = null; byte[] result = new byte[0]; try { dataInputStream = new FileInputStream(picturePath); output = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = dataInputStream.read(buffer)) > 0) { output.write(buffer, 0, length); } result = output.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (dataInputStream != null) { dataInputStream.close(); } if (output != null) { output.close(); } } catch (IOException e) { e.printStackTrace(); } } File file = new File(picturePath); if (file.exists()) { file.delete(); } return result; }
public static void fillDateStr(Document doc, String bookmarkName, String time) { if (StringKit.isEmpty(time)) { return; } String chineseDate; try { chineseDate = DateUtil.formatChineseDate(DateUtil.parse(time).toJdkDate(), false); } catch (Exception e) { chineseDate = DateUtil.formatChineseDate(DATE_FORMAT_THREAD_LOCAL.get().parse(time, new ParsePosition(0)), false); } fillOnlyText(doc, bookmarkName, chineseDate); }
public static Document mergeAddSectionTable(AutoFitBehaviorType autoFit, Document... documents) { Document result = new Document(); for (int i = 0; i < documents.length; i++) { Section section = Optional.ofNullable(result.getLastSection()).orElse(result.addSection()); section.setBreakCode(SectionBreakType.No_Break); Table table = section.addTable(true); SectionCollection sections = documents[i].getSections(); Section section1 = sections.getCount() == 0 ? documents[i].addSection() : sections.get(0); TableCollection tables = section1.getTables(); RowCollection rows = (tables.getCount() == 0 ? section1.addTable() : tables.get(0)).getRows(); for (int j = 0; j < rows.getCount(); j++) { TableRow row = rows.get(j).deepClone(); onePageShow(row); table.getRows().add(row); } if (Objects.nonNull(autoFit)) { table.autoFit(autoFit); } } return result; }
public static void printTable(Document document) { SectionCollection sections = document.getSections(); for (int i = 0; i < sections.getCount(); i++) { System.out.print("section:" + i + " "); TableCollection tables = sections.get(i).getTables(); for (int j = 0; j < tables.getCount(); j++) { System.out.print("table:" + j + " "); RowCollection rows = tables.get(j).getRows(); for (int k = 0; k < rows.getCount(); k++) { System.out.print("row:" + k + " "); CellCollection cells = rows.get(k).getCells(); for (int l = 0; l < cells.getCount(); l++) { System.out.print("cell:" + l + " "); TableCell tableCell = cells.get(l); ParagraphCollection paras = tableCell.getParagraphs(); for (int m = 0; m < paras.getCount(); m++) { System.out.print("para:" + m + " "); System.out.print(paras.get(m).getText() + " "); } System.out.print("\t"); } System.out.println(); } } } }
public static void fillHalfDownText(boolean needDown, Document doc, String bookmarkName, String content) { if (StringKit.isBlank(content)) { return; } BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(doc); bookmarkNavigator.moveToBookmark(bookmarkName); Paragraph para = new Paragraph(doc); TextRange textRange = para.appendText(needDown ? ("\n" + content) : StringUtils.replaceHtml(content)); CharacterFormat format = textRange.getCharacterFormat(); format.setFontName("Segoe UI Symbol"); format.setFontSize(9); TextBodyPart bodyPart = new TextBodyPart(doc); bodyPart.getBodyItems().add(para); try { bookmarkNavigator.replaceBookmarkContent(bodyPart); } catch (NullPointerException e) { log.error("书签《" + bookmarkName + "》丢失", e); } }
public static void onePageShow(Document document) { SectionCollection sections = document.getSections(); for (int i = 0; i < sections.getCount(); i++) { TableCollection tables = sections.get(i).getTables(); for (int j = 0; j < tables.getCount(); j++) { Table table = tables.get(j); table.getTableFormat().isBreakAcrossPages(true); RowCollection rows = table.getRows(); for (int k = 0; k < rows.getCount(); k++) { TableRow row = rows.get(k); onePageShow(row); } } } }
public static void everyPageSNNumber(Document doc, String snNumber) { HeaderFooter header = doc.getSections().get(0).getHeadersFooters().getHeader(); Paragraph paragraph = header.addParagraph(); paragraph.appendText(" SN:" + Optional.ofNullable(snNumber).orElseGet(String::new)); paragraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Left); } }
|