所以这是我的代码:
<?php
$zip = new ZipArchive;
if ($zip->open('test.docx') === TRUE) {
$xmlString = $zip->getFromName('word/document.xml');
$xmlString = str_replace('$FIRST_AND_LAST_NAME', 'John Doe', $xmlString);
$zip->addFromString('word/document.xml', $xmlString);
echo 'ok';
$zip->close();
} else {
echo 'failed';
}
它的目的很简单。它打开一个test.docx文件,搜索字符串“$ FIRST_AND_LAST_NAME”的所有出现,并用“John Doe”替换它们。
它在我的Windows开发服务器上完美运行(当我打开它时,“John Doe”字符串在docuemnt中。)
它在我的Lunux生产服务器上不起作用(“$ FIRST_AND_LAST_NAME”字符串仍然存在,没有“John Doe”)。
没有错误或通知,打印出“ok”没有任何错误。我确保test.docx文件的权限设置为777。
答案 0 :(得分:1)
如果close()
返回false,则写出存档时出错。
使用getStatusString
获取确切的错误消息。
答案 1 :(得分:1)
在sleep(1)
$zip->addFromString('word/document.xml', $xmlString);
适用于我的Ubuntu 12.04
在创建docx文件时不要忘记同时输入变量,我的意思是从不输入FIRST_AND_LAST_NAME
,然后在此之后添加符号$
。它创建了不同的XML代码。
答案 2 :(得分:0)
好的,我使用过在phpclasses中找到的一个类:
http://phpclasses.web4u.cz/package/6278-PHP-Edit-a-Zip-archive-in-pure-PHP-no-temporary-files.html
以下是工作代码:
private function GenerateDocx($theTemplate, array $theReplacemenArray, $theOutputFile)
{
$aSearchArray = array();
foreach(range('A','Z') as $aLetter) {
$aSearchArray[] = str_repeat($aLetter, 5);
}
$aArrayCountDifference = count($aSearchArray) - count($theReplacemenArray);
$aSearchArray = array_slice($aSearchArray, 0, -$aArrayCountDifference);
require_once('tbszip.php');
$tbszip = new clsTbsZip();
$tbszip->Open($theTemplate);
$aXmlPath = 'word/document.xml';
if (true === $tbszip->FileExists($aXmlPath)) {
$aXmlString = $tbszip->FileRead($aXmlPath);
$aXmlString = str_replace($aSearchArray, $theReplacemenArray, $aXmlString);
if (1 != $tbszip->FileReplace($aXmlPath, $aXmlString)) {
throw new Exception('FileReplace() failed.');
}
$tbszip->Flush(TBSZIP_FILE, $theOutputFile);
$tbszip->Close();
}
}