Простий спосіб передачі табличних даних із PHP в Excel. Експорт даних з php до excel Php експорт таблиці до excel

.
Спосіб, представлений у тій статті дійсно дуже простий, але не завжди може бути зручний.
Є безліч інших способів передати табличні дані з PHP до Excel, я опишу той, який здався мені найпростішим і функціональнішим. Потрібно особливо відзначити, що я не говорю про генерацію xls файлу, а лише пропоную користувачеві відкрити отримані дані за допомогою Excel так, що користувачі не досвідчені в програмуванні не помітять підробки.

Отже, перше, що необхідно зробити - розмістити на нашій сторінці посилання на скрипт, що генерує наступні заголовки:
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $object->getFileSize());

$object – сферичний об'єкт у вакуумі, який кожен читач реалізує так, як йому більше подобається. Призначення гетерів getFileName() та getFileSize() зрозуміло з назв. Тут варто виділити один неочевидний нюанс (дякую за те, що нагадав про це) - getFileName() звичайно може повертати будь-яке ім'я файлу, але якщо ви хочете що б браузер запропонував відкрити отриманий контент в Excel, то розширення файлу має бути xls.
Нічого нового я поки не розповів, все це придумано до мене, втім, як і те, що буде описано нижче.
Як правильно було зазначено у коментарях до нотатки , Excel набагато швидше працює з XML. Але найголовніша перевага, мабуть, все ж таки не в швидкості, а в набагато ширших можливостях. Заглиблюватися в нетрі я не стану, а лише наведу простий приклад і посилання на докладний описвсіх тегів.

Отже, після того, як заголовки згенеровані, нам потрібно віддати користувачеві власне дані. Я зазвичай загортаю генерацію таблиці в окремий метод:
echo $object->getContent();

А таблицю генерую за допомогою Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/foreach)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/foreach)(/foreach)

Як видно з коду, шаблон передається масив $data містить два масиву - рядок заголовка таблиці і власне дані.
Варто відзначити, що використовувати шаблонизатор тільки для генерації XML дещо накладно, і отримати XML можна безліччю інших способів. У моєму конкретному випадку генерація XML – це лише маленька плюшка у великому проекті, де без шаблонизатора не обійтися.

Як приклад я навів найпростішу таблицю, за бажання можна маніпулювати набагато більшим числом атрибутів. Це особливо приємно, якщо зважити, що для реалізації не потрібні жодні сторонні бібліотеки.
Описаний метод кілька років працює на одному проекті і жоден користувач досі не запідозрив, що дані, що їм відкриваються, не є документом MS Office.

Докладніше про структуру XML, що використовується в MS Excel, можна почитати в

(дані, отримані з бази даних mysql), щоб досягти успіху. Я використовую Zend Framework. Мені потрібно зробити деякі зміни в мої дані перед експортом в Excel. Фактично мені дійсно потрібно створити щомісячну касову книгу.

Я прочитав багато документів, але опинився безладно. Я справді не розумію, як мені розпочати. Мені дійсно потрібний PEAR? Чи потрібно завантажувати будь-яку бібліотеку класів? Чи немає простого способузробити це?

заздалегідь дякую

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

Ви можете дізнатися більше про це на своїй веб-сторінці: http://phpexcel.codeplex.com/ , (PHPExcel вже переміщено за адресою https://github.com/PHPOffice/PHPExcel)

Приклад використання:

$objPHPExcel = новий PHPExcel(); /** You can set many properties */ $objPHPExcel->getProperties()->setCreator("My company") ->setLastModifiedBy("John Doe") ->setTitle("Annual report") ->setSubject("Sales ") ->setDescription("Annual sales report by John Doe") ->setCategory("Finance"); /** Choose one of sheets */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Simply set value of cell */ $activeSheet->setCellValue("A1", "plural");

Ви можете робити набагато більше, звичайно, читання файлів excel, встановлення візуальних стилів, створення графіків, виразів та багато іншого.

Я написав звіт про варіацію в інвентарі з 94 рядків, у якому я беру дані з MySQL (6 кбайт + записів на таблицю), створюю багатовимірний масивз даних MySQL, витяг з декількох таблиць, а потім скидав все в один рядок і генерував.

Не потрібно жодних розширень.

Єдині застереження в тому, що я ще не зрозумів, як виплюнути. порядку, звичайно, але він генерує попередження з Excel.

EDIT: Я повинен відзначити, що «налаштування» та «дамп» відносяться до наступного: daniweb.com

Ви можете використовувати бібліотеку phpexcel. Це дозволяє вам писати і читати з різних форматівфайлів електронних таблиць

для інтеграції з zend ви можете скористатись за допомогою наступного посилання.

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

CSV виглядає так:

"my first cellcontent", "my second cell content", "my third cell content" "second line, first cell content", "etc", "etc

Кожен рядок представляє рядок Excel, ви поміщаєте вміст комірки між подвійними лапкамиі розділяєте комами. Будьте обережні, якщо у вас є деякі ваші дані, це може зламати ваш CSV і створити небажані нові рядки.

З невеликою кількістю Google ви знайшли це: http://www.the-art-of-web.com/php/dataexport/

Підготовка данних

$data = array(array("firstname" => "Mary", "lastname" => "Johnson", "age" => 25), array("firstname" => "Amanda", "lastname" => " Miller", "age" => 18), array("firstname" => "James", "lastname" => "Brown", "age" => 31), array("firstname" => "Patricia", "lastname" => "Williams", "age" => 7), array("firstname" => "Michael", "lastname" => "Davis", "age" => 43), array("firstname" => "Sarah", "lastname" => "Miller", "age" => 24), array("firstname" => "Patrick", "lastname" => "Miller", "age" => 27) );

Першим кроком є ​​виведення даних у форматі з роздільниками табуляції (CSV також можна використовувати, але трохи складніше). Для цього ми використовуємо наступний код:

Ми встановлюємо тип вмісту в text/plain, щоб результат можна було легше переглянути у браузері. В іншому випадку, оскільки немає форматування HTML, висновок буде відображатися як один рядок тексту.

Перший рядок виведення буде заголовками стовпців (у разі використовуються імена полів). Значення поділяються вкладкою \t та рядками з розривом рядка \n. Результат має виглядати приблизно так:

Перший останній рік Марі Джонсон 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

У цьому коді є слабкість, яка може бути не одразу очевидною. Що робити, якщо одне з полів, які мають бути виведені, вже містить один або кілька символів табуляції або, що ще гірше, новий рядок? Це викличе весь процес, тому що ми покладаємось на ці символи, щоб вказати стовпці та розриви рядків.

Рішення у тому, щоб «уникнути» символів табуляції. У цьому випадку ми замінимо вкладки літеральними \t і розривами рядків з літералом \n, щоб вони не впливали на форматування:

Тепер, перш ніж кожен рядок буде луною, будь-які символи табуляції замінюються "\t", так що наші стовпці не розбиваються. Також будь-які розриви рядків усередині даних замінюються на \n.

.
Спосіб, представлений у тій статті дійсно дуже простий, але не завжди може бути зручний.
Є безліч інших способів передати табличні дані з PHP до Excel, я опишу той, який здався мені найпростішим і функціональнішим. Потрібно особливо відзначити, що я не говорю про генерацію xls файлу, а лише пропоную користувачеві відкрити отримані дані за допомогою Excel так, що користувачі не досвідчені в програмуванні не помітять підробки.

Отже, перше, що необхідно зробити - розмістити на нашій сторінці посилання на скрипт, що генерує наступні заголовки:
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/x-msexcel");
header("Content-Disposition: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $object->getFileSize());

$object – сферичний об'єкт у вакуумі, який кожен читач реалізує так, як йому більше подобається. Призначення гетерів getFileName() та getFileSize() зрозуміло з назв. Тут варто виділити один неочевидний нюанс (спасибі savostin за те, що нагадав про це) - getFileName() звичайно може повертати будь-яке ім'я файлу, але якщо ви хочете що б браузер запропонував відкрити отриманий контент в Excel, то розширення файлу має бути xls.
Нічого нового я поки не розповів, все це придумано до мене, втім, як і те, що буде описано нижче.
Як правильно було зазначено в коментарях до нотатки про генерацію xls в PHP, Excel набагато швидше працює з XML. Але найголовніша перевага, мабуть, все ж таки не в швидкості, а в набагато ширших можливостях. Заглиблюватися в нетрі я не стану, а лише наведу простий приклад і посилання на докладний опис усіх тегів.

Отже, після того, як заголовки згенеровані, нам потрібно віддати користувачеві власне дані. Я зазвичай загортаю генерацію таблиці в окремий метод:
echo $object->getContent();

А таблицю генерую за допомогою Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/foreach)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/foreach)(/foreach)

Як видно з коду, шаблон передається масив $data містить два масиву - рядок заголовка таблиці і власне дані.
Варто відзначити, що використовувати шаблонизатор тільки для генерації XML дещо накладно, і отримати XML можна безліччю інших способів. У моєму конкретному випадку генерація XML – це лише маленька плюшка у великому проекті, де без шаблонизатора не обійтися.

Як приклад я навів найпростішу таблицю, за бажання можна маніпулювати набагато більшим числом атрибутів. Це особливо приємно, якщо зважити, що для реалізації не потрібні жодні сторонні бібліотеки.
Описаний метод кілька років працює на одному проекті і жоден користувач досі не запідозрив, що дані, що їм відкриваються, не є документом MS Office.

Докладніше про структуру XML, що використовується в MS Excel, можна почитати в

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

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

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

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

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

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

Експорт даних з MySQL в Excel на PHP

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

Тестова таблиця:

id firstname name
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; 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"); Pragma: no-cache"); header ("Content-type: application/x-msexcel"); header ("Content-Disposition: attachment; ; ) ) ) 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(); row=mysql_fetch_assoc($rez))( $excel->InsertNumber($r ow["id"]); $excel->InsertText($row["firstname"]); $excel->InsertText($row["name"]); $excel->GoNewLine(); ) $ Excel -> SaveFile ($ filename); ) ?>

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

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

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

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

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