我正在尝试从数据库中选择数据,并将数据显示在Word(DOCX)文件中。
我正在处理两种类型的数据。
第一种类型是我想显示一次的数据。像客户名称一样。
第二种数据类型是使用动态行脚本导入的数据。我数据库中的数据如下所示: 行:
-----------------------------------------
| internal_id | quantity | product_name |
| 1 | 1 | One |
| 1 | 5 | Two |
| 1 | 4 | Three |
| 1 | 2 | Four |
| 1 | 6 | Five |
-----------------------------------------
在我的Word模板中,我将这些行定义如下:
{name}
{address}
{lines}
{quantity}
{product_name}
{/lines}
执行脚本时,我的Word文件中包含以下数据:
Name
Address 123
{!404_DOCXTemplate_quantity}
{!404_DOCXTemplate_product_name}
有人知道为什么我的代码的多行部分不起作用吗?
这是我的PHP脚本,我在其中选择数据并生成Word文件:
$result1 = mysqli_fetch_assoc($res1) ;
$link2 = mysqli_connect("localhost", "root", "pass", "db");
if($link2 === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}
$sql2 = "SELECT * FROM lines WHERE internal_id = '1'";
$res2 = mysqli_query($link2, $sql2) ;
$result2 = $link2->query($sql2);
if ($result2->num_rows > 0) {
$result2 = mysqli_fetch_assoc($res2) ;
include_once('./docxtemplate.class.php');
$docx = new DOCXTemplate('template.docx');
$docx->set('name', "" . $result1['name'] . "");
$docx->set('address', "" . $result1['address'] . "");
$docx->set('LINES', mysqli_num_rows($result2));
while ($row = mysql_fetch_array($result2))
{
$docx->set('quantity', "" . $result2['quantity'] . "");
$docx->set('product_name', "" . $result2['product_name'] . "");
}
$docx->saveAs('test.docx');
header("Content-Type:application/msword");
header("Content-Disposition: attachment;filename=test.docx");
readfile('test.docx');
}
以下功能正在生成文本!404_DOCXTemplate_
docxtemplate.class.php
private function _parse() {
if ($doc = $this->getEntryData( 'word/document.xml' )) {
if (preg_match_all('/\{[^}]+\}/', $doc, $m )) {
foreach( $m[0] as $v ) {
$var = preg_replace('/[\s\{\}]/','', strip_tags( $v ));
if (isset( $this->data[ $var ] )) {
if (is_scalar( $this->data[ $var ] ))
$doc = str_replace( $v, $this->_esc( $this->data[ $var ] ), $doc );
} else {
$doc = str_replace( $v, '{!404_'.__CLASS__.'_'.$var.'}', $doc );
}
}
}
$this->setEntryData( 'word/document.xml', $doc );
return true;
} else
return false;
}
答案 0 :(得分:0)
您在while循环中犯了错字
while ($row = mysql_fetch_array($result2))
{
$docx->set('quantity', "" . $row['quantity'] . "");
$docx->set('product_name', "" . $row['product_name'] . "");
}
您使用$ result2 ['quantity']代替$ row ['quantity']和$ result2 ['product_name']代替$ row ['product_name']
答案 1 :(得分:0)
在生成数据的代码中存在很多错误,我在代码中添加了我认为是错误的注释。
您在mysqli_调用中混合了过程方法和对象方法,这是可行的,但是您应该尝试坚持一个或另一个。它有助于样式和可读性。对象方法是您应该采用的方法,但这还取决于已使用的方法。
我不确定是否需要连接$link2
,如果您有$link1
,它是到同一数据库的连接,请重新使用该连接。尝试减少连接到数据库的次数,因为这通常是一个很大的性能问题。
$sql2 = "SELECT quantity,product_name FROM lines WHERE internal_id = '1'";
// This is not needed - done twice next at- $result2 = $link2...
// $res2 = mysqli_query($link2, $sql2) ;
$result2 = mysqli_query($link2, $sql2);
if (mysqli_num_rows($result2) > 0) {
// This is done as part of the loop
// $result2 = result2($res2) ;
include_once('./docxtemplate.class.php');
$docx = new DOCXTemplate('template.docx');
// You don't need the "" . or ."" bits unless they add something
$docx->set('name', $result1['name']);
$docx->set('address', $result1['address']);
$docx->set('LINES', mysqli_num_rows($result2));
// use mysqli_fetch_assoc instead of mysql_fetch_array
while ($row = mysqli_fetch_assoc($result2))
{
// $result2 should be $row
$docx->set('quantity', $row['quantity']);
$docx->set('product_name', $row['product_name']);
}
$docx->saveAs('test.docx');
header("Content-Type:application/msword");
header("Content-Disposition: attachment;filename=test.docx");
readfile('test.docx');
}
答案 2 :(得分:0)
我认为您正在覆盖$ result2:
$result2 = $link2->query($sql2);
if ($result2->num_rows > 0) {
$result2 = mysqli_fetch_assoc($res2) ; // <- delete this line
因为稍后您需要这样做:
while ($row = mysql_fetch_array($result2))