LiteNet.Ru - Актуально о ПК и ПО. 2006-2019.
СТАТЬИ | НОВОСТИ | ПРОГРАММЫ | ОБРАТНАЯ СВЯЗЬ | КАРТА САЙТА
Сейчас на сайте: 1 гость онлайн
Обновления
Комментарии betvisa affiliate ... [14.04.24]
Материал Установил CentOS 7 как легко и просто настроить ssh доступ? [24.03.24]
Комментарии Спасибо... [17.02.24]
Материал Форма ввода php [08.05.23]
Материал Windows 11 LTSC выйдет во второй половине 2024 года [08.05.23]
Материал Microsoft прекратит выпуск обновлений для Windows 10 [29.04.23]
Комментарии Огромный респект и... [04.10.22]
Комментарии не помогло... [10.07.22]
Комментарии не получается войт... [02.11.21]
Комментарии Да нет в редакторе... [05.10.21]
Комментарии Toshiba Tecra s11 ... [21.07.21]
Комментарии Все получилось, сп... [21.07.21]
Комментарии не сработало... [04.06.21]
Комментарии Доброго времени! У... [27.03.21]
Комментарии У меня этот метод ... [19.03.21]
Комментарии всё испробовал,не ... [17.03.21]
Материал Представлена настоящая зарядка по воздуху Xiaomi Mi Air Charge [31.01.21]
Материал Отныне для запуска WhatsApp на ПК и в браузере требуется биометрия [31.01.21]
Материал Google Chrome 88.0.4324.104 [31.01.21]
Материал Avast Free Antivirus 20.10.5824 [31.01.21]
Материал Яндекс.Браузер 20.12.3.138 [31.01.21]
Материал Maxthon 6.1.1.1000 [31.01.21]
Материал MKVToolnix 53.0.0 [31.01.21]
Материал ProduKey 1.95 [31.01.21]

RSS

Последние добавленные статьи

Выгрузка данных в Excel из базы MySql
29.01.2013

PHP логотипУ многих при работе с php в связке с MySql возникает такая потребность как экспорт данных из базы в формат xls для того чтобы люди, которым нужны эти данные, обрабатывали их в программе Excel или просто пользователям было удобно смотреть эти данные. Недавно у меня возникла такая потребность и сегодня я расскажу, как это дело можно реализовать.

Сразу скажу, что этот способ достаточно простой, но данные выгружает нормально.

Для начала приведу пример конечного xls файла, в программе Excel выгрузка будет выглядеть примерно так:

Php2Excel

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

До того как я пришел именно к такому варианту выгрузки я пробовал выгружать в формат csv но получалось немного коряво, потом пробовал отрисовывать таблицу и сохранять ее с расширением xls также получалось какая-то ерунда, способ, который я сейчас опишу меня полностью устроил и сейчас с вами я им поделюсь.

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

А еще чтобы вы понимали, какие данные я выгружаю, приведу пример простой таблицы (у меня ее название test):

id firstname name
1 Иванов Иван
2 Петров Петр
2 Петров2 Петр2

Вот код:

    mysql_connect ("localhost", "root","");//подключение к серверу
    mysql_select_db("test") or die (mysql_error());//выбор базы данных
    mysql_query('SET character_set_database = utf8');
    mysql_query ("SET NAMES 'utf8'");
    error_reporting(E_ALL);
    ini_set("display_errors", 1);

if( !defined( "ExcelExport" ) ) {
 define( "ExcelExport", 1 );
   class ExportToExcel {
    var $xlsData = "";
    var $fileName = "";
    var $countRow = 0;
    var $countCol = 0;
    var $totalCol = 3;//общее число  колонок в Excel
        //конструктор класса
    function __construct (){
        $this->xlsData = pack( "ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0 );
    }
        // Если число
    function RecNumber( $row, $col, $value ){
        $this->xlsData .= pack( "sssss", 0x0203, 14, $row, $col, 0x00 );
        $this->xlsData .= pack( "d", $value );
        return;
    }
        //Если текст
    function RecText( $row, $col, $value ){
        $len = strlen( $value );
        $this->xlsData .= pack( "s*", 0x0204, 8 + $len, $row, $col, 0x00, $len);
        $this->xlsData .= $value;
        return;
    }
        // Вставляем число
    function InsertNumber( $value ){
        if ( $this->countCol == $this->totalCol ) {
            $this->countCol = 0;
            $this->countRow++;
        }
        $this->RecNumber( $this->countRow, $this->countCol, $value );
        $this->countCol++;
        return;
    }
        // Вставляем текст
    function InsertText( $value ){
        if ( $this->countCol == $this->totalCol ) {
            $this->countCol = 0;
            $this->countRow++;
    }
        $this->RecText( $this->countRow, $this->countCol, $value );
        $this->countCol++;
        return;
    }
        // Переход на новую строку
    function GoNewLine(){
        $this->countCol = 0;
        $this->countRow++;
        return;
        }
        //Конец данных
    function EndData(){
        $this->xlsData .= pack( "ss", 0x0A, 0x00 );
        return;
    }
        // Сохраняем файл
    function SaveFile( $fileName ){
        $this->fileName = $fileName;
        $this->SendFile();
    }
        // Отправляем файл
    function SendFile(){
        $this->EndData();
        header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" );
        header ( "Cache-Control: no-store, no-cache, must-revalidate" );
        header ( "Pragma: no-cache" );
        header ( "Content-type: application/x-msexcel" );
        header ( "Content-Disposition: attachment; fileName=$this->fileName.xls" );
        print $this->xlsData;
     }
    }
}
    if(isset($_GET['id'])) {
        //фильтруем данные
$id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET['id'],ENT_QUOTES))));
        $filename = 'Файл_с_id_'.$id; // задаем имя файла
        $excel = new ExportToExcel(); // создаем экземпляр класса
        $sql="SELECT * FROM  test.test where id = $id";//запрос к базе
        $rez=mysql_query($sql);
        $excel->InsertText('Идентификатор');
        $excel->InsertText('Фамилия');
        $excel->InsertText('Имя');
        $excel->GoNewLine();
    While($row=mysql_fetch_assoc($rez)){
        $excel->InsertNumber($row['id']);
        $excel->InsertText($row['firstname']);
        $excel->InsertText($row['name']);
        $excel->GoNewLine();
    }
    $excel->SaveFile($filename);
}
?>

Вся идея здесь заключается в функции pack() которая упаковывает данные в бинарную строку, а мы в свою очередь последовательно заполняем эту строку данными, которые мы выгрузили из базы данных MySql с помощью обычной функции mysql_query().

Для того чтобы проверить работоспособность данного кода, с учетом того, что вы настроили подключение к базе данных и создали аналогичную таблицу, можете послать такой запрос:

ваш_сайт/название _файла.php?id=2

И у вас должно выгрузиться две строки с id равным 2.

И теперь каждый, которому вы разрешите выгружать данные может легко экспортировать их на свой локальный компьютер через web интерфейс. Данный способ удобен как для корпоративных пользователей, если вы разрабатываете приложение для своей организации, так и для пользователей вашего web сайта в Интернете.  Надеюсь, данный способ вам помог. Удачи.

Что еще почитать?


Оставленные комментарии:


Всего 0 комментариев


Введите Ваше имя:


Не используйте HTML и ВВ-коды - не работает. Пользуйтесь смайликами :)
Very HappySmileLaughingCoolWinkSurprised
RazzSleepSadShockedEvil or Very MadRolling Eyes

В этом поле Вы можете ввести текст комментария:


До конца всего осталось символов

Код на БОТливость: Код на БОТливость:
Введите код: