Вивантаження даних в Excel із бази MySql

У багатьох при роботі зphp у зв'язці зMySql виникає така потреба як експорт даних з бази у форматxls для того, щоб люди, яким потрібні ці дані, обробляли їх у програміExcel або просто користувачам було зручно дивитися ці дані. Нещодавно у мене виникла така потреба, і сьогодні я розповім, як цю справу можна реалізувати.

Відразу скажу, що цей спосіб є досить простим, але дані вивантажує нормально.

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

excel

Тобто ніяких картинок, стилів вивантажено не буде лише заголовки стовпців і самі дані.

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

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

idfirstnamename
1ІвановІван
2ПетровПетро
2Петров2Петр2

Ось код:

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; повернення; > // Вставляємо число function InsertNumber( $value ) if ( $this->countCol == $this->totalCol ) $this->countCol = 0; $this->countRow++; > $this->RecNumber( $this->countRow, $this->countCol, $value ); $this->countCol++; повернення; > // Вставляємо текст function InsertText( $value ) if ( $this->countCol == $this->totalCol ) $this->countCol = 0; $this->countRow++; > $this->RecText( $this->countRow, $this->countCol, $value ); $this->countCol++; повернення; > // Перехід на нову строку function GoNewLine() $this->countCol = 0; $this->countRow++; повернення; > //Конец данных function EndData() $this->xlsData .= pack( "ss", 0x0A, 0x00 ); повернення; > // Зберігаємо файл function SaveFile( $fileName ) $this->fileName = $fileName; $this->SendFile(); > // Відправляємо файл function SendFile() $this->EndData(); header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" ); заголовок ( "Cache-Control: no-store, no-cache, must-revalidate" ); заголовок ("Pragma: no-cache"); заголовок ( "Content-type: application/x-msexcel"); заголовок ( "Content-Disposition: attachment; fileName=$this->fileName.xls" ); надрукувати $this->xlsData; > > > if(isset($_GET['id'])) //фільтруємо дані $ ],ENT_QUOTES)))); $filename = 'Файл_с_id_'.$id; // задаємо ім'я файлу $excel = new ExportToExcel(); // створюємо екземпляр класу $sql="SELECT * FROM test.test where > $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().

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

І у вас має вивантажитися два рядки з id рівним 2.

І тепер кожен, якому ви дозволите вивантажувати дані, може легко експортувати їх на свій локальний комп'ютер через web інтерфейс. Цей спосіб зручний як для корпоративних користувачів, якщо ви розробляєте програму для своєї організації, так і для користувачів вашого веб-сайту в Інтернеті. Сподіваюся, цей спосіб вам допоміг. Успіхів.