Php зберегти таблицю в excel. Експорт даних з php в excel. Експорт даних з MySQL в Excel на PHP

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

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

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

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

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

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

$ ObjPHPExcel \u003d new PHPExcel (); / ** You can set many properties * / $ objPHPExcel-\u003e getProperties () -\u003e setCreator ( "My company") -\u003e setLastModifiedBy ( "John Doe") -\u003e setTitle ( "Annual report") -\u003e setSubject ( "Sales ") -\u003e setDescription (" Annual sales report by John Doe ") -\u003e setCategory (" Finance "); / ** Choose one of sheets * / $ activeSheet \u003d $ objPHPExcel-\u003e setActiveSheetIndex (0); / ** Simply set value of cell * / $ activeSheet-\u003e setCellValue ( "A1", "plural");

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

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

Не потрібно ніяких розширень.

Єдині застереження в тому, що я ще не зрозумів, як виплюнуть.xls без Excel, повідомивши, що дані можуть бути пошкоджені - і я не намагався робити форматування або щось більш складне, ніж просто «експортувати» дані, Файл / дані в порядку, звичайно, але він генерує попередження з 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 \u003d array (array ( "firstname" \u003d\u003e "Mary", "lastname" \u003d\u003e "Johnson", "age" \u003d\u003e 25), array ( "firstname" \u003d\u003e "Amanda", "lastname" \u003d\u003e " Miller "," age "\u003d\u003e 18), array (" firstname "\u003d\u003e" James "," lastname "\u003d\u003e" Brown "," age "\u003d\u003e 31), array (" firstname "\u003d\u003e" Patricia ", "lastname" \u003d\u003e "Williams", "age" \u003d\u003e 7), array ( "firstname" \u003d\u003e "Michael", "lastname" \u003d\u003e "Davis", "age" \u003d\u003e 43), array ( "firstname" \u003d\u003e "Sarah", "lastname" \u003d\u003e "Miller", "age" \u003d\u003e 24), array ( "firstname" \u003d\u003e "Patrick", "lastname" \u003d\u003e "Miller", "age" \u003d\u003e 27) );

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

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

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

Firstname lastname age Mary Johnson 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 \u003d 0, pre-check \u003d 0");
header ( "Cache-Control: private", false);
header ( "Content-Type: application / x-msexcel");
header ( "Content-Disposition: attachment; filename \u003d \\" ". iconv (" UTF-8 "," CP1251 ", $ object-\u003e getFileName ())." \\ ";");
header ( "Content-Transfer-Encoding: binary");
header ( "Content-Length:". $ object-\u003e getFileSize ());

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

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

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

(Foreach from \u003d $ data.header item \u003d caption) ($ Caption.columnName) (/ Foreach) (Foreach from \u003d $ data.content item \u003d row) (Foreach from \u003d $ row item \u003d 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 \u003d pack ( "ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Якщо число function RecNumber ($ row, $ col, $ value) ($ this-\u003e xlsData. \u003d Pack ( "sssss", 0x0203, 14, $ row, $ col, 0x00); $ this-\u003e xlsData. \u003d pack ( "d", $ value); return;) // Якщо текст function RecText ($ row, $ col, $ value) ($ len \u003d strlen ($ value); $ this-\u003e xlsData. \u003d pack ( " s * ", 0x0204, 8 + $ len, $ row, $ col, 0x00, $ len); $ this-\u003e xlsData. \u003d $ value; return;) // Вставляємо число function InsertNumber ($ value) (if ($ this-\u003e countCol \u003d\u003d $ this-\u003e totalCol) ($ this-\u003e countCol \u003d 0; $ this-\u003e countRow ++;) $ this-\u003e RecNumber ($ this-\u003e countRow, $ this-\u003e countCol, $ value); $ this-\u003e countCol ++; return;) // Вставляємо текст function InsertText ($ value) (if ($ this-\u003e countCol \u003d\u003d $ this-\u003e totalCol) ($ this-\u003e countCol \u003d 0; $ this-\u003e countRow ++; ) $ this-\u003e RecText ($ this-\u003e countRow, $ this-\u003e countCol, $ value); $ this-\u003e countCol ++; return;) // Перехід на новий рядок function GoNewLine () ($ this-\u003e countCol \u003d 0 ; $ this-\u003e countRow ++; return;) // Кінець даних function EndData () ($ this-\u003e xlsData. \u003d pack ( "ss", 0x0A, 0x00); return; ) // Зберігаємо файл function SaveFile ($ fileName) ($ this-\u003e fileName \u003d $ fileName; $ this-\u003e SendFile ();) // Відправляємо файл function SendFile () ($ this-\u003e 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 \u003d $ this-\u003e fileName.xls "); print $ this-\u003e xlsData ;))) if (isset ($ _ GET [ "id"])) (// фільтруємо дані $ id \u003d mysql_real_escape_string (stripslashes (trim (htmlspecialchars ($ _ GET [ "id"], ENT_QUOTES)))); $ filename \u003d "Файл_с_id _". $ id; // задаємо ім'я файлу $ excel \u003d new ExportToExcel (); // створюємо екземпляр класу $ sql \u003d "SELECT * FROM test.test where id \u003d $ id"; // запит до бази $ rez \u003d mysql_query ($ sql); $ excel-\u003e InsertText ( "Ідентифікатор"); $ excel-\u003e InsertText ( "Прізвище"); $ excel-\u003e InsertText ( "Ім'я"); $ excel-\u003e GoNewLine (); While ($ row \u003d mysql_fetch_assoc ($ rez)) ($ excel-\u003e InsertNumber ($ r ow [ "id"]); $ Excel-\u003e InsertText ($ row [ "firstname"]); $ Excel-\u003e InsertText ($ row [ "name"]); $ Excel-\u003e GoNewLine (); ) $ Excel-\u003e SaveFile ($ filename); )?\u003e

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

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

Http: // ваш_сайт / назва _файла. php? id \u003d 2

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

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