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

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.dtcms.com/a/351802.html

相关文章:

  • Spring - 文件上传与下载:真正的企业开发高频需求——Spring Boot文件上传与下载全场景实践指南
  • 位运算卡常技巧详解
  • Charles抓包微信小程序请求响应数据
  • 信号无忧,转决千里:耐达讯自动化PROFIBUS集线器与编码器连接术
  • 快速了解卷积神经网络
  • springweb项目中多线程使用详解
  • 问:单证硕士含金量是否不足?
  • 【Linux 进程】进程程序替换
  • 【GitHub】使用SSH与GitHub交互
  • 工业大模型五层架构全景解析:从算力底座到场景落地的完整链路
  • PyCharm注释详解:TODO、文档注释、注释
  • MySQL 索引:结构、对比与操作实践指南
  • 【合适新人】预测图片教程——如何随机抽取验证集图片进行可视化推理!(附完整代码)
  • DigitalOcean GPU 选型指南(三):中端AI GPU性价比之王 RTX 4000 Ada、A4000、A5000
  • 无人机航拍数据集|第33期 无人机树冠目标检测YOLO数据集5842张yolov11/yolov8/yolov5可训练
  • 【HZ-T536开发板免费体验】无需死记 Linux 命令!用 CangjieMagic 在 HZ-T536 开发板上搭建 MCP 服务器,自然语言轻松控板
  • Java大厂面试全真模拟:从Spring Boot到微服务架构实战
  • 文本转语音TTS工具合集(下)
  • 【强化学习】区分理解: 时序差分(TD)、蒙特卡洛(MC)、动态规划(DP)
  • 计算机底层硬件实现及运行原理通俗书籍推荐
  • 记一次MySQL数据库的操作练习
  • 把 AI 塞进「空调遥控器」——基于 MEMS 温湿阵列的 1 分钟极速房间热场扫描
  • 如何获取当前页面html元素的外层容器元素
  • vscode或者cursor配置使用Prettier - Code formatter来格式化微信小程序wxss/wxs/wxml文件
  • Vue Flow 设计大模型工作流 - 自定义大模型节点
  • 基于XiaothinkT6语言模型的文本相似度计算:轻量方案实现文本匹配与去重
  • 乳腺癌数据集支持向量机实践学习总结
  • 2025最新的软件测试热点面试题(答案+解析)
  • OnlyOffice 渲染时间获取指南
  • from中烟科技翼支付 面试题2