Excel не может открывать файл 'Prueba.xls', потому что формат или расширение этого не являются действительными

С мало прихожу с этой проблемой, которая я даже не даю ему какое-либо решение, у меня есть функция, которая верила бы в файл excel с данными, которых я приношу из базы данных, у aplicativo, во время того, чтобы быть выполненным локально, нет никакой проблемы, в момент собирания этого в моем vps (в облако) эта функция падает, в начале я подумал, что он был версии PHP, так что actualize php моего сервера и в моей машине я имею 5.30 по отношению к 5.25, но sique с этой ошибкой.

это сообщение, из которого он выходит во время загружения облака:

introducir la descripción de la imagen aquí

Это сравнительная одна:

introducir la descripción de la imagen aquí

В конце концов я оставляю фрагмент кода:

public function exportar_excel_usuarios() {

    ob_start();
    set_time_limit(0);
    setlocale(LC_ALL, 'es_ES');
    $fecha_reporte = date('d/m/Y H:i:s');
    ini_set('memory_limit', '-1');
    $lista = null;
    $lista = $this->Usuario_model->listar_reporte();

    $this->load->library('excel');
    $hoja = $this->excel->getActiveSheet();
    $this->excel->setActiveSheetIndex(0);
    $hoja->setTitle('ASUNTOS');
    $hoja->setCellValue('A1', 'REPORTE DE USUARIOS ' . $fecha_reporte);
    $hoja->getStyle('A1')->getFont()->setSize(24);
    $hoja->getStyle('A1')->getFont()->setBold(true);
    $hoja->mergeCells('A1:G1');
    $hoja->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

    $cabecera_columna = array(
        'APELLIDOS',
        'NOMBRES',
        'NUM. DOC.',
        'OFICINA',
        'USUARIO',
        'ROL',
        'PAGINAS',
    );

    $hoja->fromArray($cabecera_columna, NULL, 'A2');
    $hoja->setAutoFilter('A2:G2');
    $hoja->getStyle('A2:G2')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('BDD7EE');
    $hoja->getColumnDimension('A')->setAutoSize(true);
    $hoja->getColumnDimension('B')->setAutoSize(true);
    $hoja->getColumnDimension('C')->setAutoSize(true);
    $hoja->getColumnDimension('D')->setAutoSize(true);
    $hoja->getColumnDimension('E')->setAutoSize(true);
    $hoja->getColumnDimension('F')->setAutoSize(true);
    $hoja->getColumnDimension('G')->setAutoSize(true);

    $cont = 3;
    foreach ($lista as $obj) {


        $hoja->setCellValue('A' . $cont, $obj->apellidos);
        $hoja->setCellValue('B' . $cont, $obj->nombres);
        $hoja->setCellValueExplicit('C' . $cont, $obj->numdoc, PHPExcel_Cell_DataType::TYPE_STRING);
        $hoja->setCellValue('D' . $cont, $obj->oficina);
        $hoja->setCellValue('E' . $cont, $obj->usuario);
        $hoja->setCellValue('F' . $cont, $obj->rol);
        $hoja->setCellValue('G' . $cont, $obj->permisos);

        $cont ++;
    }

    $date = new DateTime ();
    $date = $date->getTimestamp();
    $filename = 'REPORTE_USUARIOS_' . $date . '.xls';

    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="' . $filename . '"');
    header('Cache-Control: max-age=0');
    $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
    ob_end_clean();
    $objWriter->save('php://output');
}

4
задан 12.06.2017, 16:43
4 ответа

EdiciГіn

Проблема была обнаружена. У excel есть в начале символы файла UTF-8 с BOM (он помечает команды байт) :

00000000  ef bb bf d0 cf 11 e0 a1  b1 1a e1 00 00 00 00 00  |................|

Символы ef bb bf составляют BOM, что показывает, что один из файлов PHP это использует, agregГЎndose в начале файла excel произведено, вызывая, что Г©ste не estГ© правильно сформированный.

мы работаем, чтобы встречать файла и удалять BOM.


начальный Ответ

Существуют три возможные причины твоей проблемы:

  • Твоя программа PHP начинается с местом в мишени или один BOM (он помечает команды байт) . Он это производит envГ - или данных перед excel (он помещает _<?php).
  • carГЎcter, который ты показываешь, обычно случается из-за той же предыдущей проблемы, произведенной возвратом автомобиля раньше или despuГ©s какого-то открытия или завершения PHP в algГєn рукописный шрифт, что estГ©s включая (<?php или ?>).
  • В algГєn сторона тебя cГіdigo (перед тем, как выполнять ob_start()) estГЎ бросая сообщение предупреждения (например Г-ndice не существующего массива) приводя в негодность из-за этого формат excel, который ты вручаешь.

, Так как мы не располагаем cГіdigo, я завершаю, чтобы спорить dГіnde estГЎs оставляя этот carГЎcter добавочный, рекомендую тебе проверять добросовестно каждое открытие и завершение PHP, чтобы подтвердить, что нет ningГєn carГЎcter даже разрыва lГ-nea добавочный (ты можешь использовать шестнадцатеричный редактор, если ты чувствуешь себя cГіmodo manejГЎndolos).

Ты Используешь временный прием с ob_start() и ob_end_clean () , которые помогают тебе отлаживать эти проблемы между обоими, но deberГ-схвати помещать ob_start() в начале PHP, как первая lГ-nea cГіdigo. Таким образом podrГЎs захватывать любое сообщение с того же начала ее ejecuciГіn рукописного шрифта PHP, не sГіlo внутри этой funciГіn.

- один funciГіn полностью безвредная для любого другого обычного функционирования PHP, а следовательно ты можешь использовать это каждый раз, когда ты хотел с полной свободой (хотя идеальное состоит в том, чтобы проверять причину raГ-z проблемы).

Как только ты изменил ob_start() в начале cГіdigo, как первая lГ-nea, он изменяет конец с этим, чтобы файл производится с сообщением предупреждения или добавочных символов, что ты estГЎn беспокоя:

$objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
/* Obtenemos los caracteres adicionales o mensajes de advertencia y los
  guardamos en el archivo "depuracion.txt" si tenemos permisos */
file_put_contents('depuracion.txt', ob_get_contents());
/* Limpiamos el búfer */
ob_end_clean();
$objWriter->save('php://output');
7
ответ дан 24.11.2019, 08:59
  • 1
    Уже измените код я надеюсь, что он помогает мне немного больше – Ivan More Flores 22.05.2017, 20:00
  • 2
    ¿ Он следует за тобой не удаваясь? Не sé если это ошибка, прикрепив có я говорю, но fí jate, что есть montó n места в мишени в первом PHP перед <?php. Quí talos все. – OscarGarcia 22.05.2017, 20:02
  • 3
    тебя оставил мой файл php, пересланный drive, enserio я занимаю время с этим и не могу исправлять это, и самый худший q только он в этом проекте является чем-то из кода drive.google.com/open?id=0B-h71-fJAWEdUHJuR3lHNFRUNzQ – Ivan More Flores 22.05.2017, 20:08
  • 4
    В принципе с текстовым редактором моего mó подлый я не вижу место, habrá бывший неудача, прикрепив có я говорю в вопросе. Но я вижу, что aú n ты не сделал изменения, что ты recomendé. ¿ Podrí схвати тестировать их и говорить мне qué такой он пошел с ними? – OscarGarcia 22.05.2017, 20:23
  • 5
    ond_start() будь хорошо там? <?php defined('BASEPATH') or exit('No direct script access allowed'); ob_start(); – Ivan More Flores 22.05.2017, 20:31

Она soluciГіn внесенная автором вопроса в одной revisiГіn самого вопроса .

Она soluciГіn состоит в:

Входить в мой файл index.php из моего controler (потому что я использую интегральную микросхему), чего в моем случае было inicio.php размещать ob_start() после <?php; и потом в других драйверах, где у него была функция создания excel Следующий код, это конечный результат:

public function exportar_excel_usuarios() {


        set_time_limit(0);
        setlocale(LC_ALL, 'es_ES');
        $fecha_reporte = date('d/m/Y H:i:s');
        ini_set('memory_limit', '-1');
        $lista = null;
        $lista = $this->Usuario_model->listar_reporte();

        $this->load->library('excel');
        $hoja = $this->excel->getActiveSheet();
        $this->excel->setActiveSheetIndex(0);
        $hoja->setTitle('ASUNTOS');
        $hoja->setCellValue('A1', 'REPORTE DE USUARIOS ' . $fecha_reporte);
        $hoja->getStyle('A1')->getFont()->setSize(24);
        $hoja->getStyle('A1')->getFont()->setBold(true);
        $hoja->mergeCells('A1:G1');
        $hoja->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

        $cabecera_columna = array(
            'APELLIDOS',
            'NOMBRES',
            'NUM. DOC.',
            'OFICINA',
            'USUARIO',
            'ROL',
            'PAGINAS',
        );

        $hoja->fromArray($cabecera_columna, NULL, 'A2');
        $hoja->setAutoFilter('A2:G2');
        $hoja->getStyle('A2:G2')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('BDD7EE');
        $hoja->getColumnDimension('A')->setAutoSize(true);
        $hoja->getColumnDimension('B')->setAutoSize(true);
        $hoja->getColumnDimension('C')->setAutoSize(true);
        $hoja->getColumnDimension('D')->setAutoSize(true);
        $hoja->getColumnDimension('E')->setAutoSize(true);
        $hoja->getColumnDimension('F')->setAutoSize(true);
        $hoja->getColumnDimension('G')->setAutoSize(true);

        $cont = 3;
        foreach ($lista as $obj) {


            $hoja->setCellValue('A' . $cont, $obj->apellidos);
            $hoja->setCellValue('B' . $cont, $obj->nombres);
            $hoja->setCellValueExplicit('C' . $cont, $obj->numdoc, PHPExcel_Cell_DataType::TYPE_STRING);
            $hoja->setCellValue('D' . $cont, $obj->oficina);
            $hoja->setCellValue('E' . $cont, $obj->usuario);
            $hoja->setCellValue('F' . $cont, $obj->rol);
            $hoja->setCellValue('G' . $cont, $obj->permisos);

            $cont ++;
        }

        $date = new DateTime ();
        $date = $date->getTimestamp();
        $filename = 'REPORTE_USUARIOS_' . $date . '.xls';

        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="' . $filename . '"');
        header('Cache-Control: max-age=0');
        $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel5');
        /* Obtenemos los caracteres adicionales o mensajes de advertencia y los
          guardamos en el archivo "depuracion.txt" si tenemos permisos */
        file_put_contents('depuracion.txt', ob_get_contents());
        /* Limpiamos el búfer */
        ob_end_clean();
        $objWriter->save('php://output');
    }
1
ответ дан 24.11.2019, 08:59

Ошибка появляется просто, потому что estГЎs устанавливая формат Excel, как Excel5 и estГЎs используя одну extensiГіn .xls

ты Должен устанавливать ее extensiГіn, как .xlsx

$filename = 'REPORTE_USUARIOS_' . $date . '.xlsx';

Издал, не я habГ - в фиксирование в, который ты считаешь определенным content type.

Для версий Excel начиная с 2007, правильный content type - следующий

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

И как конечное доказательство, вместо Excel5 он использует writer для Excel 2007:

$objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel2007');
0
ответ дан 24.11.2019, 08:59

Они могут получаться эти сообщения ошибки также,

a) Есть ли ошибки compilaciГіn в частях, которые не заголовки.

b) Заголовки estГЎn ПЕРЕД контентом.

Попытались комментировать весь контент и оставлять только заголовки, чтобы подтверждать, сохраняется ли ошибка. Это сообщение ошибки может заставлять вас очень ходить думая о типах данных, когда у них нет иногда ничего, который видеть с реальной проблемой

0
ответ дан 24.11.2019, 08:59

Теги

Похожие вопросы