word 插入表格(转载csdn)https://blog.youkuaiyun.com/RR369_yyh/article/details/79693946

本文介绍了一种使用Java和Apache POI库动态生成并修改Word文档的方法,通过读取模板文件,替换文本内容,自动生成表格,并调整表格样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.controller;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
 
import org.apache.commons.lang3.StringUtils;
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.XWPFTableRow;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
@RequestMapping(value="/base")  
public class TestController {
    
    @RequestMapping(value="/test")
    public void docTest()   {
        String templatePath = "D:\\demo.doc";
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(templatePath);
            XWPFDocument doc = new XWPFDocument(in);
            //文本替换
            Map<String, String> param = new HashMap<String, String>();
            param.put("PartyA", "我是甲方");
            param.put("PartyB", "我是乙方");
            param.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
            param.put("text", "合同内容合同内容合同内容合同内容合同内容合同内容合同内容合同内容合同内容合同内容合同内容合同内容合同内容");
            List<XWPFParagraph> allXWPFParagraphs = doc.getParagraphs();
            for (XWPFParagraph xwpfParagraph : allXWPFParagraphs) {
                List<XWPFRun> runs = xwpfParagraph.getRuns();
                for (XWPFRun run : runs) {
                    String text = run.getText(0);
                    if (StringUtils.isNoneBlank(text)) {
                        if (text.equals("table")) {
                            //表格生成 6行5列.
                            int rows = 6;
                            int cols = 5;
                            XmlCursor cursor = xwpfParagraph.getCTP().newCursor();
                            XWPFTable tableOne = doc.insertNewTbl(cursor);
                            
                            //样式控制
                            CTTbl ttbl = tableOne.getCTTbl();
                            CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();  
                            CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();  
                            CTJc cTJc = tblPr.addNewJc();  
                            cTJc.setVal(STJc.Enum.forString("center"));//表格居中
                            tblWidth.setW(new BigInteger("9000"));//每个表格宽度
                            tblWidth.setType(STTblWidth.DXA);  
                            
                            //表格创建
                            XWPFTableRow tableRowTitle = tableOne.getRow(0);
                            tableRowTitle.getCell(0).setText("标题");
                            tableRowTitle.addNewTableCell().setText("内容");
                            tableRowTitle.addNewTableCell().setText("姓名");
                            tableRowTitle.addNewTableCell().setText("日期");
                            tableRowTitle.addNewTableCell().setText("备注");
                            for (int i = 1; i < rows; i++) {
                                XWPFTableRow createRow = tableOne.createRow();
                                for (int j = 0; j < cols; j++) {
                                    createRow.getCell(j).setText("我是第"+i+"行,第"+(j+1)+"列");
                                }
                            }
                            run.setText("", 0);
                        }else {
                            for (Entry<String, String> entry : param.entrySet()) {
                                String key = entry.getKey();
                                if (text.indexOf(key) != -1) {
                                    text = text.replace(key, entry.getValue());
                                    run.setText(text, 0);
                                }
                            }
                        }
                    }
                }
            }
            
            out = new FileOutputStream("D:\\report.doc");
            // 输出
            doc.write(out);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
}

demo.doc 如下:

report.doc 如下:

yyh@yyh:~$ sudo apt install libmodbus5 libmodbus-dev -y 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列【新】软件包将被安装: libmodbus-dev libmodbus5 升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 62 个软件包未被升级。 需要下载 111 kB 的归档。 解压缩后会消耗 313 kB 的额外空间。 获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal/universe amd64 libmodbus5 amd64 3.1.6-2 [23.5 kB] 获取:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal/universe amd64 libmodbus-dev amd64 3.1.6-2 [87.6 kB] 已下载 111 kB,耗时 7秒 (17.0 kB/s) 正在选中未选择的软件包 libmodbus5:amd64。 (正在读取数据库 ... 系统当前共安装有 185694 个文件和目录。) 准备解压 .../libmodbus5_3.1.6-2_amd64.deb ... 正在解压 libmodbus5:amd64 (3.1.6-2) ... 正在选中未选择的软件包 libmodbus-dev:amd64。 准备解压 .../libmodbus-dev_3.1.6-2_amd64.deb ... 正在解压 libmodbus-dev:amd64 (3.1.6-2) ... 正在设置 libmodbus5:amd64 (3.1.6-2) ... 正在设置 libmodbus-dev:amd64 (3.1.6-2) ... 正在处理用于 man-db (2.9.1-1) 的触发器 ... 正在处理用于 libc-bin (2.31-0ubuntu9.17) 的触发器 ... /sbin/ldconfig.real: /usr/local/cuda/targets/x86_64-linux/lib/libcudnn_adv_train .so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda/targets/x86_64-linux/lib/libcudnn_cnn_infer .so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda/targets/x86_64-linux/lib/libcudnn_ops_infer .so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda/targets/x86_64-linux/lib/libcudnn_adv_infer .so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda/targets/x86_64-linux/lib/libcudnn.so.8 is n ot a symbolic link /sbin/ldconfig.real: /usr/local/cuda/targets/x86_64-linux/lib/libcudnn_cnn_train .so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda/targets/x86_64-linux/lib/libcudnn_ops_train .so.8 is not a symbolic link yyh@yyh:~$ 安装成功了吗
04-03
从您提供的日志来看,`libmodbus5` 和 `libmodbus-dev` 已经成功安装。以下是详细解析: --- ### 日志分析 1. **软件包安装**: - 系统明确指出了新安装的两个软件包:`libmodbus5` 和 `libmodbus-dev`。 - 它们分别对应 Modbus 协议的核心库以及开发所需的头文件和静态链接库。 2. **下载与解压过程**: - 总共需要下载约 111 KB 的内容,并且已顺利完成了下载和解压步骤。 3. **配置阶段**: - 安装完成后还触发了一些相关的后续任务,包括更新动态链接库缓存 (`ldconfig`) 和生成帮助手册索引(`man-db`)。 4. **警告信息**: - 最后几行显示了关于 CUDA 相关路径下一些共享库不是符号链接的警告消息。但这只是 ldconfig 在扫描所有可能包含 .so 文件目录时发现的问题,并不影响本次 modbus 库的正常部署结果。 > 注释:如果您并未主动维护 NVIDIA CUDA 开发环境,则上述 cuda 部分的内容无需关注过多;它们仅作为次要提示存在而无实际关联影响范围局限于此特定上下文中。 综上所述,您的命令执行完毕并且达到了预期效果 —— libmodbus 成功就位可供进一步开发调用了! --- ### 后续验证方法 为了确认是否真正可用,您可以运行以下测试脚本来检查基本功能连接状况: ```bash # 创建简单的 C 测试程序 test_modbus.c cat <<EOF>test_modbus.c #include <stdio.h> #include <stdlib.h> #include <modbus/modbus.h> int main(void){ printf("Modbus library version %s\n", modbus_get_version()); return EXIT_SUCCESS; } EOF # 使用 gcc 编译该示例并加载必要模块 gcc -o check_modbus test_modbus.c -lmodbus # 执行编译出的小工具查看输出值 ./check_modbus ``` 如果一切正常的话屏幕上应当打印类似 "Modbus library version x.x.x" 字样的字符串表示 API 接口正确接入系统内部架构之中可以开始着手项目具体需求实现了! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值