行的PHPExcel numbre问题

时间:2015-10-09 11:41:51

标签: php phpexcel

我有下一个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>

执行查询后生成的查询数组返回超过5000行。我想kwon,如果有人可以提供帮助,为什么如果我只写1640行每行23列,phpexcel会生成.xls文件但是如果我写入1650行,共23列,服务器给我一个错误500(内部服务器错误)

1 个答案:

答案 0 :(得分:1)

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

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