中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

化妝品網(wǎng)站系統(tǒng)規(guī)劃58同城安居客

化妝品網(wǎng)站系統(tǒng)規(guī)劃,58同城安居客,國(guó)外的創(chuàng)意設(shè)計(jì)網(wǎng)站,網(wǎng)站建設(shè)開(kāi)發(fā)電銷話術(shù)目錄 問(wèn)題解決問(wèn)題poi-tl介紹 功能實(shí)現(xiàn)引入依賴模版代碼效果圖 附加(插件實(shí)現(xiàn))MergeColumnData 對(duì)象MergeGroupData 類ServerMergeTableData 數(shù)據(jù)信息ServerMergeTablePolicy 合并插件 問(wèn)題 由于在開(kāi)發(fā)功能需求中,word文檔需要垂直合并表格&…

目錄

    • 問(wèn)題
    • 解決問(wèn)題
      • poi-tl介紹
    • 功能實(shí)現(xiàn)
      • 引入依賴
      • 模版
      • 代碼
      • 效果圖
    • 附加(插件實(shí)現(xiàn))
      • MergeColumnData 對(duì)象
      • MergeGroupData 類
      • ServerMergeTableData 數(shù)據(jù)信息
      • ServerMergeTablePolicy 合并插件

問(wèn)題

由于在開(kāi)發(fā)功能需求中,word文檔需要垂直合并表格,而word模版引擎原有的插件功能只能做行循環(huán),不滿足需求;

解決問(wèn)題

  • 目前選擇的poi-tl的模版引擎,在原有的基礎(chǔ)上新增自定義插件來(lái)實(shí)現(xiàn)功能

poi-tl介紹

poi-tl 是一個(gè)基于Apache POI的Word模板引擎,也是一個(gè)免費(fèi)開(kāi)源的Java類庫(kù),你可以非常方便的加入到你的項(xiàng)目中;

Word模板引擎功能描述
文本將標(biāo)簽渲染為文本
圖片將標(biāo)簽渲染為圖片
表格將標(biāo)簽渲染為表格
圖表條形圖(3D條形圖)、柱形圖(3D柱形圖)、面積圖(3D面積圖)、折線圖(3D折線圖)、雷達(dá)圖、餅圖(3D餅圖)、散點(diǎn)圖等圖表渲染
If Condition判斷根據(jù)條件隱藏或者顯示某些文檔內(nèi)容(包括文本、段落、圖片、表格、列表、圖表等)
Foreach Loop循環(huán)根據(jù)集合循環(huán)某些文檔內(nèi)容(包括文本、段落、圖片、表格、列表、圖表等)
Loop表格行循環(huán)復(fù)制渲染表格的某一行
Loop表格列循環(huán)復(fù)制渲染表格的某一列
Loop有序列表支持有序列表的循環(huán),同時(shí)支持多級(jí)列表
Highlight代碼高亮word中代碼塊高亮展示,支持26種語(yǔ)言和上百種著色樣式
Markdown將Markdown渲染為word文檔
Word批注完整的批注功能,創(chuàng)建批注、修改批注等
Word附件Word中插入附件
SDT內(nèi)容控件內(nèi)容控件內(nèi)標(biāo)簽支持
Textbox文本框文本框內(nèi)標(biāo)簽支持
圖片替換將原有圖片替換成另一張圖片
書(shū)簽、錨點(diǎn)、超鏈接支持設(shè)置書(shū)簽,文檔內(nèi)錨點(diǎn)和超鏈接功能
Expression Language完全支持SpringEL表達(dá)式,可以擴(kuò)展更多的表達(dá)式:OGNL, MVEL
樣式支持有序列表的循環(huán),同時(shí)支持多級(jí)列表
模板嵌套模板包含子模板,子模板再包含子模板
模板嵌套模板包含子模板,子模板再包含子模板
合并Word合并Merge,也可以在指定位置進(jìn)行合并
用戶自定義函數(shù)(插件)插件化設(shè)計(jì),在文檔任何位置執(zhí)行函數(shù)

功能實(shí)現(xiàn)

引入依賴

		<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-full</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency><!-- spring el表達(dá)式 --><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>5.3.18</version></dependency>

模版

在這里插入圖片描述

代碼

@Testpublic void test() throws Exception {Configure config = Configure.builder().bind("precipitationInfoList", new ServerMergeTablePolicy()).useSpringEL(false).build();Map<String, Object> dataMap = new HashMap<String, Object>();dataMap.put("precipitationInfoList", getServerMergeTableData());ClassPathResource classPathResource = new ClassPathResource("static/word/template.docx");try (InputStream resourceInputStream = classPathResource.getInputStream();XWPFTemplate template = XWPFTemplate.compile(resourceInputStream, config);) {template.render(dataMap);template.writeAndClose(new FileOutputStream("output.docx"));} catch (Exception e) {e.printStackTrace();}}private ServerMergeTableData getServerMergeTableData() {List<Map<String,Object>> serverDataList = new ArrayList<>();Map<String,Object> serverData1 = new HashMap<>();serverData1.put("province","廣東省");serverData1.put("city","深圳市");serverData1.put("precipitation","0.3");serverDataList.add(serverData1);Map<String,Object> serverData2 = new HashMap<>();serverData2.put("province","廣東省");serverData2.put("city","廣州市");serverData2.put("precipitation","5.1");serverDataList.add(serverData2);Map<String,Object> serverData3 = new HashMap<>();serverData3.put("province","廣東省");serverData3.put("city","東莞市");serverData3.put("precipitation","10");serverDataList.add(serverData3);Map<String,Object> serverData4 = new HashMap<>();serverData4.put("province","湖南");serverData4.put("city","長(zhǎng)沙");serverData4.put("precipitation","10");serverDataList.add(serverData4);Map<String,Object> serverData6 = new HashMap<>();serverData6.put("province","湖南");serverData6.put("city","湘潭");serverData6.put("precipitation","4.5");serverDataList.add(serverData6);List<MergeGroupData> groupDataList = new ArrayList<>();groupDataList.add(MergeGroupData.builder().indexList(Arrays.asList("0","1","2")).build());groupDataList.add(MergeGroupData.builder().indexList(Arrays.asList("3","4")).build());List<MergeColumnData> mergeColumns = new ArrayList<>();mergeColumns.add(MergeColumnData.builder().groupDataList(groupDataList).mergeColumn(0).build());ServerMergeTableData serverMergeTableData = new ServerMergeTableData();serverMergeTableData.setMergeColumns(mergeColumns);serverMergeTableData.setServerDataList(serverDataList);return serverMergeTableData;}

效果圖

在這里插入圖片描述

附加(插件實(shí)現(xiàn))

MergeColumnData 對(duì)象


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class MergeColumnData {/*** 攜帶要分組的信息*/private List<MergeGroupData> groupDataList;/*** 需要合并的列,從0開(kāi)始*/private Integer mergeColumn;
}

MergeGroupData 類


/*** 合并對(duì)象信息*/
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class MergeGroupData {/*** 名稱*/private List<String> indexList;public Integer getListSize() {if (Objects.isNull(indexList)) {return 0;}return indexList.size();}
}

ServerMergeTableData 數(shù)據(jù)信息


import lombok.Data;import java.util.List;@Data
public class ServerMergeTableData {private List<?> serverDataList;/*** 列合并信息*/private List<MergeColumnData> mergeColumns;
}

ServerMergeTablePolicy 合并插件


import cn.hutool.core.collection.CollUtil;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.exception.RenderException;
import com.deepoove.poi.policy.AbstractRenderPolicy;
import com.deepoove.poi.render.RenderContext;
import com.deepoove.poi.render.compute.EnvModel;
import com.deepoove.poi.render.compute.RenderDataCompute;
import com.deepoove.poi.render.processor.DocumentProcessor;
import com.deepoove.poi.render.processor.EnvIterator;
import com.deepoove.poi.resolver.TemplateResolver;
import com.deepoove.poi.template.ElementTemplate;
import com.deepoove.poi.template.MetaTemplate;
import com.deepoove.poi.template.run.RunTemplate;
import com.deepoove.poi.util.ReflectionUtils;
import com.deepoove.poi.util.TableTools;
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.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;import java.util.Iterator;
import java.util.List;public class ServerMergeTablePolicy extends AbstractRenderPolicy<ServerMergeTableData> {private String prefix;private String suffix;private boolean onSameLine;public ServerMergeTablePolicy() {this(false);}public ServerMergeTablePolicy(boolean onSameLine) {this("[", "]", onSameLine);}public ServerMergeTablePolicy(String prefix, String suffix) {this(prefix, suffix, false);}public ServerMergeTablePolicy(String prefix, String suffix, boolean onSameLine) {this.prefix = prefix;this.suffix = suffix;this.onSameLine = onSameLine;}@Overridepublic void doRender(RenderContext<ServerMergeTableData> context) throws Exception {XWPFTemplate template = context.getTemplate();ServerMergeTableData mergeTableData = context.getData();ElementTemplate eleTemplate = context.getEleTemplate();this.renderTo(eleTemplate, mergeTableData, template);}public void renderTo(ElementTemplate eleTemplate, Object tableData, XWPFTemplate template) {RunTemplate runTemplate = (RunTemplate) eleTemplate;XWPFRun run = runTemplate.getRun();try {XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();XWPFTable table = tagCell.getTableRow().getTable();run.setText("", 0);if (null == tableData) {return;}ServerMergeTableData serverTableData = (ServerMergeTableData) tableData;List data = serverTableData.getServerDataList();if (!TableTools.isInsideTable(run)) {throw new IllegalStateException("The template tag " + runTemplate.getSource() + " must be inside a table");}int templateRowIndex = getTemplateRowIndex(tagCell);int tempStartRow = templateRowIndex;if (null != data && data instanceof Iterable) {Iterator<?> iterator = ((Iterable<?>) data).iterator();XWPFTableRow templateRow = table.getRow(templateRowIndex);int insertPosition = templateRowIndex;TemplateResolver resolver = new TemplateResolver(template.getConfig().copy(prefix, suffix));boolean firstFlag = true;int index = 0;boolean hasNext = iterator.hasNext();while (hasNext) {Object root = iterator.next();hasNext = iterator.hasNext();insertPosition = templateRowIndex++;XWPFTableRow nextRow = table.insertNewTableRow(insertPosition);setTableRow(table, templateRow, insertPosition);// double set rowXmlCursor newCursor = templateRow.getCtRow().newCursor();newCursor.toPrevSibling();XmlObject object = newCursor.getObject();nextRow = new XWPFTableRow((CTRow) object, table);if (!firstFlag) {// update VMerge cells for non-first rowList<XWPFTableCell> tableCells = nextRow.getTableCells();for (XWPFTableCell cell : tableCells) {CTTcPr tcPr = TableTools.getTcPr(cell);CTVMerge vMerge = tcPr.getVMerge();if (null == vMerge) continue;if (STMerge.RESTART == vMerge.getVal()) {vMerge.setVal(STMerge.CONTINUE);}}} else {firstFlag = false;}setTableRow(table, nextRow, insertPosition);RenderDataCompute dataCompute = template.getConfig().getRenderDataComputeFactory().newCompute(EnvModel.of(root, EnvIterator.makeEnv(index++, hasNext)));List<XWPFTableCell> cells = nextRow.getTableCells();cells.forEach(cell -> {List<MetaTemplate> templates = resolver.resolveBodyElements(cell.getBodyElements());new DocumentProcessor(template, resolver, dataCompute).process(templates);});}}table.removeRow(templateRowIndex);afterloop(table, data);//合并表格信息mergeTable(serverTableData, tempStartRow, table);} catch (Exception e) {throw new RenderException("HackLoopTable for " + eleTemplate + " error: " + e.getMessage(), e);}}private void mergeTable(ServerMergeTableData serverMergeTableData, int startRow, XWPFTable xwpfTable) {List serverDataList = serverMergeTableData.getServerDataList();List<MergeColumnData> mergeColumns = serverMergeTableData.getMergeColumns();if (CollUtil.isNotEmpty(mergeColumns)) {for (int i = 0; i < serverDataList.size(); i++) {for (MergeColumnData mergeColumnData : mergeColumns) {Integer mergeColumn = mergeColumnData.getMergeColumn();List<MergeGroupData> groupDataList = mergeColumnData.getGroupDataList();for (int j = 0; j < groupDataList.size(); j++) {MergeGroupData mergeGroupData = groupDataList.get(j);List<String> indexList = mergeGroupData.getIndexList();int listSize = mergeGroupData.getListSize();if (listSize == 1) {continue;}// 若匹配上 就直接合并if (indexList.contains(i + "")) {int col = i + startRow;int fromRow = i + (startRow - 1) + listSize;TableTools.mergeCellsVertically(xwpfTable, mergeColumn, col, fromRow);groupDataList.remove(j);break;}}}}}}private int getTemplateRowIndex(XWPFTableCell tagCell) {XWPFTableRow tagRow = tagCell.getTableRow();return onSameLine ? getRowIndex(tagRow) : (getRowIndex(tagRow) + 1);}protected void afterloop(XWPFTable table, Object data) {}@SuppressWarnings("unchecked")private void setTableRow(XWPFTable table, XWPFTableRow templateRow, int pos) {List<XWPFTableRow> rows = (List<XWPFTableRow>) ReflectionUtils.getValue("tableRows", table);rows.set(pos, templateRow);table.getCTTbl().setTrArray(pos, templateRow.getCtRow());}private int getRowIndex(XWPFTableRow row) {List<XWPFTableRow> rows = row.getTable().getRows();return rows.indexOf(row);}
}
http://www.risenshineclean.com/news/44941.html

相關(guān)文章:

  • 南昌市有幫做網(wǎng)站的嗎作品提示優(yōu)化要?jiǎng)h嗎
  • 江蘇專業(yè)網(wǎng)站建設(shè)網(wǎng)絡(luò)營(yíng)銷站點(diǎn)推廣的方法
  • 門(mén)戶網(wǎng)站建設(shè)管理總則關(guān)鍵詞優(yōu)化排名查詢
  • 合肥做網(wǎng)站優(yōu)化哪家好建立網(wǎng)站需要什么條件
  • pc網(wǎng)站建設(shè)方案有哪些seo綜合排名優(yōu)化
  • 許昌做網(wǎng)站漢獅網(wǎng)絡(luò)網(wǎng)站片區(qū)
  • 公司網(wǎng)站開(kāi)發(fā)建設(shè)什么會(huì)計(jì)科目今日財(cái)經(jīng)最新消息
  • 手機(jī)網(wǎng)站建設(shè)價(jià)格低正規(guī)百度推廣
  • 深圳做網(wǎng)站推廣品牌推廣計(jì)劃書(shū)怎么寫(xiě)
  • 綿陽(yáng)市建設(shè)局官方網(wǎng)站軍事新聞俄烏最新消息
  • 網(wǎng)站建設(shè)費(fèi)科目外貿(mào)推廣具體是做什么
  • 手機(jī)微信網(wǎng)站怎么做的好淘寶直通車推廣怎么收費(fèi)
  • 佛山英文網(wǎng)建站國(guó)外引流推廣軟件
  • 網(wǎng)站首頁(yè)改版模板網(wǎng)站好還是自助建站好
  • 鄭州網(wǎng)站建設(shè)品牌好網(wǎng)站seo推廣招聘
  • 家庭網(wǎng)絡(luò)做網(wǎng)站網(wǎng)絡(luò)優(yōu)化工程師主要負(fù)責(zé)什么工作
  • 河北省網(wǎng)絡(luò)科技網(wǎng)站seo網(wǎng)站頁(yè)面優(yōu)化包含
  • 英國(guó)有哪些做折扣的網(wǎng)站網(wǎng)絡(luò)推廣整合平臺(tái)
  • 阿克蘇網(wǎng)站建設(shè)服務(wù)網(wǎng)站建設(shè)網(wǎng)絡(luò)公司
  • 網(wǎng)校網(wǎng)站建設(shè)方案優(yōu)化設(shè)計(jì)方法
  • 微網(wǎng)站自己怎么做seo排名優(yōu)化收費(fèi)
  • 慶陽(yáng)網(wǎng)站建設(shè)百度推廣在哪里
  • 廣州市網(wǎng)站建設(shè)公司在哪里企業(yè)郵箱域名
  • 四川政府網(wǎng)站建設(shè)管理辦法什么是網(wǎng)絡(luò)營(yíng)銷的核心
  • 團(tuán)購(gòu)網(wǎng)站平臺(tái)建設(shè)什么公司適合做seo優(yōu)化
  • ??谧鼍W(wǎng)站的公司如何做好營(yíng)銷
  • 新網(wǎng)站前期如何做seo怎么在百度免費(fèi)推廣
  • 諸暨網(wǎng)站制作哪些公司制作西安網(wǎng)站制作推廣
  • 荊州網(wǎng)站建設(shè)seo門(mén)戶 site
  • 泰和網(wǎng)站制作網(wǎng)站空間