[สอบถาม] เรื่องวิธการสร้าง Excel จาก PHPSpreadsheet ครับ
ถาม-ตอบ แนะนำไอเดียว โค้ดตัวอย่าง แนวทาง วิธีแก้ปัญหา [สอบถาม] เรื่องวิธการสร้าง Excel จาก PHPSpreadsheet ครับ
[สอบถาม] เรื่องวิธการสร้าง Excel จาก PHPSpreadsheet ครับ
ตอนนี้ผมกำลัง test การ สร้าง excel จาก PHPSpreadsheet ครับ จาก
กระทู้นี้ครับ https://www.ninenik.com/content.php?arti_id=928 แล้วที่นี้
ผมอยากจะให้สร้างเสร็จให้ โหลดมาแล้วเปิดได้เลย ผมเลยทำแบบนี้
แล้วผลที่ได้คือ มัน export ให้ แต่เปิดไม่ได้ มันเป็นแบบนี้ ครับ
![]()
คือไม่อยากให้ เซฟไฟล์ลง เซิฟเวอร์อ่ะครับ อยากให้ เซฟลง เครื่องของ user เลย ผมต้องปรับ โค๊ดตรงไหนไมครับ
ขอบคุณครับ
กระทู้นี้ครับ https://www.ninenik.com/content.php?arti_id=928 แล้วที่นี้
ผมอยากจะให้สร้างเสร็จให้ โหลดมาแล้วเปิดได้เลย ผมเลยทำแบบนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function phpexcel() { //echo 'PHPExcel'; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet ->getActiveSheet(); // การกำหนดค่า ข้อมูลเกี่ยวกับไฟล์ excel $sheet ->setCellValue( 'A1' , 'Hello World!!' ); // กำหนดค่าใน cell A1 $sheet ->setCellValue( 'A2' , 'ทดสอบข้อความภาษาไทย!!' ); // กำหนดค่าใน cell A2 $writer = new Xlsx( $spreadsheet ); // ชื่อไฟล์ $rand_no = rand(000000, 999999); $filename = 'ExcelNo-' . date ( "dmY_His" ) . '.xlsx' ; //save our document as this file name header( 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ); header( 'Content-Disposition: attachment;filename="' . $filename . '"' ); header( 'Cache-Control: max-age=0' ); } |
แล้วผลที่ได้คือ มัน export ให้ แต่เปิดไม่ได้ มันเป็นแบบนี้ ครับ
คือไม่อยากให้ เซฟไฟล์ลง เซิฟเวอร์อ่ะครับ อยากให้ เซฟลง เครื่องของ user เลย ผมต้องปรับ โค๊ดตรงไหนไมครับ
ขอบคุณครับ

คำแนะนำ และการใช้งาน
สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก
- ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
ความคิดเห็นที่
1
เช็คดูว่า มีการเรียกใช้งาน spreadsheet กับ writer class หรือไม่
![]()
ตรวจสอบเปิดไฟล์ excel ที่ได้ใน text editor เช่น notepad หรือ nodepad++ ว่ามีค่าอื่นๆ แทรกเข้ามาหรือไม่ บางทีอาจจะมีค่า
ที่ถูก print แสดงอยู่ในไฟล์นั้น
ตรวจสอบเปิดไฟล์ excel ที่ได้ใน text editor เช่น notepad หรือ nodepad++ ว่ามีค่าอื่นๆ แทรกเข้ามาหรือไม่ บางทีอาจจะมีค่า
ที่ถูก print แสดงอยู่ในไฟล์นั้น
บทความแนะนำที่เกี่ยวข้อง | |
---|---|
การติดตั้ง PHPExcel ให้สามารถใช้งานกับ Codeigniter | อ่าน 10,932 |
ใช้งาน Intervention Image ผ่าน Composer ร่วมกับ Codeigniter เบื้องต้น | อ่าน 6,525 |
ออกรายงานเป็น Excel ไฟล์ ด้วย PhpSpreadsheet เบื้องต้น ตอนที่ 1 | อ่าน 17,688 |

ความคิดเห็นที่
2
เช็คดูว่า มีการเรียกใช้งาน spreadsheet กับ writer class หรือไม่
- ประกาศเรียกใช้แล้วครับ
![]()
ส่วนผมดูไม่เป็นว่า ตอนเปิด ใน editor แล้ว ต้องเป็นแบบไหน แต่ผมลองเปิดจากไลฟ์ที่ create ออกมาแล้วเป็นแบบนี้ครับ
- ประกาศเรียกใช้แล้วครับ
ส่วนผมดูไม่เป็นว่า ตอนเปิด ใน editor แล้ว ต้องเป็นแบบไหน แต่ผมลองเปิดจากไลฟ์ที่ create ออกมาแล้วเป็นแบบนี้ครับ

ความคิดเห็นที่
3
สังเกตจะมีคำว่า PHPExcel ก่อนคำว่า Pk ค่านี้ถูก print มาจากคำสั่งไหนสักคำสั่ง ลองเช็คดู แล้วลบค่านี้ออก
หรือจะทดสอบลบออกในโปรแกรม notepad++ แล้วบันทึกไฟล์ และลองเปิดไฟล์ใหม่ดู
หากไม่มีอะไรผิดพดลาด จะสามารถเปิดไฟล์ได้ปกติ
------------------------------------------
ควรได้ไฟล์ลักษณะนี้
หรือจะทดสอบลบออกในโปรแกรม notepad++ แล้วบันทึกไฟล์ และลองเปิดไฟล์ใหม่ดู
หากไม่มีอะไรผิดพดลาด จะสามารถเปิดไฟล์ได้ปกติ
------------------------------------------
ควรได้ไฟล์ลักษณะนี้

ความคิดเห็นที่
4
ผมลองเชคดูแล้ว ไฟล์ที่ create ออกมาเป็นแบบนี้![]()
ก็ยังเปิดไมไ่ด้เหมือนเดิมครับ
แต่ผมสงสัยว่า ถ้าเป็นเปลี่ยนโค็ดเป็นแบบนี้
กลับเปิดได้ปกติ
ก็ยังเปิดไมไ่ด้เหมือนเดิมครับ
แต่ผมสงสัยว่า ถ้าเป็นเปลี่ยนโค็ดเป็นแบบนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function phpexcel() { //echo 'PHPExcel'; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet ->getActiveSheet(); // การกำหนดค่า ข้อมูลเกี่ยวกับไฟล์ excel $sheet ->setCellValue( 'A1' , 'Hello World!!' ); // กำหนดค่าใน cell A1 $sheet ->setCellValue( 'A2' , 'ทดสอบข้อความภาษาไทย!!' ); // กำหนดค่าใน cell A2 $writer = new Xlsx( $spreadsheet ); // ชื่อไฟล์ $rand_no = rand(000000, 999999); $filename = 'ExcelNo-' . date ( "dmY_His" ) . '.xlsx' ; //save our document as this file name // header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // header('Content-Disposition: attachment;filename="' . $filename . '"'); // header('Cache-Control: max-age=0'); $writer ->save( $filename ); } |

ความคิดเห็นที่
5
ให้เปิดไฟล์ excel ที่เปิดได้ กับที่เปิดไม่ได้ใน notepad++ เปรียบเทียบดู
ไฟล์ที่เปิดได้ จะขึ้นต้นด้วย PK ไม่มีช่องว่างด้านหน้า ไม่มีบรรทัดว่างด้านบน ดูรูปที่แนะนำไป
ไฟล์ที่เปิดไม่ได้ จะมีข้อความอื่นเข้ามาแทรก หรือไม่ก็มีช่องว่างด้านหน้า หรือมีบรรทัดว่างด้านบน
1 2 | คำสั่ง |
จะมองที่เริ่มต้นของโค้่ดคำสั่ง ทั้งหมดจนจบคำสั่ง
1 2 | ส่วนคำสั่ง $writer ->save( $filename ); |
จะจัดการทีเฉพาะส่วนของข้อมูล ถึงเราจะ echo ค่าอะไร ก็ไม่มีผลต่อค่าที่ถูกเขียนเข้าไปในไฟล์
เพราะเป็นคำสั่งที่ไม่เกี่ยวกับการเขียนไฟล์
ไล่หาช่องว่าง หรือบรรทัดทั้งหมด ที่ทำให้เกิดช่องว่าง น่าจะช่วยได้

ความคิดเห็นที่
6
สังเกต 2 โค้ดนี้
output1.php
ไฟล์ที่ได้
![]()
output2.php
ไฟล์ที่ได้
![]()
เสมือนกับกรณีดาวน์โหลดไฟล์ กับ save ไฟล์
การ save ไฟล์จะสนใจเฉพาะข้อมูล ที่เขียนลงไปเท่านั้น จึงไม่มีข้อมูลเข้ามาแทรกในไฟล์ ทีให้ไฟล์มีรูปแบบข้อมูลผิดเพี้ยนไป
แต่กรณีการใช้ header จะใช้ค่าที่แสดงทั้งหมด ก่อนคำสั่ง header เป็นข้อมูลสำหรับเขียนลงไฟล์ในการดาวน์โหลด
ทำให้ มีบางค่า ที่เราออาจจะไม่ต้องการติดมาด้วย ซึ่งเราต้องไล่เช็คไม่ให้มีค่าใดๆ ที่ไม่ต้องการ แทรกเข้ามาก่อนใช้คำสั่ง header
ปัญหาเช่นเดียวกัน หากมีบางค่าเข้ามาแทรกในส่วนของข้อมูลของไฟล์ Excel ก็จะทำให้เปิดไฟล์ไม่ได้ เพราะรูปแบบไฟล์มีความผิดเพื้ยนไป
output1.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ข้อความ และช่องว่างก่อนใช้คำสัง <?php echo " Data in code" ; // สมมติเป็นบล็อคของชุดคำสั่งเขียนไฟล์ ob_start(); echo "Hello " ; $out1 = ob_get_contents(); echo "World" ; $out2 = ob_get_contents(); ob_end_clean(); $final_out = "Value from code " . $out1 . $out2 ; // ชื่อไฟล์ $file_export = date ( "dmY-Hs" ). ".txt" ; // เอาค่าใดๆ ก็ตาม ที่แสดงก่อนนี้ ทั้งในคำสั่ง php หรือนอกคำสั่ง php // เป็นข้อมูลสำหรับไฟล์ดาวน์โหลด เข้าใจง่าย อะไรที่แสดงก่อนหน้าคำสั่ง // ด้านล่างนี้ จะถูกใช้เป็นข้อมูล header( 'Content-Type: text/plain' ); header( 'Content-Disposition: attachment;filename="' . $file_export . '"' ); header( "Content-Transfer-Encoding: binary " ); exit ; ?> |
output2.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ข้อความ และช่องว่างก่อนใช้คำสัง <?php echo " Data in code" ; // สมมติเป็นบล็อคของชุดคำสั่งเขียนไฟล์ ob_start(); echo "Hello " ; $out1 = ob_get_contents(); echo "World" ; $out2 = ob_get_contents(); ob_end_clean(); $final_out = "Value from code " . $out1 . $out2 ; // ชื่อไฟล์ $file_export = date ( "dmY-Hs" ). ".txt" ; // เอาข้อมูลจากตัวแปร ที่อยู่ในบล็อคคำสั่ง เขียนลงไฟล์ file_put_contents ( $file_export , $final_out ); exit ; ?> |
ไฟล์ที่ได้
เสมือนกับกรณีดาวน์โหลดไฟล์ กับ save ไฟล์
การ save ไฟล์จะสนใจเฉพาะข้อมูล ที่เขียนลงไปเท่านั้น จึงไม่มีข้อมูลเข้ามาแทรกในไฟล์ ทีให้ไฟล์มีรูปแบบข้อมูลผิดเพี้ยนไป
แต่กรณีการใช้ header จะใช้ค่าที่แสดงทั้งหมด ก่อนคำสั่ง header เป็นข้อมูลสำหรับเขียนลงไฟล์ในการดาวน์โหลด
ทำให้ มีบางค่า ที่เราออาจจะไม่ต้องการติดมาด้วย ซึ่งเราต้องไล่เช็คไม่ให้มีค่าใดๆ ที่ไม่ต้องการ แทรกเข้ามาก่อนใช้คำสั่ง header
ปัญหาเช่นเดียวกัน หากมีบางค่าเข้ามาแทรกในส่วนของข้อมูลของไฟล์ Excel ก็จะทำให้เปิดไฟล์ไม่ได้ เพราะรูปแบบไฟล์มีความผิดเพื้ยนไป

ขอบคุณทุกการสนับสนุน
![]()