我将编写我的要求以及如何编写代码来实现它。
我必须使用特定的样式和公式在服务器上生成并保存excel文件。哪个用户稍后会下载。用户必须在生成excel时选择他想要的列。
我写的
逻辑
我在服务器上放置了一个类似样式的excel文件,但是我将在稍后填充空单元格。这样我就可以避免为所有必需的单元格设置样式代码。
然后我用数据库中的数据填充所有列。现在我读取了需要在已发布数组中删除的列的列表,并以相反的顺序删除以确保删除右列。这有效,但删除每列需要太多时间。如果列数增加,则删除单列至少需要4到5分钟,删除时间会呈指数级增长。
代码
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load($inputFileName);
$objPHPExcel->getProperties()->setCreator(user_data('name'))
->setLastModifiedBy(user_data('name'))
->setTitle("Grid file")
->setSubject("Grid file")
->setDescription("Grid file")
->setKeywords("Grid file")
->setCategory("Grids");
$col = 0;
$worksheet = $objPHPExcel->getActiveSheet();
for ($i = 19; $i < count($grid_items) + 19; $i++) {
$col = 0;
foreach ($grid_items[$i - 19] as $columnname => $value) {
$coval = PHPExcel_Cell::stringFromColumnIndex($col) . ($i);
$worksheet->setCellValue($coval, $value);
$col++;
}
}
$worksheet->removeColumnByIndex(11);
$worksheet->removeColumnByIndex(12);
$worksheet->removeColumnByIndex(13);
$worksheet->removeColumnByIndex(14);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$finalFilename = 'Master_Grid_excel_' . $this->job_id . '-' . date('Y-m-d-H-i-s') . '.xls';
$objWriter->save(SITE_ROOT . 'uploads/rfp/' . $finalFilename);
return ;
答案 0 :(得分:1)
无论如何,removeColumn()是计算密集型的;但是当你只需要调用一次时,你就称之为 4 次。 removeColumn()和removeColumnByIndex()方法接受一个可选的第二个参数,指定要删除的列数,默认为1;但如果你想删除多个连续的列(例如11,12,13和14),那么你可以这样做:
$worksheet->removeColumnByIndex(11, 4);
并且1次通话将比4次个人通话快4倍。
请注意,相同的附加参数适用于删除行和列;以及插入列和行。
但是:如果你修改了
的逻辑foreach ($grid_items[$i - 19] as $columnname => $value) {
循环,以便它不会首先写入这些列,并删除任何不必要的列以消除循环之前的标题行条目;那么你就不会对完全填充的电子表格执行removeColumn()。
答案 1 :(得分:0)
当您运行$worksheet->removeColumnByIndex(11)
并且下一列是12时,更改为=&gt; 11
所以你可以尝试使用..php函数array_reverse()big =&gt; small
$d= array_reverse(sort($chk));
foreach ($d as $v){
$worksheet->removeColumnByIndex($v);
}