相关文章推荐
强悍的核桃  ·  phpoffice/phpword - ...·  2 月前    · 
悲伤的甜瓜  ·  C#进阶系列——WebApi ...·  1 年前    · 
冷冷的萝卜  ·  申报材料·  1 年前    · 

参考文档
模板处理

安装过程省略,首先加载模板:
$templateProcessor = new TemplateProcessor(ROOT_PATH . 'uploads/template/自动生成模板.docx');

完整保存流程

首先,要进行测试,起码能够写一个完整的demo,以下是我测试时用的demo

        $templateProcessor = new TemplateProcessor(ROOT_PATH . 'public/static/自动生成模板.docx');
        (new \app\index\model\MyUse())->fillIpAndAddress($templateProcessor); // 这一行内部就是对word进行填充,所有测试代码都可以写在这里
        $filename = "test.doc";
        $templateProcessor->saveAs($filename); //另存为新word文档,根据模板和变量生成了新的文档
        $file = fopen($filename, "rb");//以只读和二进制模式打开文件
        Header("Content-type: application/octet-stream"); //告诉浏览器这是一个文件流格式的文件
        Header("Accept-Ranges: bytes");  //请求范围的度量单位
        Header("Accept-Length: " . filesize($filename)); //Content-Length是指定包含于请求或响应中数据的字节长度
        //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
        Header("Content-Disposition: attachment; filename=$filename");
        echo fread($file, filesize($filename));   //读取文件内容并直接输出到浏览器
        fclose($file);
        exit ();

最基础的替换

模板加载好后,一般的数据,只需要在模板中设置变量名即可替换,如:
在这里插入图片描述
就相当于一个萝卜一个坑,xxx xxx ${firstname},使用时$templateProcessor->setValue('firstname', 'John');即可,非常简单

表格数据替换

首先是保留表头的数据替换:假设无表数据,保留表头,但是数据为空

姓名年龄
${name}${age}

若无数据,保留表头,但是数据为空

其实只需要计算数量,设置数量为0即可:

$templateProcessor->cloneRow('terminalNumber',0);

若有数据,填充

首先是计算数据量,然后按照数据量填充:

$count = count($userInfo);
$templateProcessor->cloneRow('name',$count);
if (is_array($userInfo) && count($userInfo) > 0) {
    if (!empty($userInfo)) {
        foreach ($userInfoas $key => $value) {
            $id = $key + 1;
            $templateProcessor->setValue("name#${id}", $value["name"]);
            $templateProcessor->setValue("age#${id}", $value["age"]);

循环表格替换

表格替换比较简单,即使是这种类型的表格,也只是往空格里填充数据而已,cloneRow依旧很容易做到

用户id用户信息
${userId} ${userName}
${userAddress}
依然是```$templateProcessor->cloneRow('userId', $count);```

但实际需求中,很可能有多个表,如根据查询的用户结果生成多个用户表数据,其中每个用户表数据包含这个用户所选的课程(即不唯一),这样的表结构设计在官方文档中没有找到。
首先确定要用克隆块,

${USER_CLASS}

用户的id为:${userId}

所选课程课程类型
${class${key}} ${type${key}}

${/USER_CLASS}

按照以上模式将word中需要生成多个表格的地方做好标记,稍微解释下为什么要这么做:
(1)使用克隆块,可以根据自己需要生成多个数据,这些数据包含表格,以及表格的额外信息
(2) ${class${key}} 这种方式来作为表中的key,是因为会生成多个表格,如果不再嵌套一个唯一key,那么最终数据每个表都会是一样的
代码如下:

foreach ($userClass as $key => $value) {
    $id = $key +1;
    $replacements[$id] = ["userId" => $value, "key" => $id];
  	$classRet = [];// 作用是拼凑最终的二维数组
    if (!empty($userClassInfo)) {
        foreach ($userClassInfo as $classKey => $class) {
            $addressCount++;
            $classRet[$key][$classKey ] = [
                "class" => $class["class"],
                "type" => $class["type"],
    } else {
        $templateProcessor->setValue('userId', " ");

实际上,就是构造一个二维数组:

"101":[ "1":{ "class":"数学", "type":"normal" "2":{ "class":"语文", "type":"normal" "102":[ "1":{ "class":"数学", "type":"normal" "2":{ "class":"语文", "type":"normal"

这个数组需要包含两层的id,然后就是填充数据:

if (!empty($classRet)) {
                foreach ($classRetas $key => $value) {
                    $id = $key + 1;
                    $templateProcessor->cloneRow("class" . $id, $locationCount);
                    foreach ($value as $ipKey => $ipValue) {
                        $ipId = $ipKey + 1;
                        $templateProcessor->setValue("class${id}#${ipId}", $ipValue["class"]);
                        $templateProcessor->setValue("type${id}#${ipId}", $ipValue["type"]);

这样就可以填充了。
注意:
(1)我写的示例都是从我自己的代码修改而来,改后没有测试,主要是表达原理
(2)如果不要代码块,deleteBlock可能不生效,我是用的cloneBlock,数量设置为0,cloneRow设置空数据同理,如果不设置,当无数据时可能变量名会保留在最终生成的word中

1、将PHPWord的包放到Public文件夹下 2、解决编码问题,PHPword 会对输入的文字进行utf8_encode编码转化,如果你使用GBK、GB2312或者utf8编码的话就会出现乱码,如果你用utf8编码,就查找类库中所有方法中的 utf8_encode 转码将其删除,如果你采用GBK或者GB2312编码,使用iconv进行编码转换。 //导出word public funct
项目需要导出word报告,而且需要在word中绘制表格,并且表格有跨行跨列设置,相关参考文档并不多,自己就看了一下源码结合官方文档实现跨行跨列效果,做个简单记录 简单来说跨列colspan使用gridSpan属性:int,跨列使用vMerge属性:restart/continue示例代码如下 $baseCellStyle = ['borderSize'=>1,'vAlign'=>VerticalJc::CENTER,'vMerge'=>'restart'];//基础单元格属性,...
项目中用到的实际是deleteBlock方法,但也是要调用replaceBlock 使用中生成的word文件是损坏的,不知道什么原因 但是用了一下cloneBlock的功能,发现是正常的 对比了一下cloneBlock和replaceBlock的正则表达式 replaceBlock方法的正则表达式 preg_match( '/(<\?xml.*)(<w:p.*>\${' ...
近期,要完成一个项目,要求大概是动态的生成一个表格,需求项目书给的样式是这样的 但是,使用phpword的人都知道,phpword需要自定义样式才能完成这样的效果,而网上又很少有这样的案例,官方文档又很坑,于是,写一个demo特此记录,给有需要的童孩。 首先,书写自定义样式 其中部分样式摘自他处 // 部分含义可能不准确,大概就是这个意思 $styleTable = arr...
### 回答1: 在Java中,可以使用Apache POI库来填充Word模板表格数据。POI是一个用于读取和写入Microsoft Office格式文件的Java库。使用POI,我们可以创建和填充Word模板中的表格数据。 首先,需要导入POI库到项目中。接着,就可以使用POI的XWPFDocument类来操作Word文档。可以使用XWPFDocument类的构造方法来打开模板文件,并将其读取到内存中。然后,需要定位到要填充表格数据的位置。使用XWPFTable类可以获取表格对象,并使用getRows()方法获取表格中的行。然后,可以使用XWPFTableRow类来获取特定行的单元格对象,并使用getCell()方法获取单元格。 为了填充表格数据,需要提供数据源。可以使用Java中的集合类(如List或Map)来存储数据。然后可以使用循环来遍历数据源,依次填充表格中的单元格。可以使用XWPFParagraph类来创建段落对象,并使用该类的createRun()方法创建Run对象。使用Run对象的setText()方法即可将数据填充到单元格中。 填充表格数据后,需要保存Word文档。可以使用XWPFDocument类的write()方法将修改后的文档保存到磁盘上。 总的来说,使用POI库填充Word模板表格数据可以简化表格数据填充的过程,并可以提高代码的可读性和可维护性。 ### 回答2: Java中使用POI填充Word模板表格数据是一种非常常见的应用场景。POI是一个开放源代码库,允许Java程序员使用Java语言创建、修改和读取各种Microsoft Office格式文件,如Excel、Word和PowerPoint。 填充Word模板表格数据的主要步骤如下: 1.导入POI的相关jar包,可通过Maven或手动引入方式。 2.创建一个Word文档,将其保存为模板文件(*.dotx)。 3.使用POI的XWPFDocument类将模板文件加载到内存中,然后通过XWPFTable类获取表格对象。 4.使用XWPFTableRow和XWPFTableCell类,遍历表格行和列,对需要填充的单元格进行赋值操作。 5.完成赋值后,使用OutputSteam将数据写入新的Word文件中,保存完成。 下面给出一个使用POI填充Word模板表格数据的例子: public static void fillTemplate(String templatePath, String destPath, Map<String, String> data) throws Exception { //加载模板文件 XWPFDocument document = new XWPFDocument(new FileInputStream(new File(templatePath))); //获取表格对象 List<XWPFTable> tables = document.getTables(); XWPFTable table = tables.get(0); //遍历表格行和列 for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { //获取单元格内容 String text = cell.getText(); if (text != null && data.containsKey(text)) { //填充数据 cell.setText(data.get(text)); //保存填充数据后的新文件 OutputStream os = new FileOutputStream(new File(destPath)); document.write(os); os.flush(); os.close(); 在上面的例子中,我们首先通过XWPFDocument类将模板文件加载到内存中,然后获取表格对象。接着,我们遍历表格行和列,对需要填充的单元格进行赋值操作,最后使用OutputStream将数据写入新的Word文件中,完成填充数据的操作。 综上所述,使用POI填充Word模板表格数据是一种实现简单、使用方便的方式,对于需要生成大量Word文档且格式固定的企业业务而言,具有非常实际的意义和应用价值。 ### 回答3: Java使用POI填充Word模板表格数据的方法主要分为以下几个步骤: 1.打开Word模板 使用POI的`XWPFDocument`类打开Word模板文件,例如: ```java XWPFDocument doc = new XWPFDocument(new FileInputStream("模板.docx")); 2.获取Word表格 通过`XWPFDocument`对象获取模板中的表格,例如: ```java List<XWPFTable> tables = doc.getTables(); XWPFTable table = tables.get(0); // 获取第一个表格 3.获取表格行和单元格 通过`XWPFTable`对象获取表格的行和单元格,例如: ```java List<XWPFTableRow> rows = table.getRows(); XWPFTableRow row = rows.get(rowIndex); // 获取第rowIndex行 XWPFTableCell cell = row.getCell(cellIndex); // 获取第cellIndex个单元格 4.填充单元格数据 通过`XWPFTableCell.setText()`方法填充单元格数据,例如: ```java cell.setText(data); // 填充数据 5.保存Word文档 使用`XWPFDocument`的`write()`方法将填充数据的Word文档保存到本地,例如: ```java doc.write(new FileOutputStream("填充后的文档.docx")); 使用以上的步骤,就可以很方便地使用Java和POI来填充Word模板表格数据了。需要注意的是,填充数据的过程中,表格的行和列都需要对应好数据的长度。如果数据填充不全,可能会影响整个表格的显示效果。