PHPExcel 行数问题

PHPExcel number of row Issue

我有下一个php代码:

$arraylicitaciones=json_decode($_POST['ids']);
$x=0;
$arraydatos=array();
while($x<count($arraylicitaciones))
{
    $id=$arraylicitaciones[$x];
    $tipo=$arraylicitaciones[$x+1];
    if($tipo=='X' || $tipo=='A')
    {
        $sql="SELECT
        T1.id AS COLUMNA_A,
        T1.Expediente AS COLUMNA_B,
        T1.Organo_Contratante AS COLUMNA_C,
        T1.tipo AS COLUMNA_D,
        T1.F_Publicacion AS COLUMNA_E,
        T1.F_Vencimiento AS COLUMNA_F,
        T2.Estado AS COLUMNA_G,
        T3.Total_Licitacion_Lote_sVat AS COLUMNA_H,
        T3.Importe_Total_Lote_sVat AS COLUMNA_I,
        T3.Nro_Orden AS COLUMNA_J,
        T3.Nombre_Lote AS COLUMNA_K,
        T3.Cotizable AS COLUMNA_L,
        T4.Referencia_Organo AS COLUMNA_M,
        T4.Denominacion_Organo AS COLUMNA_N,
        T4.Unidades_Total AS COLUMNA_O,
        T4.Precio_Licitacion_sVat AS COLUMNA_P,
        T4.Nombre_Comercial AS COLUMNA_Q,
        T4.Forma_Presentacion AS COLUMNA_R,
        T4.Referencia_Proveedor AS COLUMNA_S,
        T4.Precio_sVat_Unidad_Oferta AS COLUMNA_T,
        T4.Codigo_Nacional_Med AS COLUMNA_U,
        T4.Porcentaje_Vat AS COLUMNA_V,
        T4.adjudicado_competencia AS COLUMNA_W
        FROM tesera_expedientes AS T1,tesera_estados_expediente AS T2,tesera_lotes_productos_expedientes AS T3,tesera_productos_expediente AS T4
        WHERE T1.id=T3.IdExpediente
        AND T3.Id=T4.IdLoteProductos
        AND T2.Id=T1.Estado_Expediente
        AND T1.id=".$id;
    }
    if($tipo=='D')
    {
        $sql="SELECT
        CONCAT(T1.id_expediente,'.',T1.id) AS COLUMNA_A,
        T1.derivado AS COLUMNA_B,
        T1.nombre_cliente AS COLUMNA_C,
        'Derivado' AS COLUMNA_D,
        T1.fecha_solicitud AS COLUMNA_E,
        T1.fecha_vencimiento AS COLUMNA_F,
        T2.Estado AS COLUMNA_G,
        T3.total_licitacion_lote_sin_iva  AS COLUMNA_H,
        T3.total_lote_sin_iva AS COLUMNA_I,
        T3.nro_lote AS COLUMNA_J,
        T3.nombre_lote AS COLUMNA_K,
        T3.cotizable AS COLUMNA_L,
        T4.referencia_organo AS COLUMNA_M,
        T4.denominacion_organo AS COLUMNA_N,
        T4.unidades_oferta AS COLUMNA_O,
        T4.oferta_am_sin_iva AS COLUMNA_P,
        T4.nombre_comercial AS COLUMNA_Q,
        T4.forma_presentacion AS COLUMNA_R,
        T4.referencia_proveedor AS COLUMNA_S,
        T4.oferta_sin_iva AS COLUMNA_T,
        T4.codigo_nacional_medicamento AS COLUMNA_U,
        T4.tipo_iva AS COLUMNA_V,
        T4.adjudicado_competencia AS COLUMNA_W
        FROM tesera_derivados AS T1,tesera_estados_expediente AS T2,tesera_lotes_derivados AS T3,tesera_productos_derivados AS T4
        WHERE T1.id=T3.id_derivado
        AND T3.id=T4.id_lote
        AND T2.Id=T1.id_estado_derivado
        AND T1.id=".$id;
    }
    $result= mysql_query($sql);
    $lineasdevueltas=mysql_num_rows($result);
    if($lineasdevueltas>0)
    {
        while($row=mysql_fetch_array($result,MYSQL_ASSOC))
        {
            //Comprobaciones y ediciones de columnas
            if($row["COLUMNA_D"]==0)
            {
                 $tipoarray='Expediente';
            }
            if($row["COLUMNA_D"]==1)
            {
                $tipoarray='Acuerdo Marco';
            }
            $fechapubadate=date_create($row['COLUMNA_E']);
            $fechavenadate=date_create($row['COLUMNA_F']);
            $fechapublicacion=date_format($fechapubadate, "d/m/Y");
            $fechavencimiento=date_format($fechavenadate, "d/m/Y");
            if($row['COLUMNA_L']==0)
            {
                $cotiza='NO';
            }
            else
            {
                $cotiza='SI';
            }
            if($row['COLUMNA_W']==0)
            {
                $adjudicado='NO';
            }
            else
            {
                $adjudicado='SI';
            }
            array_push($arraydatos, array(
                "COLUMNA_A"     => $row["COLUMNA_A"],
                "COLUMNA_B"     => $row["COLUMNA_B"],
                "COLUMNA_C"     => $row["COLUMNA_C"],
                "COLUMNA_D"     => $tipoarray,
                "COLUMNA_E"     => $fechapublicacion,
                "COLUMNA_F"     => $fechavencimiento,
                "COLUMNA_G"     => $row["COLUMNA_G"],
                "COLUMNA_H"     => $row["COLUMNA_H"],
                "COLUMNA_I"     => $row["COLUMNA_I"],
                "COLUMNA_J"     => $row["COLUMNA_J"],
                "COLUMNA_K"     => $row["COLUMNA_K"],
                "COLUMNA_L"     => $cotiza,
                "COLUMNA_M"     => $row["COLUMNA_M"],
                "COLUMNA_N"     => $row["COLUMNA_N"],
                "COLUMNA_O"     => $row["COLUMNA_O"],
                "COLUMNA_P"     => $row["COLUMNA_P"],
                "COLUMNA_Q"     => $row["COLUMNA_Q"],
                "COLUMNA_R"     => $row["COLUMNA_R"],
                "COLUMNA_S"     => $row["COLUMNA_S"],
                "COLUMNA_T"     => $row["COLUMNA_T"],
                "COLUMNA_U"     => $row["COLUMNA_U"],
                "COLUMNA_V"     => $row["COLUMNA_V"],
                "COLUMNA_W"     => $adjudicado
            ));
        }
    }
    $x=$x+2;
}


require_once '../../PHPExcel/Classes/PHPExcel/IOFactory.php';
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$plantilla = '../../template_excel/LicitproductdetalletemplateBIS.xls';
$objPHPExcel = $objReader->load($plantilla);
//------GENERACION EXCEL------//
$posicion=3;
$inicio=3;
$final=1650+2;
for($i=0;$i<1650;$i++)
{
    $objeto=$arraydatos[$i];
    $objPHPExcel->getActiveSheet()
    ->setCellValue('A'.$posicion, $objeto[COLUMNA_A])
    ->setCellValue('B'.$posicion, $objeto[COLUMNA_B])
    ->setCellValue('C'.$posicion, $objeto[COLUMNA_C])
    ->setCellValue('D'.$posicion, $objeto[COLUMNA_D])
    ->setCellValue('E'.$posicion, $objeto[COLUMNA_E])
    ->setCellValue('F'.$posicion, $objeto[COLUMNA_F])
    ->setCellValue('G'.$posicion, $objeto[COLUMNA_G])
    ->setCellValue('H'.$posicion, $objeto[COLUMNA_H])
    ->setCellValue('I'.$posicion, $objeto[COLUMNA_I])
    ->setCellValue('J'.$posicion, $objeto[COLUMNA_J])
    ->setCellValue('K'.$posicion, $objeto[COLUMNA_K])
    ->setCellValue('L'.$posicion, $objeto[COLUMNA_L])
    ->setCellValue('M'.$posicion, $objeto[COLUMNA_M])
    ->setCellValue('N'.$posicion, $objeto[COLUMNA_N])
    ->setCellValue('O'.$posicion, $objeto[COLUMNA_O])
    ->setCellValue('P'.$posicion, $objeto[COLUMNA_P])
    ->setCellValue('Q'.$posicion, $objeto[COLUMNA_Q])
    ->setCellValue('R'.$posicion, $objeto[COLUMNA_R])
    ->setCellValue('S'.$posicion, $objeto[COLUMNA_S])
    ->setCellValue('T'.$posicion, $objeto[COLUMNA_T])
    ->setCellValue('U'.$posicion, $objeto[COLUMNA_U])
    ->setCellValue('V'.$posicion, $objeto[COLUMNA_V])
    ->setCellValue('W'.$posicion, $objeto[COLUMNA_W]);
//------FORMATO SI/NO FINAL------//
if($objeto[COLUMNA_W]=='SI')
{
    $objPHPExcel->getActiveSheet()->getStyle('W'.$posicion)->getFill()
    ->applyFromArray(array('type' => PHPExcel_Style_Fill::FILL_SOLID,
            'startcolor' => array('rgb' => 'FFFF00')
    ));
}
else
{
    $objPHPExcel->getActiveSheet()->getStyle('W'.$posicion)->getFill()
    ->applyFromArray(array('type' => PHPExcel_Style_Fill::FILL_SOLID,
            'startcolor' => array('rgb' => 'FFFFCC')
    ));
}
//++++++FORMATO SI/NO FINAL++++++//
$posicion=$posicion+1;
}
//++++++GENERACION EXCEL++++++//
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$file = '../../ficheros_excel/LicitProducDetalle.xls';
$objWriter->save($file);
$path_php=$_SERVER[HTTP_REFERER];
$path_xls=str_replace('js/Licitaciones.html','ficheros_excel/LicitProducDetalle.xls',$path_php);
 ?>
<script>
var control=0;
var control2=0;
ele=document.getElementsByTagName('div');
for (i=0;(i<ele.length)&&(control==0);i++){
    if((ele[i].style.width == '158px')&&(ele[i].class='x-shadow')){
        ele[i].style.display='none';
        control2=1;
    }
    if((ele[i].style.width == '150px')&&(control2==1)){
        ele[i].style.display='none';
        control=1;
    }
}
window.open('<?php echo $path_xls; ?>');
</script>

执行查询后生成的查询数组returns超过5000rows.I想知道,如果有人能帮忙,为什么我只写1640行,每行23列,phpexcel 生成 .xls 文件,但是如果我也写了 1650 行和 23 列,服务器会给我一个错误 500(内部服务器错误)

检查错误日志,检查内存使用情况或超时情况,考虑使用单元格缓存来减少内存使用情况,或者如果超时则增加 PHP 的时间限制。

考虑将数据库行直接写入 PHPExcel,而不是从数据库行构建一个大数组,然后迭代该数组以构建电子表格....这样速度更快,而且可以节省内存。

1.) 编辑:正确.. PHP 实现似乎并非如此.. 继续使用 xls

2.) PHPExcel 在内存使用方面效率低下。标准 PHP 限制仅为 100mb 内存 - 要么尝试增加内存并查看它是否对您足够好,要么转向其他库。

考虑 https://github.com/mk-j/PHP_XLSXWriter 以降低内存使用量 它的速度非常快,占用的内存很少 - 但不支持样式。

另一种选择是https://github.com/SystemDevil/PHP_XLSXWriter_plus 我从未使用过它,但理论上它可以支持 stying 并且是另一个项目的分支,我会试一试