Генерация MySQL в Excel с использованием PHP - PullRequest
2 голосов
/ 26 апреля 2010
<?php
    // DB Connection here
    mysql_connect("localhost","root","");
    mysql_select_db("hitnrunf_db");

    $select = "SELECT * FROM jos_users ";
    $export = mysql_query ( $select ) or die ( "Sql error : " . mysql_error( ) );
    $fields = mysql_num_fields ( $export );

    for ( $i = 0; $i < $fields; $i++ )
    {
        $header .= mysql_field_name( $export , $i ) . "\t";
    }

    while( $row = mysql_fetch_row( $export ) )
    {
        $line = '';
        foreach( $row as $value )
        {
            if ( ( !isset( $value ) ) || ( $value == "" ) )
            {
                $value = "\t";
            }
            else
            {
                $value = str_replace( '"' , '""' , $value );
                $value = '"' . $value . '"' . "\t";
            }
            $line .= $value;
        }
        $data .= trim( $line ) . "\n";
    }
    $data = str_replace( "\r" , "" , $data );

    if ( $data == "" )
    {
        $data = "\n(0) Records Found!\n";
    }

    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=your_desired_name.xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    print "$header\n$data";
?>

Приведенный выше код используется для создания электронной таблицы Excel из базы данных MySQL, но мы получаем следующую ошибку:

Файл, который вы пытаетесь открыть, 'users.xls', находится в другой формат, чем указано в расширении файла. Убедитесь, что файл не поврежден и является доверенным Исходный код перед открытием файла. Хотите открыть файл сейчас?

В чем проблема и как ее исправить?

Ответы [ 7 ]

5 голосов
/ 26 апреля 2010

Вы на самом деле не генерируете файл Excel. Вы генерируете то, что составляет файл .csv, используя вкладки в качестве разделителя.

Чтобы создать «настоящий» файл Excel, используйте PHPExcel .

1 голос
/ 26 апреля 2010

Вы, похоже, генерируете файл с разделенными табуляцией полями и заявляете в своих заголовках, что это тот же формат, что и двоичная электронная таблица Excel. Это не тот формат, который использует Excel. И программа, загружающая электронную таблицу, дает вам знать, что вы вводите в заблуждение людей - возможно, только себя.

Вероятно, вам следует использовать формат экспорта, такой как файл CSV; преобразование с разделителями табуляции в разделенные запятыми не составит труда.

1 голос
/ 26 апреля 2010

Проблема в том, что когда Excel видит файл, оканчивающийся на .xls, он ожидает, что файл будет соответствовать его стандарту BIFF. Ваш код не создает BIFF-совместимый файл. Если хотите, я могу предоставить вам функции PHP, которые генерируют BIFF-совместимые файлы, но это слишком долго для публикации здесь.

0 голосов
/ 03 мая 2010

Ваша программа ищет стандартный документ .xls, который полностью отличается от того, что вы выводите. Ваша программа выводит лист с разделителями табуляции, который представляет собой файл .txt. Попробуйте переключить вашу программу с вкладок на запятые в качестве разделителей и сохранить как .csv (значение, разделенное запятыми).

0 голосов
/ 03 мая 2010

Попробуйте PEAR (PHP Расширение и хранилище приложений) Spreadsheet_Excel_Writer . Я использую это для генерации файлов Excel в формате BIFF.

0 голосов
/ 26 апреля 2010

Измените код для использования чистого CSV, а затем верните файл в браузер в качестве имени файла, заканчивающегося на .csv и тип содержимого text / csv.

Я видел, как люди пытались сделать это раньше, и это работает только с определенными конкретными версиями Office Excel. Он не работает на других платформах с другими программами для работы с электронными таблицами или с каждой версией Excel. Используйте стандартный формат файла или, по крайней мере, создайте правильный файл составного документа OLE2, который содержит данные XLS так, как Excel ожидает, если вы собираетесь отправить файл в браузер в качестве файла этого типа.

0 голосов
/ 26 апреля 2010

Если вы просто собираетесь создать файл с разделителями табуляции, почему бы не пропустить PHP и позволить MySQL сделать это для вас с SELECT INTO OUTFILE?

PHP может обработать часть загрузки. Установите заголовок Content-type на text / plain. Excel знает, как это открыть.

...