ทำรายงาน Excel และ CSV จาก Laravel ให้คนไทยเปิดใช้ได้จริง เริ่มจากเลือก package แล้วไล่เรื่องภาษาไทย วันที่ พ.ศ. เลขบัตรประชาชน ความกว้างคอลัมน์และการจัดหน้าตารายงาน ต่อด้วยวิธีใช้ Laravel Excel กับ OpenSpout การกัน memory หมด การส่งไฟล์ให้ผู้ใช้ ความปลอดภัย และการเขียน test
- 1

วิธีเลือก package export Excel ใน PHP ให้เหมาะกับงาน
รายงานเล็กที่ต้องจัดหน้าตาใช้ Laravel Excel หรือ PhpSpreadsheet ไฟล์หลายหมื่นแถวขึ้นไปใช้ OpenSpout ที่เขียนทีละแถว ส่วนไฟล์ให้ระบบอื่นอ่านใช้ CSV ผ่าน league/csv และเลิกใช้ PHPExcel ได้แล้ว
· อ่าน 5 นาที
- 2

วิธีทำไฟล์ CSV ภาษาไทยให้เปิดใน Excel แล้วอ่านออก
Excel บน Windows จะอ่าน CSV เป็น UTF-8 ก็ต่อเมื่อไฟล์ขึ้นต้นด้วย BOM สามไบต์ ใส่ BOM ให้ไฟล์ที่คนเปิดใน Excel ไม่ต้องใส่ให้ไฟล์ที่โปรแกรมอ่าน และแปลงเป็น TIS-620 ด้วย iconv เมื่อต้องส่งให้ระบบเก่า
· อ่าน 6 นาที
- 3

วิธีใส่วันที่ พ.ศ. ในไฟล์ Excel ที่ export จาก Laravel
เขียนวันที่ลงเซลล์เป็นวันที่จริงของ Excel แล้วให้ number format อย่าง [$-107041E]d mmm yyyy แสดงเป็น พ.ศ. ผู้ใช้จะเห็นปี พ.ศ. และยัง sort, filter และคำนวณวันได้ ต่างจากการเขียน thaidate() เป็นข้อความ
· อ่าน 4 นาที
- 4

วิธีกันเลขบัตรประชาชนกลายเป็น 1.23E+12 ในไฟล์ Excel
เลขบัตรประชาชน เลขผู้เสียภาษี เบอร์โทร และรหัสเอกสารต้องเขียนลงเซลล์เป็นข้อความตั้งแต่แรก ด้วย setValueExplicit หรือส่งเป็น string ให้ OpenSpout ส่วนยอดเงินต้องเขียนเป็นตัวเลขแล้วให้ number format จัดหน้าตา
· อ่าน 5 นาที
- 5

วิธีตั้งความกว้างคอลัมน์ Excel ให้พอดีกับข้อความภาษาไทย
PhpSpreadsheet เดาความกว้างคอลัมน์จากจำนวนตัวอักษร ซึ่งนับสระบนล่างกับวรรณยุกต์ไทยเป็นตัวด้วย คอลัมน์ภาษาไทยจึงกว้างเกินจริง ส่วน OpenSpout ไม่วัดให้เลย ทางที่นิ่งกว่าคือกำหนดความกว้างจากชื่อหัวคอลัมน์ ใช้ฟอนต์ที่มีอยู่ในเครื่องคนเปิด และตั้งชื่อชีทไทยให้ไม่เกิน 31 ตัว
· อ่าน 5 นาที
- 6

วิธีจัดหน้าตารายงาน Excel ให้พร้อมส่งผู้บริหาร
รายงาน Excel ที่เปิดแล้วอ่านต่อได้ทันทีมีหัวรายงาน หัวตารางที่ตรึงไว้พร้อมตัวกรอง ไฮไลต์แถวที่ต้องดู ยอดรวมที่แยกสไตล์ และแยกชีทตามเรื่อง ทั้งหมดตั้งเป็นช่วงทีเดียว ไม่ต้องวนทีละช่อง
· อ่าน 5 นาที
- 7

วิธีเขียน export ด้วย Laravel Excel ตั้งแต่ 3.1 ถึง 4.0
Laravel Excel ให้เขียนหนึ่งคลาสต่อหนึ่งไฟล์ แล้วเลือก concern ตามที่ต้องการ เช่น FromQuery ดึงข้อมูล WithMapping จัดแถว WithColumnFormatting ใส่รูปแบบตัวเลข และ WithMultipleSheets แยกชีท ส่วน 4.0 เพิ่ม WithColumns กับ ShouldBatch และต้องใช้ PHP 8.3 กับ Laravel 12 ขึ้นไป
· อ่าน 5 นาที
- 8

วิธีเขียน Excel ไฟล์ใหญ่ด้วย OpenSpout โดยไม่ให้ memory หมด
OpenSpout เขียน xlsx ทีละแถวลงไฟล์หรือส่งตรงไปที่เบราว์เซอร์ memory จึงอยู่ราว 2–3 MB ไม่ว่าไฟล์จะใหญ่แค่ไหน จัดตัวหนา สีพื้น รูปแบบตัวเลข merge freeze และ AutoFilter ได้ แต่ต้องกำหนดทุกอย่างก่อนเขียนแถว และไม่มี autosize
· อ่าน 4 นาที
- 9

วิธีกัน memory หมดตอน export Excel ไฟล์ใหญ่จาก Laravel
PhpSpreadsheet เก็บทุกช่องของไฟล์ไว้ใน memory จนกว่าจะบันทึก ไฟล์ล้านช่องจึงกินหลายร้อย MB ไม่ว่าจะ chunk query แค่ไหน ให้นับจำนวนแถวคูณคอลัมน์ก่อน แล้วเลือกเขียนแบบ streaming เมื่อไฟล์ใหญ่ ตั้ง memory_limit ให้แต่ละ job และจำกัดช่วงวันที่ที่ผู้ใช้เลือกได้
· อ่าน 5 นาที
- 10

วิธีส่งไฟล์ Excel ให้ผู้ใช้ใน Laravel ตามขนาดของรายงาน
รายงานเล็กดาวน์โหลดใน request ได้เลย รายงานใหญ่ที่เขียนแบบ streaming ใช้ streamDownload ส่วนงานที่ใช้เวลาหลายนาทีให้ส่งเข้าคิวแล้วแจ้งผู้ใช้เมื่อไฟล์พร้อม พร้อมตั้ง timeout ให้เรียงกันและตั้งชื่อไฟล์ให้ถูก
· อ่าน 6 นาที
- 11

วิธีกัน formula injection ในไฟล์ CSV และ Excel ที่ export จากระบบ
ข้อความที่ผู้ใช้พิมพ์แล้วขึ้นต้นด้วย = + - @ จะกลายเป็นสูตรเมื่อพนักงานเปิดไฟล์ใน Excel ทางกันคือเขียนข้อมูลของผู้ใช้เป็น string cell ใน XLSX ใส่ escape ให้ CSV และใช้ library ที่ยังได้รับแพตช์ความปลอดภัย
· อ่าน 4 นาที
- 12

วิธีเขียน test ให้ไฟล์ Excel ที่ export จาก Laravel
ใช้ Excel::fake() เช็กว่าปุ่มเรียก export ถูกตัวและส่งค่าที่ผู้ใช้เลือกไปครบ แล้วสร้างไฟล์จริงด้วย Excel::raw() เปิดกลับด้วย PhpSpreadsheet เพื่อตรวจค่า ชนิดของเซลล์ format และ merge ก่อนเปิดใน Excel เป็นด่านสุดท้าย
· อ่าน 4 นาที