Сгенерированный PHP файл Excel отличается при загрузке - PullRequest
3 голосов
/ 14 сентября 2010

У меня есть файл PHP, который генерирует файлы xls с помощью модуля, найденного по адресу http://pear.php.net/package/Spreadsheet_Excel_Writer/

. Я могу просто создать образец документа, а когда я его открою, он выглядит нормально.Мой следующий шаг - превратить его в скачиваемую ссылку.Для этого я сделал следующее:

    $mimeType = "application/vnd.ms-excel";
    $file_name = "test.xls";
    $file_path = "/tmp/".$file_name;
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header('Content-Type: application/' . $mimeType);
    header('Content-Length: '.$size);
    header("Content-Disposition: attachment;filename=$file_name ");
    header("Content-Transfer-Encoding: binary ");

    // open the file in binary read-only mode
    // display the error messages if the file can´t be opened
    $file = & fopen($file_path, 'rb');

    if ($file) {
        // stream the file and exit the script when complete
        fpassthru($file);
        exit;

    } else {
        echo $err;
    }

Однако, когда я загружаю файл, он содержит много мусорных данных как в Excel, так и в OpenOffice.В diff говорится, что двоичный файл в папке / tmp и загруженный файл отличаются друг от друга.Я предполагаю, что это как-то связано с заголовками или с fpassthru, но мне не очень повезло с отладкой проблемы.

Есть идеи по поводу проблемы?

Ответы [ 4 ]

0 голосов
/ 05 августа 2016

Добавьте следующий код вверху страницы, где генерируется файл Excel.

ob_clean ();

Это очистит все бессмысленные данные. Такжепроверьте наличие любых эхо-операторов. Если эхо-операторы присутствуют, удалите их.Данные всегда должны быть представлены в формате, указанном в пакете Excel.

0 голосов
/ 11 июня 2013

Просто убедитесь, что вы НИЧЕГО не отправляете в браузер ДО того, как фактический контент файла будет отправлен.

Это может быть просто ошибка php или даже "уведомление", которое создает Spreadsheet_Excel_Writer, а вы даже не видите. Или это может быть закрывающий тег '?>, За которым следует простой пробел или символ новой строки.

У меня была похожая ошибка, когда работал файл, созданный в веб-папках. Однако доставка с использованием заголовка ('...') дала мне поврежденные файлы. Это произошло из-за одного пробела в конце одного файла php после закрывающего тега «?>».

0 голосов
/ 09 июля 2015

Я использую ту же библиотеку, и я только что обнаружил, что файлы в самой библиотеке создают пробелы.

Решение. В следующих файлах удалите пробелы в конце файла или удалите закрывающий тег ?> в конце.

Файлы для редактирования (все файлы в Spreadsheet_Excel_Writer package):

Writer.php 
Workbook.php
Worksheet.php
PPS.php
Parser.php
OLE.php
Parser.php
File.php
BIFFWriter.php
Validator.php
Root.php
0 голосов
/ 14 сентября 2010

Несколько заголовков Content-Type не нужны. По сути, вы говорите, что файл - это маффин, пицца и форд Телец одновременно. Все, что вам нужно, это application/octet-stream версия, если вы не хотите указывать точный тип пантомимы.

Также, есть ли причина, по которой вы пытаетесь превратить дескриптор файла, возвращаемый fopen(), в ссылку?

Попробуйте что-нибудь попроще:

<?php

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment;filename=$file_name");

readfile("/tmp/test.xls");

exit();
?>

и посмотрим, будет ли это лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...