参考文档
模板处理
安装过程省略,首先加载模板:
$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);
$filename = "test.doc";
$templateProcessor->saveAs($filename);
$file = fopen($filename, "rb");
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: " . filesize($filename));
Header("Content-Disposition: attachment; filename=$filename");
echo fread($file, filesize($filename));
fclose($file);
exit ();
模板加载好后,一般的数据,只需要在模板中设置变量名即可替换,如:

就相当于一个萝卜一个坑,xxx xxx ${firstname}
,使用时$templateProcessor->setValue('firstname', 'John');
即可,非常简单
首先是保留表头的数据替换:假设无表数据,保留表头,但是数据为空
其实只需要计算数量,设置数量为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模板表格数据了。需要注意的是,填充数据的过程中,表格的行和列都需要对应好数据的长度。如果数据填充不全,可能会影响整个表格的显示效果。