我正在使用PhpExcel创建包含可变数据量的文件。以下是它的工作原理:
我在FF,Chrome,Opera和IE9上测试过它,一切似乎都很好。 zip存档有效,我可以提取所有正确生成的xlsx文件。
不幸的是,在IE10上,发生了一些奇怪的事情:它只能工作一半时间(我尝试了一次,它没有用。我刷新了。它很有效。我刷新了。它不起作用等等)。 会发生什么是缺少一个或多个xlsx文件。例如,我希望有16个文件,我只收到15个。
所以我做了这样的事情:当用户点击“To 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脚本”:
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脚本”时,它知道临时文件夹中应该有多少文件。所以它等到每个文件都到达,然后创建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文件。