当前位置: 首页 > backend >正文

poi生成word固定表格列宽

一、需求

根据数据库生成文档,文档包含大量表格,表格数量不确定,每个表格行数也不确定。

二、实现方案

引入依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.4</version>
</dependency>
代码实现
  1. 静态常量
    public static final int FONT_SIZE = 9;
    public static final TitleStyle[] titleStyles = {new TitleStyle("一级标题", 44, true),new TitleStyle("二级标题", 36, true),new TitleStyle("三级标题", 32, true),new TitleStyle("四级标题", 30, false)};public record TitleStyle(String name, int fontSize, boolean bold) {}
    
  2. 创建文档
    /*** A3 Portrait  16840 23814 720* A3 Landscape 23814 16940 720* A4 Portrait  11907 16840 720* A4 Landscape 16840 11907 720*/
    public void createDocument(int width, int height, int top, int right, int bottom, int left) {XWPFDocument document = new XWPFDocument();CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();CTPageSz pageSz = sectPr.addNewPgSz();pageSz.setW(BigInteger.valueOf(width));pageSz.setH(BigInteger.valueOf(height));pageSz.setOrient(width > height ? STPageOrientation.LANDSCAPE : STPageOrientation.PORTRAIT);CTPageMar pageMar = sectPr.addNewPgMar();pageMar.setTop(BigInteger.valueOf(top));pageMar.setRight(BigInteger.valueOf(right));pageMar.setBottom(BigInteger.valueOf(bottom));pageMar.setLeft(BigInteger.valueOf(left));for (int i = 0; i < titleStyles.length; i++) {addCustomHeadingStyle(document, titleStyles[i], i + 1);}
    }private static void addCustomHeadingStyle(XWPFDocument document, TitleStyle titleStyle, int headingLevel) {CTStyle ctStyle = CTStyle.Factory.newInstance();ctStyle.setStyleId(titleStyle.name());CTString styleName = CTString.Factory.newInstance();styleName.setVal(titleStyle.name());ctStyle.setName(styleName);CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();indentNumber.setVal(BigInteger.valueOf(headingLevel));// lower number > style is more prominent in the formats barctStyle.setUiPriority(indentNumber);CTOnOff onOffNull = CTOnOff.Factory.newInstance();ctStyle.setUnhideWhenUsed(onOffNull);// style shows up in the formats barctStyle.setQFormat(onOffNull);// style defines a heading of the given levelCTPPr ppr = CTPPr.Factory.newInstance();ppr.setOutlineLvl(indentNumber);ctStyle.setPPr(ppr);CTRPr rpr = CTRPr.Factory.newInstance();// font sizeCTHpsMeasure ctHpsMeasure = CTHpsMeasure.Factory.newInstance();ctHpsMeasure.setVal(BigInteger.valueOf(titleStyle.fontSize()));rpr.setSz(ctHpsMeasure);rpr.setSzCs(ctHpsMeasure);// fond boldif (titleStyle.bold()) {CTOnOff b = rpr.addNewB();b.setVal(STOnOff.TRUE);}ctStyle.setRPr(rpr);XWPFStyle style = new XWPFStyle(ctStyle);style.setType(STStyleType.PARAGRAPH);XWPFStyles styles = document.createStyles();styles.addStyle(style);
    }
    
  3. 创建标题
    public void createTitle(int level, int id, String title) {XWPFParagraph paragraph = document.createParagraph();paragraph.setStyle(titleStyles[level - 1].name());XWPFRun run = paragraph.createRun();run.setText(title);CTBookmark bookmark = paragraph.getCTP().addNewBookmarkStart();bookmark.setName("bm_" + id);bookmark.setId(BigInteger.valueOf(id));paragraph.getCTP().addNewBookmarkEnd().setId(BigInteger.valueOf(id));
    }
    
  4. 创建表格
    public XWPFTable createTable(int width, TableTitle... titles) {XWPFTable table = document.createTable(1, titles.length);CTTblPr TblPr = table.getCTTbl().addNewTblPr();TblPr.addNewTblLayout().setType(STTblLayoutType.FIXED); // 布局固定,不随内容改变宽度CTTblWidth tblW = TblPr.isSetTblW() ? TblPr.getTblW() : TblPr.addNewTblW();tblW.setType(STTblWidth.DXA);tblW.setW(BigInteger.valueOf(width));// 表格边颜色CTTblBorders borders = TblPr.addNewTblBorders();tableBorderStyle(borders.addNewInsideH());tableBorderStyle(borders.addNewInsideV());tableBorderStyle(borders.addNewLeft());tableBorderStyle(borders.addNewRight());tableBorderStyle(borders.addNewTop());tableBorderStyle(borders.addNewBottom());XWPFTableRow row = table.getRow(0);for (int i = 0; i < titles.length; i++) {TableTitle title = titles[i];XWPFTableCell cell = row.getCell(i);cell.setColor("3a60a0");if (title.width() > 0) {CTTcPr ctTcPr = cell.getCTTc().addNewTcPr();CTTblWidth tblWidth = ctTcPr.isSetTcW() ? ctTcPr.getTcW() : ctTcPr.addNewTcW();tblWidth.setW(BigInteger.valueOf(title.width()));tblWidth.setType(STTblWidth.DXA);}XWPFParagraph paragraphArray = cell.getParagraphArray(0);XWPFRun run = paragraphArray.createRun();run.setText(title.name());run.setBold(true);run.setColor("f5f5f5a");run.setFontSize(FONT_SIZE);paragraphArray.setAlignment(ParagraphAlignment.CENTER); // 水平居中}return table;
    }public record TableTitle(String name, int width) {}
    
  5. 创建空行
    public void createBlankLine() {document.createParagraph();
    }
    
  6. 创建表格行
    XWPFTableRow row = table.createRow();
    
  7. 获取单元格
    XWPFTableCell cell = row.getCell(0);
    
  8. 创建超链接
    public static void createHyperlinkRunToAnchor(XWPFParagraph paragraph, String text, int id) {paragraph.setVerticalAlignment(TextAlignment.CENTER);CTHyperlink ctHyperlink = paragraph.getCTP().addNewHyperlink();ctHyperlink.setAnchor("bm_" + id);ctHyperlink.addNewR();XWPFHyperlinkRun hyperlinkRun = new XWPFHyperlinkRun(ctHyperlink, ctHyperlink.getRArray(0), paragraph);hyperlinkRun.setText(text);hyperlinkRun.setColor("0000FF");hyperlinkRun.setUnderline(UnderlinePatterns.SINGLE);hyperlinkRun.setFontSize(FONT_SIZE);
    }public static void createHyperlinkRunToFile(XWPFParagraph paragraph, String text, String fileName, Integer id) {paragraph.setVerticalAlignment(TextAlignment.CENTER);String uri = fileName;if (id != null) {uri += "#bm_" + id;}String rId = paragraph.getDocument().getPackagePart().addExternalRelationship(uri, XWPFRelation.HYPERLINK.getRelation()).getId();CTHyperlink ctHyperlink = paragraph.getCTP().addNewHyperlink();ctHyperlink.setId(rId);ctHyperlink.addNewR();XWPFHyperlinkRun hyperlinkRun = new XWPFHyperlinkRun(ctHyperlink, ctHyperlink.getRArray(0), paragraph);hyperlinkRun.setText(text);hyperlinkRun.setColor("0000FF");hyperlinkRun.setUnderline(UnderlinePatterns.SINGLE);hyperlinkRun.setFontSize(FONT_SIZE);
    }
    
http://www.xdnf.cn/news/18808.html

相关文章:

  • TensorFlow 面试题及详细答案 120道(61-70)-- 高级特性与工具
  • css3背景线性渐变:linear-gradient
  • 【密集目标检测】停车场车辆(车位)识别数据集:12k+图像,yolo标注
  • 04 网络信息内容安全--入侵检测技术
  • 依托边缘计算方案,移动云全面化解算力、效率、安全平衡难题
  • from中烟科技翼支付 面试题2
  • 高频面试题:说一下线程池吧?(线程池原理,核心参数,创建方式,应用场景都要说到才能让面试官心服口服)
  • Pytorch深度学习(小土堆)
  • Java 企业应用单点登录(SSO)实现方案详解
  • 如何对springboot mapper 编写单元测试
  • Ansible 文件管理与 Jinja2 模板全解析:从模块应用到动态配置生成
  • 由倍讯科技研制的CCLinkIE转ModbusTCP网关,可达成与脉冲计数器的连接
  • JVM分层编译深度解析:完整机制与实践指南
  • 《零基础入门AI:长短期记忆网络(LSTM)与门控循环单元(GRU)(原理、结构与实现)》
  • 【大前端】实现一个前端埋点SDK,并封装成NPM包
  • 【机械故障】旋转机械故障引起的振动信号调制效应概述
  • 在线教育系统源码助力教培转型:知识付费平台开发的商业实践
  • 达索 Enovia 许可管理技术白皮书:机制解析与智能优化实践
  • 面试 总结(1)
  • 项目集升级:顶部导览优化、字段自定义、路线图双模式、阶段图掌控、甘特图升级、工作量优化、仪表盘权限清晰
  • 31.Encoder-Decoder(Seq2Seq)
  • Docker详细学习
  • 【Protues仿真】定时器
  • 构建智能提示词工程师:LangGraph 的自动化提示词生成流程
  • [在实践中学习] 中间件理论和方法--Redis
  • WPF基于LiveCharts2图形库,实现:折线图,柱状图,饼状图
  • Python爬虫实战:研究开源的高性能代理池,构建电商数据采集和分析系统
  • Pycharm
  • ​告别复杂计划!日事清推出脑图视图,支持节点拖拽与聚焦模式,让项目管理更直观​
  • MySQL 入门