在同一文档中重用模板[PHPword]

时间:2015-10-21 04:10:07

标签: codeigniter templates phpword

我在我的Codeigniter项目中使用PHPWord作为库。在我的项目中,我想生成一个使用已经正常工作的模板的.docx文件。在该模板中是一个贴纸,将通过查询数据库中的数据来填充。由于我想在一个文档中生成多个贴纸,我必须复制我已经使用的第一个模板并添加分页。但它没有用。我无法打开文档。它说,"内容问题"

我在这里处理示例模板:enter image description here

这是我的代码:

public function Export(){ 

    $this->load->library('PHPWord');
    $this->load->model('person_model');

    $PHPWord = new PHPWord();
    $section = $PHPWord->createSection();

    $persons= $this->person_model->DataSticker();

    $document = $PHPWord->loadTemplate('application/controllers/Sticker.docx');
    $counter=1;
    foreach($persons as $row){ 
        $this->Doc($document,$counter,$row);
        $counter+=1;
        if($counter>6){
            $counter=1;
            $section->addObject($document); 
            $section->addPageBreak();
            $document = $PHPWord->loadTemplate('application/controllers/Sticker.docx');
            $this->Doc($document,$counter,$row);
        }

    }  



     // Save File
    $objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
    $filename = 'nameOfFile.docx';
    $objWriter->save( $filename);;
    header('Content-Description: File Transfer');
    header('Content-type: application/force-download');
    header('Content-Disposition: attachment; filename='.basename($filename));
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: '.filesize($filename));
    readfile($filename);
    unlink($filename);




}
public function Doc($document,$counter,$row){
     $document->setValue('Fname'.$counter, $row->fname);
        $document->setValue('Mname'.$counter, $row->mname);
        $document->setValue('Lname'.$counter, $row->lname);
        $document->setValue('DOB'.$counter, $row->dob);
        $document->setValue('POB'.$counter,$row->pob);
        $document->setValue('Age'.$counter, $row->age);
        $document->setValue('School'.$counter, $row->school); 

}

我们将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这个答案与0.12.0版本有关(也可能也适用于0.13.0)...您可能正在使用一些旧版本,因为您使用的是不推荐使用的loadTemplate函数。

为了回答你最新的问题,我认为你不能将模板与addObject一起使用(好吧,不是100%肯定它,但引用一定的)。但是一种工作方法是使用单个模板文件,其中您定义了贴纸的一个页面模板(包括您的分页符),并包含模板块标记,即:

${CLONEBLOCK}
Here is your sticker page definition (6 stickers + pagebreak)...
${/CLONEBLOCK}

然后在您的代码中,您可以根据需要多次克隆此块:

// the class path is probably something different with your codeigniter
$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('application/controllers/Sticker.docx');    
$templateProcessor->cloneBlock('CLONEBLOCK', count($persons)/6);

您可以非常相似地分配模板值:

   // note! add the limit 1 as the third parameter (otherwise it will
   // write the this value on all of the pages)
   $templateProcessor->setValue('Mname'.$counter,  $row->mname, 1);

答案 1 :(得分:0)

我知道这是一个古老的问题,但是我正在寻找类似的答案,但是发现缺少链接以使该答案有效,因此我想与您分享。

ejuhjav的回答在原则上是正确的,但对于今天的最新版本(v0.16.0),这将起作用。

在您的Word模板中,您具有以下代码块:

${CLONEME}
1.  ${Title}
${/CLONEME}

(“标题”被格式化为带编号的标题)

例如,您现在想动态插入x标题,对吗?因此,您要做的很简单。您将块克隆x次,然后为每次迭代设置值。在其他答案中所犯的错误是setValue方法可作为简单的搜索和替换工作。因此,基本上,您总是希望替换找到的第一个 $ {Title}占位符,然后移至下一个-但您必须确保搜索和替换仅限于以下第一个发现:

$templateProcessor->setValue('Title',  "Testtitel 1", 1);

然后基本上将迭代每个克隆的标题。

这很完美,当然,由于虚假原因,它不是动态完成的:

// Template processor instance creation
$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('Sample_23_TemplateBlock.docx');
$templateProcessor->cloneBlock('CLONEME', 3);
$templateProcessor->setValue('Title',  "Testtitel 1", 1);
$templateProcessor->setValue('Title',  "Testtitel 2", 1);
$templateProcessor->setValue('Title',  "Testtitel 3", 1);
$templateProcessor->saveAs('ClonedHeadings.docx');

我希望它将来对某人有帮助。

安德烈亚斯