[สอบถาม] เรื่องวิธการสร้าง Excel จาก PHPSpreadsheet ครับ

ถาม-ตอบ แนะนำไอเดียว โค้ดตัวอย่าง แนวทาง วิธีแก้ปัญหา [สอบถาม] เรื่องวิธการสร้าง Excel จาก PHPSpreadsheet ครับ

[สอบถาม] เรื่องวิธการสร้าง Excel จาก PHPSpreadsheet ครับ
ตอนนี้ผมกำลัง test การ สร้าง excel จาก PHPSpreadsheet ครับ จาก 
กระทู้นี้ครับ https://www.ninenik.com/content.php?arti_id=928 แล้วที่นี้
ผมอยากจะให้สร้างเสร็จให้ โหลดมาแล้วเปิดได้เลย ผมเลยทำแบบนี้

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('php://output');
	}

แล้วผลที่ได้คือ มัน export ให้ แต่เปิดไม่ได้ มันเป็นแบบนี้ ครับ



คือไม่อยากให้ เซฟไฟล์ลง เซิฟเวอร์อ่ะครับ อยากให้ เซฟลง เครื่องของ user เลย ผมต้องปรับ โค๊ดตรงไหนไมครับ

ขอบคุณครับ


Nutzaaclub 183.88.228.xxx 27-11-2019 15:45:17

คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ


  • ( หรือ เข้าใช้งานผ่าน Social Login )

 ความคิดเห็นที่ 1
เช็คดูว่า มีการเรียกใช้งาน spreadsheet กับ writer class หรือไม่



ตรวจสอบเปิดไฟล์ excel ที่ได้ใน text editor เช่น notepad หรือ nodepad++ ว่ามีค่าอื่นๆ แทรกเข้ามาหรือไม่ บางทีอาจจะมีค่า
ที่ถูก print แสดงอยู่ในไฟล์นั้น



บทความแนะนำที่เกี่ยวข้อง
การติดตั้ง PHPExcel ให้สามารถใช้งานกับ Codeigniterอ่าน 7,601
ใช้งาน Intervention Image ผ่าน Composer ร่วมกับ Codeigniter เบื้องต้นอ่าน 4,524
ออกรายงานเป็น Excel ไฟล์ ด้วย PhpSpreadsheet เบื้องต้น ตอนที่ 1อ่าน 8,320
ninenik 124.122.198.xxx 27-11-2019
 ความคิดเห็นที่ 2
เช็คดูว่า มีการเรียกใช้งาน spreadsheet กับ writer class หรือไม่
- ประกาศเรียกใช้แล้วครับ



ส่วนผมดูไม่เป็นว่า ตอนเปิด ใน editor แล้ว ต้องเป็นแบบไหน แต่ผมลองเปิดจากไลฟ์ที่ create ออกมาแล้วเป็นแบบนี้ครับ




nutzaaclub 183.88.228.xxx 27-11-2019 18:50
 ความคิดเห็นที่ 3
สังเกตจะมีคำว่า PHPExcel ก่อนคำว่า Pk ค่านี้ถูก print มาจากคำสั่งไหนสักคำสั่ง ลองเช็คดู แล้วลบค่านี้ออก
หรือจะทดสอบลบออกในโปรแกรม notepad++ แล้วบันทึกไฟล์ และลองเปิดไฟล์ใหม่ดู
หากไม่มีอะไรผิดพดลาด จะสามารถเปิดไฟล์ได้ปกติ


------------------------------------------
ควรได้ไฟล์ลักษณะนี้



ninenik 223.24.144.xxx 27-11-2019
 ความคิดเห็นที่ 4
ผมลองเชคดูแล้ว ไฟล์ที่ create ออกมาเป็นแบบนี้

ก็ยังเปิดไมไ่ด้เหมือนเดิมครับ 
แต่ผมสงสัยว่า ถ้าเป็นเปลี่ยนโค็ดเป็นแบบนี้ 
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);
	}
กลับเปิดได้ปกติ


nutzaaclub 183.88.228.xxx 28-11-2019 12:04
 ความคิดเห็นที่ 5
ให้เปิดไฟล์ excel ที่เปิดได้ กับที่เปิดไม่ได้ใน notepad++ เปรียบเทียบดู
ไฟล์ที่เปิดได้ จะขึ้นต้นด้วย PK ไม่มีช่องว่างด้านหน้า ไม่มีบรรทัดว่างด้านบน ดูรูปที่แนะนำไป
ไฟล์ที่เปิดไม่ได้ จะมีข้อความอื่นเข้ามาแทรก หรือไม่ก็มีช่องว่างด้านหน้า หรือมีบรรทัดว่างด้านบน
 
คำสั่ง
$writer->save('php://output');
 
จะมองที่เริ่มต้นของโค้่ดคำสั่ง ทั้งหมดจนจบคำสั่ง
 
ส่วนคำสั่ง
$writer->save($filename);
จะจัดการทีเฉพาะส่วนของข้อมูล ถึงเราจะ echo ค่าอะไร ก็ไม่มีผลต่อค่าที่ถูกเขียนเข้าไปในไฟล์
เพราะเป็นคำสั่งที่ไม่เกี่ยวกับการเขียนไฟล์
 
ไล่หาช่องว่าง หรือบรรทัดทั้งหมด ที่ทำให้เกิดช่องว่าง น่าจะช่วยได้
 


ninenik 58.11.6.xxx 28-11-2019
 ความคิดเห็นที่ 6
สังเกต 2 โค้ดนี้

output1.php


ข้อความ และช่องว่างก่อนใช้คำสัง

<?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


ข้อความ และช่องว่างก่อนใช้คำสัง

<?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 ก็จะทำให้เปิดไฟล์ไม่ได้ เพราะรูปแบบไฟล์มีความผิดเพื้ยนไป


ninenik 223.24.167.xxx 28-11-2019
1






เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ