Вивантаження даних з excel у php. Простий спосіб передачі табличних даних із PHP в Excel. Експорт даних з MySQL в Excel на PHP

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

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

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

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

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

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

$objPHPExcel = новий PHPExcel(); /** Ви можете встановити багато 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, витягнув з декількох таблиць, а потім скидав все в один рядок і генерував.xls таким чином:

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

Єдині застереження в тому, що я ще не зрозумів, як виплюнути. порядку, звичайно, але він генерує попередження з 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() зрозуміло з назв. Тут варто виділити один неочевидний нюанс (дякую за те, що нагадав про це) - 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, можна почитати в

У багатьох при роботі з 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; $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("Ім'я"); 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().

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

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

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

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

.
Спосіб, представлений у тій статті дійсно дуже простий, але не завжди може бути зручний.
Є безліч інших способів передати табличні дані з 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, можна почитати в