1

我尝试了大约 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 编写器方法,但它们都会产生相同的问题。

真正的代码做了一大堆额外的东西,但我已经通过注释它来检查它是否不负责任。上面的代码似乎是唯一可能引入问题的地方。

任何建议都非常感激。

====已编辑==== 这是 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>
4

5 回答 5

9

我的文件中出现了类似的错误,并遵循了 Andrey Yanko 发布的建议,但是我仍然收到类似的错误。我在另一篇文章中找到了建议添加了一个

“出口;”

在我的脚本结束时,这有助于消除剩余的错误

于 2015-11-18T15:43:44.840 回答
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);

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

于 2013-11-29T07:36:06.597 回答
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 抱怨内容不可读,但仍打开文件,它通常会告诉您丢弃了什么以使文件可读......但不知道该消息或查看实际文件的副本,无法提供帮助你。

于 2013-03-03T21:52:42.560 回答
1

可能是您将其保存为.xls不保存.xlsx吗?

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

于 2013-03-03T21:37:00.527 回答
0

看来此错误与我用作“模板”的单个 xlsx 文件有关。当使用另一个文件作为模板时,代码可以正常工作。

原始模板似乎没有损坏,所以 PHPExcel 的某个地方引起了问题,但不确定在哪里。

于 2013-03-05T22:02:03.183 回答