PHP - качване на данни в Excel от MySQL база данни. PHP - Качете данни в Excel от MySQL база данни Качете php таблица в Excel

.
Методът, представен в тази бележка, е наистина много прост, но може да не винаги е удобен.
Има много други начини за прехвърляне на таблични данни от PHP към Excel, ще опиша този, който ми се стори най-прост и функционален. Трябва да се отбележи специално, че не говоря за генериране на xls файл, а само предлагам на потребителя да отвори получените данни с помощта на Excel, така че потребители, които нямат опит в програмирането, да не забележат фалшификата.

И така, първото нещо, което трябва да направите, е да поставите на нашата страница връзка към скрипт, който генерира следните заглавки:
заглавие ("Прагма: обществено");
заглавие ("Изтича: 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-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 from=$data.content item=row) (foreach from=$row item=col) ($col)(/за всеки)(/за всеки)

Както можете да видите от кода, масивът $data, съдържащ два масива, се предава на шаблона - заглавния ред на таблицата и действителните данни.
Струва си да се отбележи, че използването на машина за шаблони само за генериране на XML е донякъде скъпо и има много други начини да получите XML. В моя конкретен случай генерирането на XML е само малък бонус в голям проект, където шаблонът е незаменим.

Като пример дадох най-простата таблица, ако желаете, можете да манипулирате много по-голям брой атрибути. Това е особено хубаво, когато имате предвид, че не са необходими библиотеки на трети страни за изпълнение.
Описаният метод работи върху един и същ проект от няколко години и нито един потребител все още не е заподозрял, че данните, които отваря, не са документ на MS Office.

Можете да прочетете повече за XML структурата, използвана в MS Excel в

.
Методът, представен в тази бележка, е наистина много прост, но може да не винаги е удобен.
Има много други начини за прехвърляне на таблични данни от PHP към Excel, ще опиша този, който ми се стори най-прост и функционален. Трябва да се отбележи специално, че не говоря за генериране на xls файл, а само предлагам на потребителя да отвори получените данни с помощта на Excel, така че потребители, които нямат опит в програмирането, да не забележат фалшификата.

И така, първото нещо, което трябва да направите, е да поставите на нашата страница връзка към скрипт, който генерира следните заглавки:
заглавие ("Прагма: обществено");
заглавие ("Изтича: 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-Length: " . $object->getFileSize());

$object е сферичен обект във вакуум, който всеки читател прилага както иска. Целта на методите getFileName() и getFileSize() е ясна от имената. Тук си струва да подчертаем един неочевиден нюанс (благодаря, че ми напомнихте за това) - getFileName () разбира се може да върне всяко име на файл, но ако искате браузърът да предложи да отвори полученото съдържание в Excel, тогава файловото разширение трябва да е xls.
Все още не съм казал нищо ново, но всичко това е измислено преди мен, както и това, което ще бъде описано по-долу.
Както правилно беше отбелязано в коментарите към бележката, Excel работи много по-бързо с XML. Но най-важното предимство, може би, все още не е в скоростта, а в много по-широки възможности. Няма да се ровя в дивата природа, а само ще дам прост пример и връзка към подробно описание на всички тагове.

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

И генерирам таблицата с помощта на Smarty:

(foreach from=$data.header item=caption) ($caption.columnName)(/за всеки)(foreach from=$data.content item=row) (foreach from=$row item=col) ($col)(/за всеки)(/за всеки)

Както можете да видите от кода, масивът $data, съдържащ два масива, се предава на шаблона - заглавния ред на таблицата и действителните данни.
Струва си да се отбележи, че използването на машина за шаблони само за генериране на XML е донякъде скъпо и има много други начини да получите XML. В моя конкретен случай генерирането на XML е само малък бонус в голям проект, където шаблонът е незаменим.

Като пример дадох най-простата таблица, ако желаете, можете да манипулирате много по-голям брой атрибути. Това е особено хубаво, когато имате предвид, че не са необходими библиотеки на трети страни за изпълнение.
Описаният метод работи върху един и същ проект от няколко години и нито един потребител все още не е заподозрял, че данните, които отваря, не са документ на MS Office.

Можете да прочетете повече за XML структурата, използвана в MS Excel в

За мнозина при работа с PHP във връзка с MySQLима такава необходимост като експортиране на данни от базата данни във формат xls, така че хората, които се нуждаят от тези данни, да ги обработват в Excel или просто да направят удобно за потребителите да преглеждат тези данни. Наскоро имах такава нужда и днес ще ви кажа как може да се реализира този бизнес.

Веднага трябва да кажа, че този метод е доста прост, но данните се качват нормално.

Като начало ще дам пример за крайния xls файл, в Excel качването ще изглежда така:

С други думи, няма да се качват изображения или стилове, а само заглавките на колоните и самите данни.

Преди да стигна точно до такава опция за качване, пробвах да кача в csv формат, но стана малко кофти, след това се опитах да нарисувам таблица и да я запазя с разширение xls, също се получи някаква глупост, методът, който сега ще опиша, напълно ми пасна и сега ще го споделя с вас.

Като начало ще дам целия код, който коментирах, доколкото е възможно, можете да го изберете и да го запишете с разширението php и да го опитате, просто не забравяйте да зададете настройките за връзка с базата данни.

Експортиране на данни от MySQL към Excel в PHP

И за да разберете какви данни разтоварвам, ще дам пример за проста таблица в базата данни ( Имам тест за нейното име):

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

документ за самоличност първо име име
1 Иванов Иван
2 Петров Петър
2 Петров2 Петър2
xlsData = пакет ("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Ако числова функция RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value); return; ) //Ако текстова функция RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack(" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; return; ) // Вмъкване на числова функция InsertNumber($value)( if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Вмъкване на текстова функция InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Преместване на нов ред функция GoNewLine()( $this->countCol = 0 ; $this->countRow++; return; ) //Функция за край на данните EndData()( $this->xlsData .= pack("ss", 0x0A, 0x00); връщане; ) // Запазване на файловата функция SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Изпращане на файловата функция SendFile()( $this->EndData(); заглавие (" Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); заглавка ("Cache-Control: no-store, no-cache, must-revalidate"); заглавка (" 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 = "File_with_id_".$id; // задаване на името на файла $excel = new ExportToExcel(); // създаване на екземпляр на класа $sql="SELECT * FROM test.test where id = $id";// заявка към базата данни $rez= mysql_query($sql); $excel->InsertText("ID"); $excel->InsertText("Family Name"); $excel->InsertText("First Name"); $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); ) ?>

Цялата идея тук е във функцията пакет(), който пакетира данните в двоичен низ, а ние от своя страна последователно запълваме този низ с данните, които сме разтоварили от базата данни mysql използвайки нормалната функция mysql_query().

За да проверите производителността на този код, като имате предвид, че сте установили връзка с базата данни и сте създали подобна таблица, можете да изпратите следната заявка:

Http://вашият_сайт/име_на_файл. php?id=2

И трябва да разтоварите два реда с id, равен на 2.

И сега всеки, на когото позволите да качва данни, може лесно да ги експортира в своя локален компютърчрез уеб интерфейса. Този метод е удобен както за корпоративни потребители, ако разработвате приложение за вашата организация, така и за потребители на вашия уеб сайт в Интернет. Надявам се, че този метод ви е помогнал. Късмет!

(данни, извлечени от mysql база данни), за да успее. Използвам Zend Framework. Трябва да направя някои промени в данните си, преди да ги експортирам в excel. Всъщност наистина трябва да създам месечна касова книга.

Прочетох много документи, но се озовах в бъркотия. Наистина не разбирам как да започна. Наистина ли имам нужда от PEAR? Трябва ли да зареждам библиотека с класове? Няма ли лесен начин да направите това?

Благодаря ви предварително

Предлагам ви да използвате PHPExcel библиотека PHPExcel. Той е наистина мощен, поддържа различни формати, може да прави визуално форматиране и е лесен за използване.

Можете да научите повече за това на тяхната уеб страница: http://phpexcel.codeplex.com/ (PHPExcel вече се премести на https://github.com/PHPOffice/PHPExcel)

Пример за употреба:

$objPHPExcel = нов PHPExcel(); /** Можете да зададете много свойства */ $objPHPExcel->getProperties()->setCreator("Моята компания") ->setLastModifiedBy("John Doe") ->setTitle("Годишен отчет") ->setSubject("Продажби ") ->setDescription("Годишен отчет за продажбите от Джон Доу") ->setCategory("Финанси"); /** Изберете един от листовете */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Просто задайте стойност на клетка */ $activeSheet->setCellValue("A1", "plural");

Можете да направите много повече, разбира се, като четете excel файлове, задаване на визуални стилове, създаване на графики, изрази и др.

Написах 94-редов отчет за варианти на инвентара, където вземам данни от MySQL (6kb+записи на таблица), създавам многоизмерен масив от MySQL данни, извличам от множество таблици, след което изхвърлям всичко в един ред и генерирам .xls По този начин:

Не са необходими разширения.

Единствените предупреждения са, че все още не съм разбрал как да изплюя .xls без Excel, като ви казвам, че данните могат да бъдат повредени - и не съм опитвал да правя форматиране или нещо по-сложно от просто "експортиране" на данните , файл/данни на ок, разбира се, но генерира предупреждение от excel.

РЕДАКТИРАНЕ: Трябва да отбележа, че „настройка“ и „изхвърляне“ се отнасят за: daniweb.com

Можете да използвате библиотеката phpexcel. Позволява ви да пишете и четете от различни файлови формати на електронни таблици

за интегриране със zend можете да използвате помощта на следната връзка.

Можете да използвате CSV, за да направите импортируем формат за excel. Това е най-лесният начин да го направите.

CSV изглежда така:

"моето първо съдържание на клетка", "моето второ съдържание на клетка", "моето трето съдържание на клетка" "втори ред, съдържание на първа клетка", "и т.н.", "и т.н.

Всеки ред представлява Ред на 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" => "Уилямс", "age" => 7), array("firstname" => "Michael", "lastname" => "Davis", "age" => 43), array("firstname" => "Sarah", "lastname" => "Miller", "age" => 24), array("firstname" => "Patrick", "lastname" => "Miller", "age" => 27) );

Първата стъпка е да изведете данните във формат, разделен с разделители (може да се използва и CSV, но е малко по-сложен). За целта използваме следния код:

Зададохме типа съдържание на текст/обикновен, за да може резултатът да се преглежда по-лесно в браузър. В противен случай, тъй като не HTML форматиране, резултатът ще се покаже като един ред текст.

Първият ред на изхода ще бъде заглавията на колоните (в този случай се използват имената на полетата). Стойностите са разделени с табулатор \t и редове с нов ред \n. Резултатът трябва да изглежда така:

Име фамилия възраст Мери Джонсън 25 Аманда Милър 18 Джеймс Браун 31 Патриша Уилямс 7 Майкъл Дейвис 43 Сара Милър 24 Патрик Милър 27

Има слабост в този код, която може да не е очевидна веднага. Какво ще стане, ако едно от полетата, които трябва да бъдат изведени, вече съдържа един или повече символи за разделяне или по-лошо, нов ред? Това ще задейства целия процес, тъй като разчитаме на тези знаци за обозначаване на колони и прекъсвания на редове.

Решението е да "избягате" от знаците за разделяне. В този случай ще заменим разделите с литерал \t и прекъсванията на редовете с литерал \n, така че да не влияят на форматирането:

Сега, преди всеки ред да бъде повторен, всички знаци за табулация се заменят с "\t", така че нашите колони да не се прекъсват. Също така всеки нов ред в данните се заменя с "\n".



Свързани статии: