1

我正在使用 PhpExcel 创建包含可变数量数据的文件。这是它的工作原理:

  • 用户选择开始日期和结束日期
  • 生成配置文件列表
  • 用户单击一个名为“To Excel”的按钮,然后生成一个文件,其中包含每个配置文件的两个选定日期之间的事件列表
  • 创建每个 xlsx 文件后,将生成一个 zip 存档并出现常用下载窗口

我在 FF、Chrome、Opera 和 IE9 上对其进行了测试,一切似乎都很好。zip 存档是有效的,我可以提取所有正确生成的 xlsx 文件。

不幸的是,在 IE10 上,发生了一些奇怪的事情:它只工作了一半(我尝试过一次,它不起作用。我刷新了。它起作用了。我刷新了。它不起作用等等)。发生的情况是缺少一个或多个 xlsx 文件。例如,我预计会有 16 个文件,但我只收到了 15 个。

所以我做了这样的事情:当用户点击“到 Excel”按钮时,对于列表的每个元素,完成一个 AJAX 请求并调用“Excel 脚本”

$.ajax({
   type: "GET",
   url: "rap_spec_excel_alt.php",
   data: "displayFacturation="+displayFacturation+"&startDateRapSpec="+startDate+"&endDateRapSpec="+endDate+"&codeEntSpec="+thisVal+"&delete=0&download=0&nbfiles="+nbFilesExpected,
   success: function(data) {       
   },
   error: function() {   
   }   
});

我还测试当前元素是列表的第一个元素还是最后一个元素。如果它是第一个元素,在我的“Excel 脚本”中,我清空包含旧 xlsx 文件的临时文件夹。如果它是最后一个元素,在成功时,我会这样称呼“Zip Script”:

window.open("download_xls_zip.php?nbfiles="+nbFilesExpected);

所以,这样,我就有了“确认下载框”。我的“Excel 脚本”很大,所以我不会完全发布它,但这里是一瞥:

//Delete old files
if ($_GET["delete"] == 1) {
    $files = glob('tempxls/*');
        foreach($files as $file){
          if(is_file($file)) {
              unlink($file);
          }
     }
}

//PHPExcel
include '../libs/pclzip/pclzip.lib.php';
error_reporting(E_ALL);
include '../libs/phpexcel/Classes/PHPExcel.php';
include '../libs/phpexcel/Classes/PHPExcel/Writer/Excel2007.php';

$objPHPExcel = new PHPExcel();

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);

$objPHPExcel->getProperties()->setCreator("John Doe");
$objPHPExcel->getProperties()->setLastModifiedBy("John Doe");
$objPHPExcel->getProperties()->setTitle($year.$month."_".$_GET["codeEntSpec"]);
$objPHPExcel->getProperties()->setSubject("File for ".$_GET["codeEntSpec"]);
$objPHPExcel->getProperties()->setDescription("File for ".$_GET["codeEntSpec"]);

$objPHPExcel->getDefaultStyle()->getFont()->setName('Arial');
$objPHPExcel->getDefaultStyle()->getFont()->setSize(8); 

$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(7.33);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(8);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(9.33);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(22.67);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(15.67);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(14.67);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(10.83);
$objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(9);

$objPHPExcel->setActiveSheetIndex(0);

//... AND SO ON ...

$objPHPExcel->getActiveSheet()->setTitle("File for ".$_GET["codeEntSpec"]);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('tempxls/'.$year.$month.'_'.$_GET["codeEntSpec"].'.xlsx');

当调用“Zip Script”时,它知道临时文件夹中应该有多少文件。所以它会等到每个文件都到达,然后创建 zip 存档。

//PCLZip
include '../libs/pclzip/pclzip.lib.php';

//Number of files expected  
$nbFilesExpected  = $_GET["nbfiles"];

$filecount = 0;

//Count the files in the folder 
while ($filecount != $nbFilesExpected) {
    $dir = 'tempxls';

    $i = 0; 
    if ($handle = opendir($dir)) {
    while (($file = readdir($handle)) !== false){
        if (!in_array($file, array('.', '..')) && !is_dir($dir.$file)) 
            $i++;
        }
    }

    $filecount = $i;
}

//Zip archive
if ($filecount == $nbFilesExpected) {

    $archive = new PclZip('tempzip/archive.zip');
    $archive->add('tempxls/');

    header("content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=archive.zip"); 
    readfile("tempzip/archive.zip"); 
    flush(); 
    unlink("tempzip/archive.zip");
}

就像我说的,FF、Chrome、Opera 和 IE9 一切都很好。文件在那里,zip 存档也有,xlsx 文件格式正确,数据正确。但不是在IE10中...

我注意到的是,如果我在每个日期之间选择一个大的间隔,我会有更多的数据(当然)。因此,某些文件没有创建,因为它们太大(我的服务器有一些限制)并且出现了致命错误。因此,由于缺少某些文件,无法创建 zip 存档。

我认为这可能是答案,我试图用“$cacheMethod”解决这个问题,但没有奏效。当问题出现时,我查看了 IE10 的控制台,但什么也没有(我什至在 IE 上安装了 Firebug ...)。

有人可以帮我一把,或者只是向我解释我做错了什么吗?会很感激的!非常感谢!

编辑

这是我在 IE10 上使用 Firebug 时得到的结果

标头

ResponseHeaders
> Date Tue, 20 Aug 2013 09:06:37 GMT 
> Server Apache
> Expires Thu, 19 Nov 1981 08:52:00 GMT
> Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
> Pragma no-cache
> Connection close
> Content-Type text/html

RequestHeaders
> Accept */* 
> X-Requested-With XMLHttpRequest 

回复

空的

编辑 2

如果我设置它似乎工作:

async: false

因此,文件一个接一个地创建。然后,我的 zip 存档中有正确数量的 xlsx 文件。

4

0 回答 0