PHPExcel创建“不可读的内容”

时间:2013-03-03 21:35:41

标签: php phpexcel

我试图用1000种不同的方法解决这个问题。感谢是否有其他人能发现问题。

我使用PHPExcel生成代码,生成多个Excel工作表并将其保存到磁盘。

当使用MS Excel 2010打开第二个文件中的所有内容时,我收到错误“Excel在FILENAME中找到了不可读的内容。是否要恢复此工作簿的内容。”该文件已“恢复”并且工作正常。在OPEN Office开业不会产生任何错误。

这是代码的简化版本。

<?php
$filenames = array("filenames go here");

$sheet1 = PHPExcel_IOFactory::load($template1);
$writer1 = new PHPExcel_Writer_Excel2007($sheet1);
$writer1->save('somefilename.xlsx');
//This file opens without problem
$sheet1->disconnectWorksheets();
unset($sheet1);
unset($writer1);

$i = 0;
foreach($filenames as $file){
    $template = "template2.xlsx";
    $fileName = 'filename' . $i . ' .xlsx';
    $spreadsheet = PHPExcel_IOFactory::load($template);
    $objWriter = new PHPExcel_Writer_Excel2007($spreadsheet);
    $objWriter->save($fileName);
    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);
    //This file throws error when opened in Excel 2007+
    $i++;
 }
?>

我检查了以下内容:

  1. 没有明显的php错误消息,空白或无关输入会破坏文件。
  2. 模板文件在Excel 2010中正常打开。
  3. 我尝试过使用不同的PHPExcel编写器方法,但它们都会产生同样的问题。
  4. 真正的代码完成了一大堆额外的东西,但我已经通过评论它来检查它是不负责任的。上面的代码似乎是唯一可以引入问题的地方。

    感激地收到任何建议。

    ==== EDITED ==== 这是Excel生成的错误日志:

    <?xml version="1.0" encoding="UTF-8" standalone="true"?>
    -<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
         <logFileName>error049120_01.xml</logFileName>
         <summary>Errors were detected in file 'C:\Users\USERNAME\AppData\Local\Temp\FILENAME.xlsx'</summary>
         -<additionalInfo>
               <info>Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.</info>
         </additionalInfo>
    </recoveryLog>
    

5 个答案:

答案 0 :(得分:8)

我的文件出现了类似的错误,并按照Andrey Yanko发布的推荐,但我仍然收到类似的错误。我在另一个post上找到了建议并添加了

  

“退出”;

在我的脚本末尾,有助于删除剩余的错误

答案 1 :(得分:4)

此错误与php.ini中的配置mbstring.func_overload有关。 您可以使用变通方法来避免此错误 - 只需在脚本开头添加:

if (function_exists('mb_internal_encoding')) {
    $oldEncoding=mb_internal_encoding();
    mb_internal_encoding('latin1');
}

最后:

if (function_exists('mb_internal_encoding'))
    mb_internal_encoding($oldEncoding);

它帮助了我,所以,我相信它对你也有帮助。

答案 2 :(得分:2)

明显的问题:

$sheet1 = PHPExcel_IOFactory::load($template1);
$writer1 = new PHPExcel_Writer_Excel2007($sheet1);
$writer1->save(sheet1);

save($sheet1) - $ sheet1不是文件名,它是一个PHPExcel对象,一个完整的工作簿...... save方法需要你想要保存的文件名作为参数

foreach($filenames as $file){
    $template = "template2.xlsx";
    $fileName = 'filename.xlsx';
    $spreadsheet = PHPExcel_IOFactory::load($template);
    $objWriter = new PHPExcel_Writer_Excel2007($spreadsheet);
    $objWriter->save($fileName);
    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);
}

每个循环使用相同的文件名保存,覆盖以前迭代的任何保存

如果MS Excel抱怨内容不可读但仍然打开文件,它通常会告诉您丢弃了什么以使文件可读...但是不知道该消息,或者看到实际文件的副本,它是无法帮助你。

答案 3 :(得分:1)

是否可以将其保存为.xls而不是.xlsx

打开一个新的.xlsx,重命名为.xls,会给我一个类似的警告。

答案 4 :(得分:0)

看来这个bug与我用作“模板”的单个xlsx文件有关。当另一个文件用作模板时,代码工作正常。

原始模板似乎没有损坏,因此PHPExcel沿线的某处导致了问题,但不确定在哪里。