Php simpan jadual untuk cemerlang. Eksport data dari php ke excel. Eksport data daripada MySQL ke Excel dalam PHP

.
Kaedah yang dibentangkan dalam nota itu sememangnya sangat mudah, tetapi mungkin tidak selalunya mudah.
Terdapat banyak cara lain untuk memindahkan data jadual dari PHP ke Excel, saya akan menerangkan cara yang saya rasa paling mudah dan berfungsi. Perlu diingatkan terutamanya bahawa saya tidak bercakap tentang menghasilkan fail xls, tetapi hanya mencadangkan pengguna membuka data yang diterima menggunakan Excel supaya pengguna yang tidak berpengalaman dalam pengaturcaraan tidak akan menyedari pemalsuan itu.

Jadi, perkara pertama yang perlu anda lakukan ialah meletakkan pada halaman kami pautan ke skrip yang menjana pengepala berikut:
header("Pragma: awam");
header("Tamat tempoh: 0");
header("Cache-Control: must-revalidate, post-check=0, pra-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("Pengekodan-Pemindahan-Kandungan: binari");
header("Content-Length: " . $object->getFileSize());

$object ialah objek sfera dalam vakum, yang setiap pembaca boleh melaksanakan mengikut kesukaannya. Tujuan getFileName() dan getFileSize() getter adalah jelas daripada nama mereka. Perlu menyerlahkan satu nuansa yang tidak jelas di sini (terima kasih kepada savostin kerana mengingatkan saya tentang perkara ini) - getFileName() sudah tentu boleh mengembalikan sebarang nama fail, tetapi jika anda mahu penyemak imbas menawarkan untuk membuka kandungan yang diterima dalam Excel, maka fail itu sambungan hendaklah xls.
Saya belum mengatakan sesuatu yang baru lagi, semua ini telah dicipta sebelum saya, bagaimanapun, seperti yang akan diterangkan di bawah.
Seperti yang dinyatakan dengan betul dalam ulasan pada siaran tentang penjanaan xls dalam PHP, Excel berfungsi lebih pantas dengan XML. Tetapi kelebihan yang paling penting, mungkin, bukan kelajuan, tetapi keupayaan yang lebih luas. Saya tidak akan pergi lebih jauh ke dalam rumpai, tetapi hanya akan memberikan contoh mudah dan pautan kepada penerangan terperinci semua tag.

Jadi, selepas pengepala dijana, kita perlu memberikan data sebenar kepada pengguna. Saya biasanya membungkus penjanaan jadual dalam kaedah yang berasingan:
echo $object->getContent();

Dan saya menjana jadual menggunakan Smarty:

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

Seperti yang anda boleh lihat daripada kod, tatasusunan $data dihantar ke templat, mengandungi dua tatasusunan - baris tajuk jadual dan data itu sendiri.
Perlu diingat bahawa menggunakan enjin templat hanya untuk menjana XML agak mahal, dan XML boleh diperolehi dalam banyak cara lain. Dalam kes khusus saya, penjanaan XML hanyalah bonus kecil dalam projek besar di mana enjin templat sangat diperlukan.

Sebagai contoh, saya memberikan jadual mudah; jika mahu, anda boleh memanipulasi bilangan atribut yang lebih besar. Ini amat bagus memandangkan tiada perpustakaan pihak ketiga diperlukan untuk pelaksanaan.
Kaedah yang diterangkan telah berfungsi pada satu projek selama beberapa tahun dan belum ada seorang pengguna yang mengesyaki bahawa data yang dibukanya bukan dokumen MS Office.

Anda boleh membaca lebih lanjut mengenai struktur XML yang digunakan dalam MS Excel dalam

.
Kaedah yang dibentangkan dalam nota itu sememangnya sangat mudah, tetapi mungkin tidak selalunya mudah.
Terdapat banyak cara lain untuk memindahkan data jadual dari PHP ke Excel, saya akan menerangkan cara yang saya rasa paling mudah dan berfungsi. Perlu diingatkan terutamanya bahawa saya tidak bercakap tentang menghasilkan fail xls, tetapi hanya mencadangkan pengguna membuka data yang diterima menggunakan Excel supaya pengguna yang tidak berpengalaman dalam pengaturcaraan tidak akan menyedari pemalsuan itu.

Jadi, perkara pertama yang perlu anda lakukan ialah meletakkan pada halaman kami pautan ke skrip yang menjana pengepala berikut:
header("Pragma: awam");
header("Tamat tempoh: 0");
header("Cache-Control: must-revalidate, post-check=0, pra-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("Pengekodan-Pemindahan-Kandungan: binari");
header("Content-Length: " . $object->getFileSize());

$object ialah objek sfera dalam vakum, yang setiap pembaca boleh melaksanakan mengikut kesukaannya. Tujuan getFileName() dan getFileSize() getter adalah jelas daripada nama mereka. Perlu menyerlahkan satu nuansa yang tidak jelas di sini (terima kasih kerana mengingatkan saya tentang perkara ini) - getFileName() sudah tentu boleh mengembalikan sebarang nama fail, tetapi jika anda mahu penyemak imbas menawarkan untuk membuka kandungan yang diterima dalam Excel, maka sambungan fail harus jadi xls.
Saya belum mengatakan sesuatu yang baru lagi, semua ini telah dicipta sebelum saya, bagaimanapun, seperti yang akan diterangkan di bawah.
Seperti yang dinyatakan dengan betul dalam ulasan pada artikel itu, Excel berfungsi lebih pantas dengan XML. Tetapi kelebihan yang paling penting, mungkin, bukan kelajuan, tetapi keupayaan yang lebih luas. Saya tidak akan pergi lebih jauh ke dalam rumpai, tetapi hanya akan memberikan contoh mudah dan pautan kepada penerangan terperinci semua tag.

Jadi, selepas pengepala dijana, kita perlu memberikan data sebenar kepada pengguna. Saya biasanya membungkus penjanaan jadual dalam kaedah yang berasingan:
echo $object->getContent();

Dan saya menjana jadual menggunakan Smarty:

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

Seperti yang anda boleh lihat daripada kod, tatasusunan $data dihantar ke templat, mengandungi dua tatasusunan - baris tajuk jadual dan data itu sendiri.
Perlu diingat bahawa menggunakan enjin templat hanya untuk menjana XML agak mahal, dan XML boleh diperolehi dalam banyak cara lain. Dalam kes khusus saya, penjanaan XML hanyalah bonus kecil dalam projek besar di mana enjin templat sangat diperlukan.

Sebagai contoh, saya memberikan jadual mudah; jika mahu, anda boleh memanipulasi bilangan atribut yang lebih besar. Ini amat bagus memandangkan tiada perpustakaan pihak ketiga diperlukan untuk pelaksanaan.
Kaedah yang diterangkan telah berfungsi pada satu projek selama beberapa tahun dan belum ada seorang pengguna yang mengesyaki bahawa data yang dibukanya bukan dokumen MS Office.

Anda boleh membaca lebih lanjut mengenai struktur XML yang digunakan dalam MS Excel dalam

(data yang diperoleh daripada pangkalan data mysql) untuk berjaya. Saya menggunakan Zend Framework. Saya perlu membuat beberapa perubahan pada data saya sebelum mengeksport ke excel. Malah, saya sebenarnya perlu membuat buku tunai bulanan.

Saya membaca banyak dokumen tetapi mendapati diri saya dalam keadaan kucar-kacir. Saya benar-benar tidak tahu bagaimana untuk memulakan. Adakah saya benar-benar memerlukan PEAR? Adakah saya perlu memuatkan mana-mana perpustakaan kelas? Tidakkah ada cara mudah untuk melakukan ini?

terima kasih terlebih dahulu

Saya cadangkan anda menggunakan perpustakaan PHPExcel. Ia benar-benar berkuasa, menyokong berbilang format, boleh melakukan pemformatan visual dan mudah digunakan.

Anda boleh membaca lebih lanjut mengenainya di halaman web mereka: http://phpexcel.codeplex.com/, (PHPExcel telah pun berpindah ke https://github.com/PHPOffice/PHPExcel)

Contoh penggunaan:

$objPHPExcel = PHPExcel baharu(); /** Anda boleh menetapkan banyak sifat */ $objPHPExcel->getProperties()->setCreator("Syarikat saya") ->setLastModifiedBy("John Doe") ->setTitle("Laporan tahunan") ->setSubject("Jualan ") ->setDescription("Laporan jualan tahunan oleh John Doe") ->setCategory("Kewangan"); /** Pilih satu daripada helaian */ $activeSheet = $objPHPExcel->setActiveSheetIndex(0); /** Hanya tetapkan nilai sel */ $activeSheet->setCellValue("A1", "plural");

Anda boleh melakukan lebih banyak lagi, sudah tentu, membaca fail excel, menetapkan gaya visual, mencipta graf, ungkapan dan banyak lagi.

Saya menulis laporan variasi inventori 94 baris di mana saya mengambil data daripada MySQL (6kb + rekod setiap jadual), mencipta tatasusunan berbilang dimensi daripada data MySQL, tarik daripada berbilang jadual, dan kemudian membuang semuanya ke dalam satu baris dan menjana .xls Oleh itu:

Tiada sambungan diperlukan.

Satu-satunya kaveat ialah saya masih belum mengetahui cara untuk mengeluarkan .xls tanpa Excel, melaporkan bahawa data mungkin rosak - dan saya belum cuba melakukan pemformatan atau apa-apa yang lebih kompleks daripada sekadar "mengeksport" data, Fail/data sudah tentu ok, tetapi ia menghasilkan amaran daripada Excel.

EDIT: Saya harus ambil perhatian bahawa "setup" dan "dump" merujuk kepada yang berikut: daniweb.com

Anda boleh menggunakan perpustakaan phpexcel. Ia membolehkan anda menulis dan membaca daripada format fail hamparan yang berbeza

untuk penyepaduan zend anda boleh mengambil bantuan pautan berikut.

Anda boleh menggunakan CSV untuk membuat format yang boleh diimport untuk excel. Ini adalah cara paling mudah untuk melakukannya.

CSV kelihatan seperti ini:

"kandungan sel pertama saya", "kandungan sel kedua saya", "kandungan sel ketiga saya" "baris kedua, kandungan sel pertama", "dan lain-lain", "dan lain-lain

Setiap baris mewakili rentetan Excel, anda meletakkan kandungan sel di antara petikan berganda dan memisahkannya dengan koma. Berhati-hati jika anda mempunyai beberapa data anda, ia mungkin memecahkan CSV anda dan mencipta baris baharu yang tidak diingini.

Dengan sedikit Google anda akan dapati ini: http://www.the-art-of-web.com/php/dataexport/

Penyediaan data

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

Langkah pertama adalah untuk mengeluarkan data dalam format tab-delimitasi (CSV juga boleh digunakan, tetapi sedikit lebih rumit). Untuk melakukan ini kami menggunakan kod berikut:

Kami menetapkan jenis kandungan kepada teks/biasa supaya hasilnya dapat dilihat dengan lebih mudah dalam penyemak imbas. Jika tidak, kerana tiada pemformatan HTML, output akan muncul sebagai satu baris teks.

Baris pertama output akan menjadi tajuk lajur (dalam kes ini nama medan digunakan). Nilai dipisahkan oleh tab \t dan baris dengan pemisah baris \n. Hasilnya sepatutnya kelihatan seperti ini:

Nama pertama nama keluarga umur Mary Johnson 25 Amanda Miller 18 James Brown 31 Patricia Williams 7 Michael Davis 43 Sarah Miller 24 Patrick Miller 27

Terdapat kelemahan dalam kod ini yang mungkin tidak dapat dilihat dengan segera. Bagaimana jika salah satu medan yang perlu dikeluarkan sudah mengandungi satu atau lebih aksara tab atau, lebih teruk lagi, baris baharu? Ini akan mencetuskan keseluruhan proses kerana kami bergantung pada simbol ini untuk menunjukkan lajur dan pemisah baris.

Penyelesaiannya ialah "melarikan diri" daripada aksara tab. Dalam kes ini, kami akan menggantikan tab dengan literal \t dan pemisah baris dengan literal \n supaya ia tidak menjejaskan pemformatan:

Sekarang, sebelum setiap baris digemakan, mana-mana aksara tab digantikan dengan "\t" supaya lajur kami tidak pecah. Selain itu, sebarang pemisah baris dalam data digantikan dengan "\n".

Bagi ramai, apabila bekerja dengan PHP bersempena dengan MySQL Terdapat keperluan seperti mengeksport data daripada pangkalan data ke format xls, supaya orang yang memerlukan data ini memprosesnya dalam Excel atau mudah untuk pengguna melihat data ini. Baru-baru ini saya mempunyai keperluan sedemikian dan hari ini saya akan memberitahu anda bagaimana perkara ini boleh dilaksanakan.

Saya akan katakan dengan segera bahawa kaedah ini agak mudah, tetapi data dimuat naik seperti biasa.

Sebagai permulaan, saya akan memberikan contoh fail xls akhir; dalam Excel, muat naik akan kelihatan seperti ini:

Dalam erti kata lain, tiada imej atau gaya akan dimuat naik, hanya pengepala lajur dan data itu sendiri.

Sebelum saya sampai ke pilihan ini untuk memuat naik, saya cuba memuat naik dalam format csv, tetapi ternyata agak kekok, kemudian saya cuba melukis jadual dan menyimpannya dengan sambungan xls, ternyata ia juga agak karut. , kaedah yang saya akan terangkan sekarang sesuai sepenuhnya dengan saya, dan sekarang saya akan berkongsi dengan anda.

Sebagai permulaan, saya akan memberikan semua kod, yang saya ulas sebanyak mungkin, anda boleh memilihnya dan menyimpannya dengan sambungan php dan cuba, cuma jangan lupa untuk menentukan tetapan untuk menyambung ke pangkalan data.

Eksport data daripada MySQL ke Excel dalam PHP

Dan supaya anda memahami data yang saya muat naik, saya akan memberikan contoh jadual ringkas dalam pangkalan data ( Saya mempunyai ujian namanya):

Jadual ujian:

ID nama pertama nama
1 Ivanov Ivan
2 Petrov Peter
2 Petrov2 Peter2
xlsData = pek("ssssss", 0x809, 0x08, 0x00,0x10, 0x0, 0x0); ) // Jika nombor berfungsi RecNumber($row, $col, $value)( $this->xlsData .= pack("sssss", 0x0203, 14, $row, $col, 0x00); $this->xlsData . = pack("d", $value); return; ) //Jika fungsi teks RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack ("s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; return; ) // Masukkan fungsi nombor InsertNumber($value)( if ($ this->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ nilai); $this->countCol++; return; ) // Masukkan fungsi teks InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this- >countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // Pergi ke fungsi baris baharu GoNewLine())( $this ->countCol = 0 ; $this->countRow++; return; ) //Tamat fungsi data EndData())( $this->xlsData .= pack("ss", 0x0A, 0x00); kembali; ) // Simpan fungsi fail SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // Hantar fungsi fail SendFile())( $this->EndData(); pengepala (" Terakhir Diubah Suai: " . gmdate("D,d M YH:i:s") . " GMT"); pengepala ("Cache-Control: no-store, no-cache, must-revalidate"); header (" Pragma: no-cache"); header ("Content-type: application/x-msexcel"); header ("Content-Disposition: attachment; fileName=$this->fileName.xls");cetak $this ->xlsData ; ) ) ) if(isset($_GET["id"])) ( //tapis data $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))) ; $filename = "File_with_id_".$id; // tetapkan nama fail $excel = new ExportToExcel(); // buat instance kelas $sql="SELECT * FROM test.test where id = $id"; //pertanyaan ke pangkalan data $rez= mysql_query($sql); $excel->InsertText("Identifier"); $excel->InsertText("Nama Akhir"); $excel->InsertText("Nama"); $ excel->GoNewLine(); While($ row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]); $excel->InsertText($row["nama pertama"]); $excel->InsertText($row["nama"]); $excel->GoNewLine(); ) $excel->SaveFile($filename); ) ?>

Keseluruhan idea di sini adalah fungsi pek(), yang membungkus data ke dalam rentetan binari, dan kami, seterusnya, mengisi rentetan ini secara berurutan dengan data yang kami muat turun daripada pangkalan data MySql menggunakan fungsi normal mysql_query().

Untuk menyemak kefungsian kod ini, dengan mengambil kira hakikat bahawa anda telah mengkonfigurasi sambungan ke pangkalan data dan membuat jadual yang serupa, anda boleh menghantar permintaan berikut:

Http://tapak_anda/nama_fail. php?id=2

Dan anda harus memunggah dua baris dengan id sama dengan 2.

Dan kini sesiapa sahaja yang anda benarkan untuk memuat naik data boleh mengeksportnya dengan mudah ke komputer tempatan mereka melalui antara muka web. Kaedah ini sesuai untuk pengguna korporat, jika anda sedang membangunkan aplikasi untuk organisasi anda dan untuk pengguna tapak web anda di Internet. Saya harap kaedah ini membantu anda. Semoga berjaya!