PHPExcel:异常"无法关闭zip文件"在第二个创建的文件

时间:2015-04-16 16:23:50

标签: php phpexcel

社区,

我使用XLSX工作簿作为模板并基于它动态创建新工作簿但是每当我尝试保存第二个工作簿时,脚本都会以致命错误Uncaught exception 'PHPExcel_Writer_Exception' with message 'Could not close zip file'终止。该错误通常指向不正确的目录权限,但如上所述,第一个文件已正确创建并在Excel中打开。

我的假设是某种类型的引用没有被取消,这就是为什么我将整个读取/保存部分移动到我的类的单独函数而不必处理未关闭的引用。这是处理读写的代码的一部分:

private function createDocument($arrKitInfo, $data) {

    $excel = PHPExcel_IOFactory::load('files/kit/export/order-list-must-points.xlsx');
    $excel->setActiveSheetIndex(0);
    $worksheet = $excel->getActiveSheet();

    // skipped: filling in sheet data ...

    $safeFileTitle= FSHelper::createSafeFileName(substr($arrKitInfo['description_en'], 0, 100));
    $destinationFileName= $safeFileTitle.'.xlsx';
    $fileName = sys_get_temp_dir(). $destinationFileName;

    $objWriter = PHPExcel_IOFactory::createWriter($excel, "Excel2007");
    $objWriter->save($fileName);

    unset($objWriter, $worksheet);

    $excel->disconnectWorksheets();
    unset($excel);
}

// main routine
public function run() {
  foreach ($arrKits as $kit) {
    // ... skipped: load info for the given kit
    $this->createDocument($arrKitInfo, $data);
  }
} 

服务器正在运行PHP 5.2的最新更新(服务器上运行的大多数应用程序仍在使用mssql_函数,不能选择迁移到最新的PHP版本)并且PHPExcel是在1.7.9。

提前感谢您的建议。

- 更新2015-04 -

它似乎不是ZipArchive模块的错误,以下测试脚本没有产生任何错误:

$intLoops = 6;

for ($intRun = 0; $intRun < $intLoops; $intRun++) {
  $baseArchive = new ZipArchive();
  $destArchive= new ZipArchive();
  $destArchive->open('sample'.$intRun.'.zip', ZipArchive::CREATE);
  if ($baseArchive->open('example1.zip')) {
    for ($i = 0; $i < $baseArchive->numFiles; $i++) {
      print $baseArchive->getNameIndex($i) . '<br />';
      $destArchive->addFromString($baseArchive->getNameIndex($i), $baseArchive->getFromIndex($i));
    }
  }
  $baseArchive->close();
  $destArchive->close();
  unset($baseArchive);
}

现在尝试调试PHPExcel_Writer_Excel2007并查看是否还有更多内容。

1 个答案:

答案 0 :(得分:1)

错误不是由PHPExcel引起的,而是由于文件名中的控制字符(换行符和换行符)而引起的。检查隐形字符有助于我找到字符:

$safeFileTitle = FSHelper::createSafeFileName(substr($arrKitInfo['description_en'], 0, 50));
for ($il=0;$il<strlen($safeFileTitle);$il++) {
  print $safeFileTitle[$il].':'.ord($safeFileTitle[$il]).PHP_EOL;
}

然后我修改了我的帮助函数以删除不可见的字符:

  public static function createSafeFileName($fileName) {
    // remove all kinds of possibly invalid characters and restrict to characters, digits and whitespace ...
    $fileName = preg_replace("([^\w\s\d\-_~,;:\[\]\(\).])", '', $fileName);
    // ... and remove control characters
    return preg_replace('/[\x00-\x1F\x7F]/', '', $fileName);
  }

更改后,工作簿创建没有任何问题。