ტაბულური მონაცემების გადასატანად მარტივი გზა PHP-დან Excel-ში. მონაცემების ექსპორტი php-დან ექსელში Php ექსპორტის ცხრილი Excel-ში

.
ამ ჩანაწერში წარმოდგენილი მეთოდი მართლაც ძალიან მარტივია, მაგრამ შეიძლება ყოველთვის არ იყოს მოსახერხებელი.
არსებობს მრავალი სხვა გზა ცხრილის მონაცემების გადასატანად PHP–დან Excel–ში, მე აღვწერ იმას, რაც მეჩვენებოდა ყველაზე მარტივი და ფუნქციონალური. განსაკუთრებით უნდა აღინიშნოს, რომ მე არ ვსაუბრობ xls ფაილის გენერირებაზე, არამედ მხოლოდ ვთავაზობ, რომ მომხმარებელმა გახსნას მიღებული მონაცემები Excel-ის გამოყენებით, რათა პროგრამირების გამოცდილების მქონე მომხმარებლებმა არ შეამჩნიონ გაყალბება.

ასე რომ, პირველი, რაც უნდა გააკეთოთ, არის ჩვენს გვერდზე განათავსოთ ბმული სკრიპტზე, რომელიც წარმოქმნის შემდეგ სათაურებს:
header ("პრაგმა: საჯარო");
header ("იწურება: 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: დანართი; ფაილის სახელი=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header ("შინაარსი-გადაცემა-დაშიფვრა: ორობითი");
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)(წინასწარ =$data.content ელემენტი=რიგი) (წინასწარ =$row item=col) ($col)(/ foreach)(/ foreach)

როგორც კოდიდან ხედავთ, $data მასივი გადაეცემა შაბლონს, რომელიც შეიცავს ორ მასივს - ცხრილის სათაურის ხაზს და თავად მონაცემებს.
აღსანიშნავია, რომ შაბლონის ძრავის გამოყენება მხოლოდ XML-ის გენერირებისთვის გარკვეულწილად ძვირია და XML-ის მიღება შესაძლებელია მრავალი სხვა გზით. ჩემს კონკრეტულ შემთხვევაში, XML თაობა მხოლოდ მცირე ბონუსია დიდ პროექტში, სადაც შაბლონის ძრავა შეუცვლელია.

მაგალითად მე მოვიყვანე უმარტივესი მაგიდა, სურვილის შემთხვევაში შესაძლებელია კიდევ მრავალი ატრიბუტის მანიპულირება. ეს განსაკუთრებით სასიამოვნოა იმის გათვალისწინებით, რომ არ არის საჭირო მესამე მხარის ბიბლიოთეკები განსახორციელებლად.
აღწერილი მეთოდი რამდენიმე წელია მუშაობს ერთ პროექტზე და ჯერ არც ერთ მომხმარებელს არ გაუჩნდა ეჭვი, რომ მის მიერ გახსნილი მონაცემები არ არის MS Office დოკუმენტი.

შეგიძლიათ მეტი წაიკითხოთ MS Excel-ში გამოყენებული XML სტრუქტურის შესახებ

(მონაცემები მიღებული mysql მონაცემთა ბაზიდან) წარმატების მისაღწევად. მე ვიყენებ Zend Framework-ს. Excel-ში ექსპორტამდე უნდა შევიტანო გარკვეული ცვლილებები ჩემს მონაცემებში. სინამდვილეში, მე რეალურად მჭირდება ყოველთვიური ფულადი წიგნის შექმნა.

ბევრი დოკუმენტი წავიკითხე, მაგრამ არეულობაში აღმოვჩნდი. ნამდვილად არ ვიცი როგორ დავიწყო. მართლა მჭირდება მსხალი? მჭირდება რაიმე კლასის ბიბლიოთეკის ჩატვირთვა? არა მარტივი გზაამის გაკეთება?

მადლობა წინასწარ

მე გირჩევთ გამოიყენოთ PHPExcel ბიბლიოთეკა. ის მართლაც ძლიერია, მხარს უჭერს მრავალ ფორმატს, შეუძლია ვიზუალური ფორმატირება და მარტივი გამოსაყენებელია.

ამის შესახებ მეტი შეგიძლიათ გაიგოთ მათ ვებ გვერდზე: http://phpexcel.codeplex.com/, (PHPExcel უკვე გადავიდა https://github.com/PHPOffice/PHPExcel-ზე)

გამოყენების მაგალითი:

$objPHPExcel = ახალი PHPExcel(); /** შეგიძლიათ დააყენოთ მრავალი თვისება */ $objPHPExcel->getProperties()->setCreator("ჩემი კომპანია") ->setLastModifiedBy("ჯონ დო") ->setTitle("წლიური ანგარიში") ->setSubject("გაყიდვები" ") ->setDescription("ჯონ დოის წლიური გაყიდვების ანგარიში") ->setCategory("ფინანსები"); /** აირჩიეთ ფურცლებიდან ერთ-ერთი */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** უბრალოდ დააყენეთ უჯრედის მნიშვნელობა */ $activeSheet->setCellValue("A1", "მრავლობითი");

რა თქმა უნდა, კითხვაზე ბევრად მეტის გაკეთება შეგიძლია Excel ფაილები, ვიზუალური სტილის დაყენება, გრაფიკების, გამონათქვამების შექმნა და მრავალი სხვა.

მე დავწერე 94 მწკრივი ინვენტარის ვარიაციის ანგარიში, რომელშიც ვიღებ მონაცემებს MySQL-დან (6 კბ + ჩანაწერები თითო ცხრილში), ვქმნი მრავალგანზომილებიანი მასივი MySQL მონაცემებიდან, ამოღებული რამდენიმე ცხრილიდან და შემდეგ გადაყრილი ყველაფერი ერთ რიგში და გენერირებული .xls ამ გზით:

გაფართოებები არ არის საჭირო.

ერთადერთი გაფრთხილება ისაა, რომ მე ჯერ არ მიფიქრია, როგორ გამოვფურთხებინო .xls Excel-ის გარეშე, ვატყობინებ, რომ მონაცემები შესაძლოა კორუმპირებული იყოს - და არ მიცდია ფორმატირება ან რაიმე უფრო რთული, ვიდრე უბრალოდ მონაცემების "ექსპორტი". ფაილი/მონაცემები კარგია, რა თქმა უნდა, მაგრამ ის წარმოქმნის გაფრთხილებას Excel-დან.

რედაქტირება: უნდა აღვნიშნო, რომ "setup" და "dump" ეხება შემდეგს: 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" => " მილერი", "ასაკი" => 18), მასივი ("სახელი" => "ჯეიმსი", "გვარი" => "ბრაუნი", "ასაკი" => 31), მასივი ("სახელი" => "პატრიცია", "გვარი" => "უილიამსი", "ასაკი" => 7), მასივი ("სახელი" => "მაიკლ", "გვარი" => "დევისი", "ასაკი" => 43), მასივი ("სახელი" => "სარა", "გვარი" => "მილერი", "ასაკი" => 24), მასივი ("სახელი" => "პატრიკ", "გვარი" => "მილერი", "ასაკი" => 27) );

პირველი ნაბიჯი არის მონაცემების გამოტანა ჩანართებით გამოყოფილი ფორმატში (CSV ასევე შეიძლება გამოყენებულ იქნას, მაგრამ ცოტა უფრო რთულია). ამისათვის ჩვენ ვიყენებთ შემდეგ კოდს:

ჩვენ ვაყენებთ კონტენტის ტიპს ტექსტზე/უბრალოზე, რათა შედეგი უფრო ადვილად ნახოს ბრაუზერში. წინააღმდეგ შემთხვევაში, რადგან არ არსებობს HTML ფორმატირება, გამომავალი გამოჩნდება ტექსტის ერთი ხაზის სახით.

გამომავალი პირველი ხაზი იქნება სვეტების სათაურები (ამ შემთხვევაში გამოიყენება ველების სახელები). მნიშვნელობები გამოყოფილია tab \t და ხაზებით ხაზების წყვეტებით \n. შედეგი დაახლოებით ასე უნდა გამოიყურებოდეს:

სახელი გვარი ასაკი მერი ჯონსონი 25 ამანდა მილერი 18 ჯეიმს ბრაუნი 31 პატრიცია უილიამსი 7 მაიკლ დევისი 43 სარა მილერი 24 პატრიკ მილერი 27

ამ კოდექსში არის სისუსტე, რომელიც შეიძლება დაუყოვნებლივ არ იყოს აშკარა. რა მოხდება, თუ ერთ-ერთი ველი, რომელიც უნდა გამოვიდეს, უკვე შეიცავს ერთ ან მეტ ჩანართის სიმბოლოს ან, უარესი, ახალი ხაზი? ეს გამოიწვევს მთელ პროცესს, რადგან ჩვენ ვეყრდნობით ამ სიმბოლოებს, რათა მიუთითოთ სვეტები და ხაზები.

გამოსავალი არის ჩანართის სიმბოლოებიდან „გაქცევა“. ამ შემთხვევაში, ჩვენ შევცვლით ჩანართებს ლიტერალური \t და ხაზების წყვეტებს ლიტერალური \n-ით, რათა მათ არ იმოქმედონ ფორმატირებაზე:

ახლა, სანამ თითოეული სტრიქონი ეხმიანება, ნებისმიერი ჩანართის სიმბოლო შეიცვლება "\t"-ით, რათა ჩვენი სვეტები არ გატეხოს. ასევე, ნებისმიერი სტრიქონის წყვეტა მონაცემებში შეიცვლება "\n"-ით.

.
ამ ჩანაწერში წარმოდგენილი მეთოდი მართლაც ძალიან მარტივია, მაგრამ შეიძლება ყოველთვის არ იყოს მოსახერხებელი.
არსებობს მრავალი სხვა გზა ცხრილის მონაცემების გადასატანად PHP–დან Excel–ში, მე აღვწერ იმას, რაც მეჩვენებოდა ყველაზე მარტივი და ფუნქციონალური. განსაკუთრებით უნდა აღინიშნოს, რომ მე არ ვსაუბრობ xls ფაილის გენერირებაზე, არამედ მხოლოდ ვთავაზობ, რომ მომხმარებელმა გახსნას მიღებული მონაცემები Excel-ის გამოყენებით, რათა პროგრამირების გამოცდილების მქონე მომხმარებლებმა არ შეამჩნიონ გაყალბება.

ასე რომ, პირველი, რაც უნდა გააკეთოთ, არის ჩვენს გვერდზე განათავსოთ ბმული სკრიპტზე, რომელიც წარმოქმნის შემდეგ სათაურებს:
header ("პრაგმა: საჯარო");
header ("იწურება: 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: დანართი; ფაილის სახელი=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
header ("შინაარსი-გადაცემა-დაშიფვრა: ორობითი");
header("Content-Length: " . $object->getFileSize());

$object არის სფერული ობიექტი ვაკუუმში, რომელიც თითოეულ მკითხველს შეუძლია განახორციელოს როგორც მას სურს. getFileName() და getFileSize() მიმღებების დანიშნულება გასაგებია მათი სახელებიდან. აქ ღირს ერთი არა აშკარა ნიუანსის ხაზგასმა (მადლობა savostin-ს ამის შემხსენებისთვის) - getFileName() რა თქმა უნდა შეუძლია დააბრუნოს ნებისმიერი ფაილის სახელი, მაგრამ თუ გსურთ ბრაუზერმა შესთავაზოს მიღებული შინაარსის გახსნა Excel-ში, მაშინ ფაილი გაფართოება უნდა იყოს xls.
ახალი ჯერ არაფერი მითქვამს, ეს ყველაფერი ჩემამდე იყო გამოგონილი, თუმცა, როგორც ქვემოთ იქნება აღწერილი.
როგორც სწორად აღინიშნა პოსტის კომენტარებში PHP-ში xls თაობის შესახებ, Excel ბევრად უფრო სწრაფად მუშაობს XML-ით. მაგრამ ყველაზე მნიშვნელოვანი უპირატესობა, ალბათ, არ არის სიჩქარე, არამედ ბევრად უფრო ფართო შესაძლებლობები. მე არ ჩავუღრმავდები სარეველებს, მაგრამ უბრალოდ მივცემ მარტივ მაგალითს და ბმულს ყველა ტეგის დეტალური აღწერა.

ასე რომ, სათაურების გენერირების შემდეგ, ჩვენ უნდა მივცეთ ფაქტობრივი მონაცემები მომხმარებელს. მე ჩვეულებრივ ვახვევ მაგიდის გენერაციას ცალკე მეთოდით:
echo $object->getContent();

და მე ვქმნი ცხრილს Smarty-ის გამოყენებით:

(foreach from=$data.header item=caption) ($caption.columnName)(/ foreach)(წინასწარ =$data.content ელემენტი=რიგი) (წინასწარ =$row item=col) ($col)(/ foreach)(/ foreach)

როგორც კოდიდან ხედავთ, $data მასივი გადაეცემა შაბლონს, რომელიც შეიცავს ორ მასივს - ცხრილის სათაურის ხაზს და თავად მონაცემებს.
აღსანიშნავია, რომ შაბლონის ძრავის გამოყენება მხოლოდ XML-ის გენერირებისთვის გარკვეულწილად ძვირია და XML-ის მიღება შესაძლებელია მრავალი სხვა გზით. ჩემს კონკრეტულ შემთხვევაში, XML თაობა მხოლოდ მცირე ბონუსია დიდ პროექტში, სადაც შაბლონის ძრავა შეუცვლელია.

მაგალითად, მე მივეცი მარტივი ცხრილი, თუ სასურველია, შეგიძლიათ ატრიბუტების ბევრად უფრო დიდი რაოდენობით მანიპულირება. ეს განსაკუთრებით სასიამოვნოა იმის გათვალისწინებით, რომ არ არის საჭირო მესამე მხარის ბიბლიოთეკები განსახორციელებლად.
აღწერილი მეთოდი რამდენიმე წელია მუშაობს ერთ პროექტზე და ჯერ არც ერთ მომხმარებელს არ გაუჩნდა ეჭვი, რომ მის მიერ გახსნილი მონაცემები არ არის MS Office დოკუმენტი.

შეგიძლიათ მეტი წაიკითხოთ MS Excel-ში გამოყენებული XML სტრუქტურის შესახებ

ბევრისთვის მუშაობისას PHP MySQL-თან ერთადარსებობს ისეთი საჭიროება, როგორიცაა მონაცემთა ბაზიდან xls ფორმატში ექსპორტი, რათა ადამიანებს, რომლებსაც ეს მონაცემები სჭირდებათ, დაამუშავონ ისინი Excel პროგრამაან უბრალოდ მოსახერხებელი იყო მომხმარებლებისთვის ამ მონაცემების ნახვა. ცოტა ხნის წინ ასეთი საჭიროება გამიჩნდა და დღეს გეტყვით, როგორ შეიძლება ამ საქმის განხორციელება.

მაშინვე ვიტყვი, რომ ეს მეთოდი საკმაოდ მარტივია, მაგრამ მონაცემები ჩვეულებრივ იტვირთება.

დასაწყისისთვის მე მივცემ საბოლოო xls ფაილის მაგალითს Excel-ში, ატვირთვა ასე გამოიყურება:

სხვა სიტყვებით რომ ვთქვათ, არცერთი სურათი ან სტილი არ აიტვირთება, მხოლოდ სვეტების სათაურები და თავად მონაცემები.

სანამ ამ კონკრეტულ ატვირთვის ვარიანტს მივიდოდი, ვცადე ატვირთვა csv ფორმატში, მაგრამ ცოტა მოუხერხებლად გამომივიდა, მერე ცხრილის დახატვა და xls გაფართოებით შენახვა ვცადე, ესეც რაღაც სისულელე აღმოჩნდა. მეთოდი, რომელსაც ახლა აღვწერ, სრულიად მომეწონა და ახლა გაგიზიარებთ.

დასაწყისისთვის მე მოგცემთ ყველა კოდს, რომელიც შეძლებისდაგვარად დავაკომენტარე, შეგიძლიათ აირჩიოთ და შეინახოთ php გაფართოებადა სცადეთ, უბრალოდ არ დაგავიწყდეთ მონაცემთა ბაზის კავშირის პარამეტრების მითითება.

მონაცემების ექსპორტი MySQL-დან Excel-ში PHP-ში

და ისე რომ გაიგოთ რა მონაცემებს ვტვირთავ, მონაცემთა ბაზაში მარტივი ცხრილის მაგალითს მივცემ ( მე მაქვს მისი სახელის ტესტი):

ტესტის ცხრილი:

id სახელი სახელი
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 ) //თუ ტექსტური ფუნქცია RecText($ col, $value)($len = strlen($value);$this->xlsData .= pack); (" s*", 0x0204, 8 + $len, $ col, 0x00, $this->xlsData .= $value return ) // ჩადეთ რიცხვითი ფუნქცია InsertNumber($value); if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ ღირებულება $this->countCol++ ) // InsertText ($value) ფუნქცია ($this->countCol == $this->totalCol) ($this->countCol = 0); >countRow++ ) $this->RecText($this->countCol, $this->countCol++) ($this->); countCol = 0 ; დაბრუნება;) // ფაილის ფუნქციის შენახვა SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // ფაილის ფუნქციის გაგზავნა SendFile())( $this->EndData(); header ("Last-Modified: " . gmdate("D,d M YH:i:s") . "GMT" ("Cache-Control: no-store, no-cache, must-revalidate"); header (" Pragma: no-cache" ("Content-type: application/x-msexcel"); ->xlsData ) ) if(isset($_GET["id"])) (//გაფილტრე მონაცემები $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES))) $filename = "File_with_".$id // დააყენეთ ფაილის სახელი $excel = new ExportToExcel( // შექმენით ინსტანცია კლასის $sql="SELECT * FROM test.test"; //შეკითხვა $rez= mysql_query($sql->InsertText("Identifier">InsertText("გვარი"); excel->GoNewLine( row=mysql_fetch_assoc($rez))($excel->InsertNumber($row["id"]); $excel->InsertText($row["firstname"]);$excel->InsertText($row["name"]); $excel->GoNewLine();.

ამ კოდის ფუნქციონირების შესამოწმებლად, იმის გათვალისწინებით, რომ თქვენ დააკონფიგურირეთ კავშირი მონაცემთა ბაზასთან და შექმენით მსგავსი ცხრილი, შეგიძლიათ გაგზავნოთ შემდეგი მოთხოვნა:

Http://your_site/file_name. php?id=2

და თქვენ უნდა განტვირთოთ ორი ხაზი, რომელთა ID ტოლია 2.

ახლა კი ყველას, ვისაც მონაცემების ატვირთვის ნებას აძლევთ, შეუძლიათ მარტივად გაიტანონ ისინი საკუთარ თავში ლოკალური კომპიუტერიმეშვეობით ვებ ინტერფეისი. ეს მეთოდი მოსახერხებელია როგორც კორპორატიული მომხმარებლებისთვის, თუ თქვენ ამზადებთ აპლიკაციას თქვენი ორგანიზაციისთვის, ასევე თქვენი ვებსაიტის მომხმარებლებისთვის ინტერნეტში. იმედი, ამ მეთოდითდაგეხმარა. წარმატებები!