前言
php小白,若有错误欢迎指正。
之前的项目中有涉及到PhpWord生成,其中获取textarea数据时发现字符串中的换行\n生成docx后不起作用,上网查了之后发现一些答案说使用<w:br/>替换\n就可以换行了。
但实际使用的时候发现,<w:br/>是软回车,软回车实际上并不是真正的回车,无法解决段落首行缩进的问题。
如图所示:
为解决首行缩进2个中文字符,我选择在替换的<w:br/>后添加空格或空格符代码,但若使用WPS打开docx,WPS会自动把一个段落中的空格吞掉,还是无法解决首行缩进。
而docx中,回车分软回车和硬回车两种,我想要的是硬回车,也就是真正另外回车生成为一个新的段落且设置首行缩进。
在网上没有找到PhpWord生成硬回车的答案,于是去研究docx的硬回车代码。
实际上docx的硬回车跟xml文件有关系,将docx后缀改为zip,解压后进入word文件夹,打开document.xml文件,这个文件是文档的实际内容代码,可以看到像html一样,每个段落文本是由标签包起来的,具体的标签可以去查xml的标签样式。
软回车
生成软回车,可以使用str_replace方法将\n替换为<w:br/>
str_replace("\n","<w:br/>", 要替换的字符串);
硬回车
生成硬回车,可以使用str_replace方法将\n替换为你模板中对应的样式标签代码。
// 数据换行处理
$docx_p_start = '<w:p>
<w:pPr>
<w:spacing w:line="360" w:lineRule="auto"/>
<w:ind w:firstLine="480" w:firstLineChars="200"/>
</w:pPr>
<w:r>
<w:rPr><w:rFonts w:hint="eastAsia"/></w:rPr>
<w:t>';
$docx_p_end = '</w:t></w:r></w:p>';
$replace = str_replace("\n", $docx_p_end.$docx_p_start, $replace);
- <w:p></w:p>:段落标签;
- <w:pPr></w:pPr>:段落属性包在<w:pPr></w:pPr>中;
- <w:spacing w:line=“360” w:lineRule=“auto”/>
<w:ind w:firstLine=“480” w:firstLineChars=“200”/>: 设置段落首行缩进; - <w:r></w:r>:表示一个样式串,包在<w:rPr></w:rPr>的外边;
- <w:rPr><w:rFonts w:hint=“eastAsia”/></w:rPr>:设置段落的字体样式。
- <w:t></w:t>:字符串标签,段落内容就包在这个标签里。
替换方法就是,将docx_p_end字符串对应上模板里变量的段落开始标签<w:p>等,然后在docx_p_end字符串后拼接上docx_p_start字符串。
需要注意的是,docx_p_start字符串并不是固定的,你要根据你想要的段落样式进行对应的修改。
具体怎么修改可以参考WORDXML格式解析,也可以创建一个docx后,写一段话,设置你想要的段落样式后,将文件改为zip文件解压后查看document.xml文件内对应段落的样式代码,然后复制样式代码。