การอัปโหลดไปยัง Excel จาก mysql php วิธีง่ายๆ ในการถ่ายโอนข้อมูลแบบตารางจาก PHP ไปยัง Excel ส่งออกข้อมูลจาก MySQL ไปยัง Excel ใน PHP

วัตถุ แต่สิ่งต่างๆ จะแตกต่างออกไปหากคุณต้องการสร้างรายงานในรูปแบบ Excel PHP. และเพื่อให้การสร้างสรรค์นี้ดำเนินต่อไป ยูนิกซ์-เหมือนระบบ แต่โชคดีที่ทุกอย่างก็ไม่ได้แย่ขนาดนั้น และมีห้องสมุดเพียงพอสำหรับสิ่งนี้ ฉันเลือก PHPExcel. ฉันทำงานกับห้องสมุดนี้มาสองสามปีแล้ว และฉันก็พอใจ เนื่องจากเป็นแพลตฟอร์มข้ามแพลตฟอร์ม จึงไม่มีปัญหาเรื่องการพกพา


PHPExcel ช่วยให้คุณสามารถนำเข้าและส่งออกข้อมูลไปยัง Excel ใช้สไตล์การออกแบบที่แตกต่างกันกับรายงาน โดยทั่วไปแล้วทุกอย่างเป็นเลิศ มีแม้กระทั่งความสามารถในการทำงานกับสูตร จำเป็นต้องคำนึงว่างานทั้งหมด (การอ่านและการเขียน) จะต้องดำเนินการในการเข้ารหัส utf-8.


การติดตั้งห้องสมุด

ในการทำงาน คุณต้องใช้ PHP เวอร์ชัน 5.2.0 ขึ้นไป จำเป็นต้องมีส่วนขยายต่อไปนี้: php_zip, php_xml และ php_gd2 คุณสามารถดาวน์โหลดห้องสมุดได้จากที่นี่


เมื่อใช้ไลบรารี PHPExcel คุณสามารถเขียนข้อมูลในรูปแบบต่อไปนี้:

  • เอ็กเซล 2007;
  • Excel 97 และใหม่กว่า;
  • PHPExcel สเปรดชีตต่อเนื่อง;
  • HTML;

การนำเข้าข้อมูลจาก PHP ไปยัง Excel

ลองดูตัวอย่างการสร้างตารางสูตรคูณ


// เชื่อมต่อคลาสเพื่อทำงานกับ excel need_once("PHPExcel.php"); // เชื่อมต่อคลาสเพื่อส่งออกข้อมูลในรูปแบบ Excel need_once("PHPExcel/Writer/Excel5.php"); // สร้างอ็อบเจ็กต์ของคลาส PHPExcel $xls = new PHPExcel(); // ตั้งค่าดัชนีของแผ่นงานที่ใช้งานอยู่ $xls->setActiveSheetIndex(0); // รับแผ่นงานที่ใช้งานอยู่ $sheet = $xls->getActiveSheet(); // เซ็นชื่อในชีต $sheet->setTitle("ตารางสูตรคูณ"); // ใส่ข้อความลงในเซลล์ A1 $sheet->setCellValue("A1", "Multiplication table"); $sheet->getStyle("A1")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID); $sheet->getStyle("A1")->getFill()->getStartColor()->setRGB("EEEEEE"); // รวมเซลล์ $sheet->mergeCells("A1:H1"); // จัดแนวข้อความ $sheet->getStyle("A1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); สำหรับ ($i = 2; $i< 10; $i++) { for ($j = 2; $j < 10; $j++) { // Выводим таблицу умножения $sheet->setCellValueByColumnAndRow($i - 2, $j, $i . "x" .$j . "=" . ($i*$j)); // ใช้การจัดตำแหน่ง $sheet->getStyleByColumnAndRow($i - 2, $j)->getAlignment()-> setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); ) )

// ส่วนหัวของเอาต์พุต HTTP ("หมดอายุ: จันทร์, 1 เมษายน 1974 05:00:00 GMT"); header("แก้ไขล่าสุด: " . gmdate("D,d M YH:i:s") . " GMT"); header("การควบคุมแคช: ไม่มีแคช, ต้องตรวจสอบใหม่"); header("Pragma: ไม่มีแคช"); header("ประเภทเนื้อหา: application/vnd.ms-excel"); header("การจัดการเนื้อหา: ไฟล์แนบ; filename=matrix.xls"); // ส่งออกเนื้อหาของไฟล์ $objWriter = new PHPExcel_Writer_Excel5($xls); $objWriter->save("php://output");

ที่นี่ข้อมูลที่สร้างขึ้นจะถูก "แยกออก" ลงในเบราว์เซอร์ทันที อย่างไรก็ตาม หากคุณต้องการบันทึกไฟล์และไม่ "ทิ้ง" ทันที คุณก็ไม่จำเป็นต้องส่งออกไฟล์ ส่วนหัว HTTPและแทนที่จะเป็น “php://output” คุณควรระบุเส้นทางไปยังไฟล์ของคุณ โปรดจำไว้ว่าไดเร็กทอรีที่ควรสร้างไฟล์จะต้องมีสิทธิ์ในการเขียน สิ่งนี้ใช้กับระบบที่คล้ายกับ UNIX


ลองดูคำแนะนำที่เป็นประโยชน์อีกสามข้อเป็นตัวอย่าง:

  • $sheet->getColumnDimension("A")->setWidth(40)– กำหนดความกว้างของคอลัมน์ “A” เป็น 40 หน่วย
  • $sheet->getColumnDimension("B")->setAutoSize(จริง)– ที่นี่คอลัมน์ “B” จะมีความกว้างอัตโนมัติ
  • $sheet->getRowDimension(4)->setRowHeight(20)– กำหนดความสูงของบรรทัดที่สี่เป็น 20 หน่วย

ให้ความสนใจกับวิธีการต่อไปนี้ที่จำเป็นสำหรับการทำงานกับรายงานด้วย:

  • วิธีการแทรกข้อมูลลงในเซลล์:
    • ตั้งค่าเซลล์([$pCoordinate = "A1" [, $pValue = null [, $returnCell = false]]]) รับพารามิเตอร์สามตัว: พิกัดของเซลล์ ข้อมูลที่จะส่งออกไปยังเซลล์ และพารามิเตอร์ตัวที่สามเป็นหนึ่งในบูลีน ประเภทค่าคงที่: จริงหรือ เท็จ(หากผ่านค่า จริงจากนั้นเมธอดจะส่งคืนออบเจ็กต์เซลล์ มิฉะนั้นจะเป็นออบเจ็กต์เวิร์กชีต)
    • ตั้งค่า CellValueByColumnAndRow([$pColumn = 0 [, $pRow = 1 [, $pValue = null [, $returnCell = false]]]]) รับพารามิเตอร์สี่ตัว ได้แก่ หมายเลขคอลัมน์ของเซลล์ หมายเลขแถวของเซลล์ ข้อมูลที่จะส่งออกไปยัง เซลล์ และพารามิเตอร์ที่สี่นั้นถูกต้องเหมือนกับพารามิเตอร์ที่สามของวิธีการ ตั้งค่าเซลล์().
  • วิธีการรับเซลล์:
    • รับเซลล์([$pCoordinate = "A1"]) รับพิกัดของเซลล์เป็นพารามิเตอร์
    • รับ CellByColumnAndRow([$pColumn = 0 [, $pRow = 1]]) รับพารามิเตอร์สองตัวในรูปแบบของคอลัมน์และหมายเลขแถวของเซลล์

ดังที่เราเห็นวิธีการข้างต้นถูกจับคู่กัน ดังนั้นเราจึงสามารถทำงานกับเซลล์โดยใช้สตริงหรือการแสดงพิกัดเป็นตัวเลข ซึ่งแน่นอนว่าเป็นข้อได้เปรียบเพิ่มเติมในการทำงาน

การสร้างรายงานโดยใช้ PHP ใน Excel

บ่อยครั้งมีความจำเป็นต้องเน้นข้อมูลบางอย่างในรายงาน ไฮไลต์แบบอักษรหรือใช้กรอบเติมพื้นหลังกับบางเซลล์ ฯลฯ วิธีนี้ช่วยให้คุณมุ่งความสนใจไปที่ข้อมูลที่สำคัญที่สุดได้ (ถึงแม้จะสามารถเบี่ยงเบนความสนใจของคุณได้ก็ตาม) เพื่อวัตถุประสงค์เหล่านี้ ไลบรารี PHPExcel มีชุดรูปแบบทั้งหมดที่สามารถนำไปใช้กับเซลล์ใน Excel แน่นอนว่ามี "ลบ" เล็กน้อยในไลบรารีนี้ - คุณไม่สามารถใช้สไตล์กับหลาย ๆ เซลล์ในเวลาเดียวกันได้ แต่จะใช้กับแต่ละเซลล์เท่านั้น แต่สิ่งนี้ไม่ได้สร้างความรู้สึกไม่สบายเมื่อพัฒนาเว็บแอปพลิเคชัน


มีสองวิธีในการกำหนดสไตล์ให้กับเซลล์:

  • ใช้วิธีการสมัคร ApplyFromArray, ระดับ PHPExcel_Style.php. ในวิธีการ ApplyFromArrayอาร์เรย์ที่มีพารามิเตอร์ต่อไปนี้จะถูกส่งผ่าน:
    • เติม- อาร์เรย์พร้อมพารามิเตอร์การเติม
    • แบบอักษร- อาร์เรย์พร้อมพารามิเตอร์แบบอักษร
    • เส้นขอบ- อาร์เรย์พร้อมพารามิเตอร์เฟรม
    • การจัดตำแหน่ง- อาร์เรย์พร้อมพารามิเตอร์การจัดตำแหน่ง
    • รูปแบบตัวเลข- อาร์เรย์พร้อมพารามิเตอร์สำหรับรูปแบบการนำเสนอข้อมูลเซลล์
    • การป้องกัน- อาร์เรย์พร้อมพารามิเตอร์การป้องกันเซลล์
  • ใช้วิธีเรียน PHPExcel_Style.phpสำหรับแต่ละสไตล์แยกกัน ตัวอย่างเช่น คุณสามารถกำหนดแบบอักษรให้กับเซลล์ดังนี้: $sheet->getStyle("A1")->getFont()->setName("Arial")

เติม

ค่าพารามิเตอร์ เติมเป็นอาร์เรย์ที่มีพารามิเตอร์เผื่อเลือกดังต่อไปนี้:

  • พิมพ์- ประเภทการเติม;
  • การหมุน- มุมไล่ระดับสี
  • สีเริ่มต้น- ค่าในรูปแบบของอาร์เรย์พร้อมพารามิเตอร์สีเริ่มต้นในรูปแบบ RGB
  • สีท้าย- ค่าในรูปแบบของอาร์เรย์พร้อมพารามิเตอร์สีสุดท้ายในรูปแบบ ARGB
  • สี- ค่าในรูปแบบของอาร์เรย์พร้อมพารามิเตอร์สีเริ่มต้นในรูปแบบ RGB
เติมสไตล์
กรอก_NONE ไม่มี
เติม_SOLID แข็ง
FILL_GRADIENT_LINEAR เชิงเส้น
FILL_GRADIENT_PATH เส้นทาง
FILL_PATTERN_DARKDOWN มืดลง
FILL_PATTERN_DARKGRAY สีเทาเข้ม
FILL_PATTERN_DARKGRID darkGrid
FILL_PATTERN_DARKHORIZONTAL มืดแนวนอน
FILL_PATTERN_DARKTRELLIS ไม้เลื้อยสีเข้ม
FILL_PATTERN_DARKUP ดาร์กอัพ
FILL_PATTERN_DARKVERTICAL แนวตั้งสีเข้ม
FILL_PATTERN_GRAY0625 สีเทา0625
FILL_PATTERN_GRAY125 สีเทา125
FILL_PATTERN_LIGHTDOWN เบาลง
FILL_PATTERN_LIGHTGRAY แสงสีเทา
FILL_PATTERN_LIGHTGRID lightGrid
FILL_PATTERN_LIGHTแนวนอน เบาแนวนอน
FILL_PATTERN_LIGHTTRELLIS lightTrellis
FILL_PATTERN_LIGHTUP เปิดไฟ
FILL_PATTERN_LIGHTVERTICAL เบาแนวตั้ง
FILL_PATTERN_MEDIUMGRAY ปานกลางสีเทา
ตัวอย่างการระบุการตั้งค่าสำหรับการกรอก:
array("type" => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, "rotation" => 0, "startcolor" => array("rgb" => "000000"), "endcolor" => array("argb" => "FFFFFFFF "), "สี" => array("rgb" => "000000"));

หรือคุณสามารถใช้วิธีการต่อไปนี้:

$PHPExcel_Style->getFill()->setFillType(PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR);

$PHPExcel_Style->getFill()->setRotation(0);

$PHPExcel_Style->getFill()->getStartColor()->applyFromArray(array("rgb" => "C2FABD"));

$PHPExcel_Style->getFill()->getEndColor()->applyFromArray(array("argb" => "FFFFFFFF"))

การแทรกรูปภาพ

ค่อนข้างน้อย แต่การแทรกรูปภาพลงในรายงานอาจมีประโยชน์ นี่อาจเป็นโลโก้ ไดอะแกรม ฯลฯ ในการทำงานเราจะต้องมีวิธีการดังต่อไปนี้:

  • กำหนดเส้นทาง([$pValue = "", [$pVerifyFile = จริง]]) เมธอดนี้รับพารามิเตอร์สองตัว พารามิเตอร์แรกระบุเส้นทางไปยังไฟล์รูปภาพ และควรระบุพารามิเตอร์ตัวที่สองหากจำเป็นต้องตรวจสอบการมีอยู่ของไฟล์ (สามารถใช้ค่าใดค่าหนึ่งได้ จริงหรือ เท็จ).
  • กำหนดพิกัด([$pValue = "A1"])) принимает на вход один параметр в виде строки с координатой ячейки.!}
  • setOffsetX([$pValue = 0]) รับหนึ่งพารามิเตอร์ที่มีค่าออฟเซ็ต X จากขอบด้านซ้ายของเซลล์
  • ตั้งค่าออฟเซ็ตY([$pValue = 0]) รับหนึ่งพารามิเตอร์ที่มีค่าออฟเซ็ต Y จากขอบด้านบนของเซลล์
  • ชุดแผ่นงาน([$pValue = โมฆะ, [$pOverrideเก่า = เท็จ]]) เมธอดนี้รับพารามิเตอร์สองตัวเป็นอินพุต อันแรกเป็นข้อบังคับ อันที่สองไม่ใช่ พารามิเตอร์แรกคืออินสแตนซ์ของวัตถุแผ่นงานที่ใช้งานอยู่ หากคุณส่งผ่านเป็นค่าของพารามิเตอร์ตัวที่สอง จริงจากนั้นหากกำหนดแผ่นงานไว้ก่อนหน้านี้ แผ่นงานนั้นจะถูกเขียนทับ และรูปภาพจะถูกลบตามไปด้วย

รหัสที่สาธิตอัลกอริทึมสำหรับการแทรกรูปภาพได้รับด้านล่าง:


... $sheet->getColumnDimension("B")->setWidth(40); $imagePath = dirname(__FILE__) . "/excel.png"; if (file_exists($imagePath)) ( $logo = new PHPExcel_Worksheet_ Drawing(); $logo->setPath($imagePath); $logo->setCoordinates("B2"); $logo->setOffsetX(0); $logo- >setOffsetY(0); $sheet->getRowDimension(2)->setRowHeight(190); $logo->setWorksheet($sheet); ) ...

นี่คือลักษณะของรายงานที่มีการแทรกรูปภาพ:


แบบอักษร

แบบอักษรอาร์เรย์ถูกระบุซึ่งมีพารามิเตอร์ทางเลือกต่อไปนี้:

  • ชื่อ- ชื่อแบบอักษร;
  • ขนาด- ขนาดตัวอักษร;
  • ตัวหนา- เน้นด้วยตัวหนา;
  • ตัวเอียง- ใส่เป็นตัวเอียง;
  • ขีดเส้นใต้- สไตล์การขีดเส้นใต้;
  • โจมตี- ข้ามออก;
  • ซุปเปอร์สคริปต์- ตัวยก;
  • สคริปต์ย่อย- ตัวห้อย;
  • สี
ขีดเส้นใต้สไตล์
ขีดล่าง_NONE เลขที่
อันเดอร์ไลน์_ดับเบิ้ล ขีดเส้นใต้คู่
ใต้บรรทัด_SINGLE ขีดเส้นใต้เดียว
ตัวอย่างการระบุพารามิเตอร์การตั้งค่าสำหรับแบบอักษร:
array("name" => "Arial", "size" => 12, "bold" => true, "italic" => false, "underline" => PHPExcel_Style_Font::UNDERLINE_DOUBLE, "strike" => false, " superScript" => false, "subScript" => false, "color" => array("rgb" => "808080"));

หรือใช้วิธีการดังต่อไปนี้:

$PHPExcel_Style->getFont()->setName('Arial');

$PHPExcel_Style->getFont()->setBold(จริง);

$PHPExcel_Style->getFont()->setItalic(เท็จ);

$PHPExcel_Style->getFont()->setSuperScript(เท็จ);

$PHPExcel_Style->getFont()->setSubScript(เท็จ);

$PHPExcel_Style->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE);

$PHPExcel_Style->getFont()->setStrikethrough(เท็จ);

$PHPExcel_Style->getFont()->getColor()->applyFromArray(array("rgb" => "808080"));

$PHPExcel_Style->getFont()->setSize(12)

กรอบ

เป็นค่าพารามิเตอร์ เส้นขอบอาร์เรย์ถูกระบุซึ่งมีพารามิเตอร์ทางเลือกต่อไปนี้:

  • ประเภทเฟรม- (บน|บูทอม|ซ้าย|ขวา|แนวทแยง|ทิศทางแนวทแยง);
  • สไตล์- สไตล์เฟรม;
  • สี- ค่าในรูปแบบของอาร์เรย์พร้อมพารามิเตอร์สีในรูปแบบ RGB
สไตล์เส้นตัวอย่างการระบุพารามิเตอร์การตั้งค่าสำหรับเฟรม:
array("bottom" => array("style" => PHPExcel_Style_Border::BORDER_DASHDOT, "color" => array(" rgb" => "808080")), "top" => array("style" => PHPExcel_Style_Border ::BORDER_DASHDOT, "color" => array("rgb" => "808080")));

คุณยังสามารถใช้วิธีการต่อไปนี้:

$PHPExcel_Style->getBorders()->getLeft()->applyFromArray(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));

$PHPExcel_Style->getBorders()->getRight()->applyFromArray(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));

$PHPExcel_Style->getBorders()->getTop()->applyFromArray(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));

$PHPExcel_Style->getBorders()->getBottom()->applyFromArray(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));

$PHPExcel_Style->getBorders()->getDiagonal()->applyFromArray(array('style' => PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')));

$PHPExcel_Style->getBorders()->setDiagonalDirection(array('style' =>PHPExcel_Style_Border::BORDER_DASHDOT,'color' => array('rgb' => '808080')))

การจัดตำแหน่ง

ค่าพารามิเตอร์ การจัดตำแหน่งเป็นอาร์เรย์ที่รับพารามิเตอร์ทางเลือกสี่ตัวเป็นอินพุต:

  • แนวนอน- ค่าคงที่การจัดตำแหน่งแนวนอน
  • แนวตั้ง- ค่าคงที่การจัดตำแหน่งแนวตั้ง
  • การหมุน- มุมการหมุนข้อความ
  • ห่อ- อนุญาตให้มีการตัดข้อความ
  • ShrinkToFit- จะเปลี่ยนขนาดตัวอักษรเมื่อข้อความเกินพื้นที่เซลล์หรือไม่
  • เยื้อง- รอยเยื้องจากขอบด้านซ้าย
การจัดตำแหน่งแนวนอนการจัดตำแหน่งตามแนวตั้ง
VERTICAL_BOTTOM ตามขอบด้านล่าง
แนวตั้ง_TOP ตามขอบด้านบน
แนวตั้ง_CENTER อยู่ตรงกลาง
แนวตั้ง_จัดชิดขอบ ในความสูง
ตัวอย่างการตั้งค่ารูปแบบการวางแนว: array("horizontal" => PHPExcel_Style_Alignment::HORIZONTAL_CENTER, "vertical" => PHPExcel_Style_Alignment::VERTICAL_CENTER, "rotation" => 0, "wrap" => true, "shrinkToFit" => false, "indent" => 5)

$PHPExcel_Style->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

$PHPExcel_Style->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_JUSTIFY);

$PHPExcel_Style->getAlignment()->setTextRotation(10);

$PHPExcel_Style->getAlignment()->setWrapText(จริง);

$PHPExcel_Style->getAlignment()->setShrinkToFit(เท็จ);

$PHPExcel_Style->getAlignment()->setIndent(5)

รูปแบบการนำเสนอข้อมูล

พารามิเตอร์ รูปแบบตัวเลขเป็นอาร์เรย์ที่มีพารามิเตอร์เพียงตัวเดียวเท่านั้น: รหัส- รูปแบบข้อมูลเซลล์


รายการรูปแบบที่เป็นไปได้
FORMAT_GENERAL ทั่วไป
FORMAT_TEXT @
FORMAT_NUMBER 0
FORMAT_NUMBER_00 0.00
FORMAT_NUMBER_COMMA_SEPARATED1 #,##0.00
FORMAT_NUMBER_COMMA_SEPARATED2 #,##0.00_-
FORMAT_PERCENTAGE 0%
FORMAT_PERCENTAGE_00 0.00%
FORMAT_DATE_YYYYMMDD2 ปปปป-mm-dd
FORMAT_DATE_YYYYMMDD ปปป-ดด-วว
FORMAT_DATE_DDMMYYYY วว/ดด/ปปป
FORMAT_DATE_DMYSLASH วัน/เดือน/ปี
FORMAT_DATE_DMYMINUS d-m-y
FORMAT_DATE_DMMINUS ดี-ม
FORMAT_DATE_MYMINUS ของฉัน
FORMAT_DATE_XLSX14 ดด-วว-ปปปป
FORMAT_DATE_XLSX15 ด-อืม-ปปป
FORMAT_DATE_XLSX16 ด-อืม
FORMAT_DATE_XLSX17 อืม-ปปป
FORMAT_DATE_XLSX22 ม/วัน/ปปป ช:มม
FORMAT_DATE_DATETIME ว/ด/ป ชม:มม
FORMAT_DATE_TIME1 ชม.:น. AM/PM
FORMAT_DATE_TIME2 ชม.:นาที:ss AM/PM
FORMAT_DATE_TIME3 อืม
FORMAT_DATE_TIME4 ชม:นาที:สส
FORMAT_DATE_TIME5 มม.:เอส
FORMAT_DATE_TIME6 ชม:นาที:สส
FORMAT_DATE_TIME7 ฉัน:s.S
FORMAT_DATE_TIME8 ชม:นาที:สส
FORMAT_DATE_YYYYMMDDSLASH ปปป/ดด/วว; @
FORMAT_CURRENCY_USD_SIMPLE "$"#,##0.00_-;@
FORMAT_CURRENCY_USD $#,##0_-
FORMAT_CURRENCY_EUR_SIMPLE [$ยูโร ]#,##0.00_-
ตัวอย่างการตั้งค่าสำหรับรูปแบบข้อมูลเซลล์: array("code" => PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE);

หรือคุณสามารถใช้วิธีการ:

$PHPExcel_Style->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE);

การป้องกันเซลล์

เป็นค่าพารามิเตอร์ การป้องกันทำหน้าที่เป็นอาร์เรย์ที่มีพารามิเตอร์ทางเลือกสองตัว:

  • ล็อค- ปกป้องเซลล์
  • ที่ซ่อนอยู่- ซ่อนสูตร
ตัวอย่างการตั้งค่าพารามิเตอร์สำหรับการป้องกันเซลล์:
array("locked" => true, "hidden" => false);

หรือใช้วิธีการดังต่อไปนี้:


$PHPExcel_Style->getProtection()->setLocked(จริง);

$PHPExcel_Style->getProtection()->setHidden(เท็จ);

ตอนนี้เรารู้แล้วว่าการตั้งค่าสไตล์มีอะไรบ้าง และแต่ละสไตล์มีพารามิเตอร์อะไรบ้าง ตอนนี้เราจะใช้สไตล์การออกแบบกับเซลล์ตาราง แต่เราจะทำสิ่งนี้โดยใช้สองวิธี วิธีแรกคือการสร้างอาร์เรย์ของการตั้งค่า ซึ่งเราจะส่งผ่านเป็นพารามิเตอร์ไปยังวิธีการนั้น ApplyFromArray, ระดับ PHPExcel_Style.php.


$style = array("font" => array("name" => "Arial"),), "fill" => array("type" => PHPExcel_Style_Fill::FILL_SOLID, "color" => array ("rgb" => "C2FABD")), "การจัดตำแหน่ง" => อาร์เรย์ ("แนวนอน" => PHPExcel_Style_Alignment::HORIZONTAL_CENTER));
ต่อไป เราจะนำสไตล์ที่เราสร้างขึ้นไปใช้กับเซลล์ Excel

$sheet->getStyleByColumnAndRow($i - 2, $j)->applyFromArray($style);

ทีนี้ลองใช้สไตล์เดียวกัน แต่ใช้เทคนิคอื่น


//ตั้งค่าการจัดตำแหน่ง $sheet->getStyleByColumnAndRow($i - 2, $j)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // ตั้งค่าแบบอักษร $sheet->getStyleByColumnAndRow($i - 2, $j)->getFont()->setName("Arial"); // ใช้การเติม $sheet->getStyleByColumnAndRow($i - 2, $j)->getFill()-> setFillType(PHPExcel_Style_Fill::FILL_SOLID); $sheet->getStyleByColumnAndRow($i - 2, $j)->getFill()-> getStartColor()->applyFromArray(array("rgb" => "C2FABD"));

นี่คือสิ่งที่เราได้รับ:



หากคุณต้องการใช้สไตล์หลายครั้ง วิธีแรกจะดีกว่า มิฉะนั้น ควรใช้วิธีที่สองจะดีกว่า เพื่อรับวัตถุ (คลาส instance PHPExcel_Style.php) เซลล์ที่รับผิดชอบสไตล์ คุณต้องใช้วิธีใดวิธีหนึ่งต่อไปนี้:

  • getStyleByColumnAndRow([$pColumn = 0 [, $pRow = 1]]) – ใช้หากคุณต้องการอ้างอิงเซลล์ด้วยพิกัดตัวเลข วิธีการจะต้องส่งผ่านพารามิเตอร์สองตัวในรูปแบบของคอลัมน์และหมายเลขแถวของเซลล์
  • getStyle() - ใช้เพื่อเข้าถึงพิกัดสตริงของเซลล์ วิธีการนี้ต้องส่งผ่านพารามิเตอร์ตัวเดียว ซึ่งเป็นการแสดงสตริงของพิกัด

การเพิ่มความคิดเห็น

ฉันคิดว่าไม่บ่อยนักที่บางคนจะใช้โอกาสในการเพิ่มความคิดเห็นลงในเซลล์ แต่นี่เป็นความเห็นส่วนตัวของฉันล้วนๆ แต่มีโอกาสเช่นนี้อยู่ การเพิ่มความคิดเห็นลงในเซลล์นั้นค่อนข้างง่าย ดังที่คุณเห็นในตัวอย่างด้านล่าง:


... // รูปแบบตัวอักษร $fBold = array("name" => "Tahoma", "size" => 10, "bold" => true); $fNormal = array("name" => "Tahoma", "size" => 10); $richText = $sheet->getComment("B2")->getText(); $richText->createTextRun("Lorem ipsum")->getFont()-> ApplyFromArray($fNormal); $richText->createTextRun("นั่งเฉยๆ")->getFont()->applyFromArray($fBold); $richText->createTextRun(" amet consectetuer")->getFont()-> ApplyFromArray($fNormal); // ความกว้างของช่องแสดงความคิดเห็น $sheet->getComment("B2")->setWidth("250"); // ความสูงของช่องแสดงความคิดเห็น $sheet->getComment("B2")->setHeight("25"); ...

ควรสังเกตว่าเมื่อเรียกใช้วิธีการอีกครั้ง createTextRun()ความคิดเห็นใหม่จะถูกเพิ่มลงในความคิดเห็นที่มีอยู่ แทนที่จะแทนที่ ควรสังเกตว่าวิธีนี้ส่งคืนออบเจ็กต์ของคลาส PHPExcel_RichText_Run ซึ่งมีวิธีการตั้งค่าและรับพารามิเตอร์แบบอักษร:

  • รับแบบอักษร() – ส่งคืนวัตถุคลาสสำหรับการทำงานกับแบบอักษร PHPExcel_Style_Font
  • setFont([$pแบบอักษร = โมฆะ]))]) – วิธีการนี้ต้องส่งวัตถุของคลาส PHPExcel_Style_Font เป็นพารามิเตอร์

นั่นคือความคิดเห็นที่เราควรจะได้รับ

สำหรับหลาย ๆ คนเมื่อต้องทำงานด้วย PHP ร่วมกับ MySQLมีความจำเป็นเช่นการส่งออกข้อมูลจากฐานข้อมูลเป็นรูปแบบ xls เพื่อให้ผู้ที่ต้องการข้อมูลนี้ประมวลผลใน Excel หรือสะดวกสำหรับผู้ใช้ในการดูข้อมูลนี้ เมื่อเร็วๆ นี้ ข้าพเจ้ามีความต้องการเช่นนี้ และวันนี้ข้าพเจ้าจะเล่าให้ฟังว่าเรื่องนี้จะปฏิบัติได้อย่างไร

ฉันจะบอกทันทีว่าวิธีนี้ค่อนข้างง่าย แต่ข้อมูลจะถูกอัปโหลดตามปกติ

ขั้นแรก ฉันจะยกตัวอย่างไฟล์ xls สุดท้าย ใน Excel การอัปโหลดจะมีลักษณะดังนี้:

กล่าวอีกนัยหนึ่ง จะไม่มีการอัปโหลดรูปภาพหรือสไตล์ มีเพียงส่วนหัวของคอลัมน์และข้อมูลเท่านั้น

ก่อนที่ฉันจะมาถึงตัวเลือกในการอัปโหลดนี้ฉันพยายามอัปโหลดในรูปแบบ CSV แต่มันดูงุ่มง่ามเล็กน้อยจากนั้นฉันก็พยายามวาดตารางและบันทึกด้วยส่วนขยาย xls มันก็กลายเป็นเรื่องไร้สาระเช่นกัน วิธีที่ฉันจะอธิบายตอนนี้เหมาะกับฉันอย่างยิ่ง และตอนนี้ฉันจะแบ่งปันกับคุณ

ขั้นแรกฉันจะให้โค้ดทั้งหมดที่ฉันแสดงความคิดเห็นให้มากที่สุดเท่าที่จะเป็นไปได้ คุณสามารถเลือกและบันทึกด้วยส่วนขยาย php แล้วลอง เพียงอย่าลืมระบุการตั้งค่าสำหรับการเชื่อมต่อกับฐานข้อมูล

ส่งออกข้อมูลจาก MySQL ไปยัง Excel ใน PHP

และเพื่อให้คุณเข้าใจว่าฉันกำลังอัพโหลดข้อมูลใด ฉันจะยกตัวอย่างตารางง่ายๆ ในฐานข้อมูล ( ฉันมีการทดสอบชื่อของมัน):

ตารางทดสอบ:

รหัส ชื่อจริง ชื่อ
1 อีวานอฟ อีวาน
2 เปตรอฟ ปีเตอร์
2 เปตรอฟ2 ปีเตอร์2
xlsData = pack("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); return; ) //หากฟังก์ชันข้อความ RecText($row, $col, $value)( $len = strlen($value); $this->xlsData .= pack (" s*", 0x0204, 8 + $len, $row, $col, 0x00, $len); $this->xlsData .= $value; return; ) // ใส่ฟังก์ชันตัวเลข InsertNumber($value)( ถ้า ($ นี้->countCol == $this->totalCol) ( $this->countCol = 0; $this->countRow++; ) $this->RecNumber($this->countRow, $this->countCol, $ value); $this->countCol++; return; ) // ใส่ฟังก์ชันข้อความ InsertText($value)( if ($this->countCol == $this->totalCol) ( $this->countCol = 0; $this- >countRow++; ) $this->RecText($this->countRow, $this->countCol, $value); $this->countCol++; return; ) // ไปที่ฟังก์ชันบรรทัดใหม่ GoNewLine())( $this ->countCol = 0 ; $this->countRow++; return; ) //สิ้นสุดฟังก์ชันข้อมูล EndData())( $this->xlsData .= pack("ss", 0x0A, 0x00); กลับ; ) // บันทึกฟังก์ชันไฟล์ SaveFile($fileName)( $this->fileName = $fileName; $this->SendFile(); ) // ส่งฟังก์ชันไฟล์ SendFile())( $this->EndData(); header (" Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); header ("Cache-Control: no-store, no-cache, must-revalidate"); ส่วนหัว (" Pragma: no-cache"); ส่วนหัว ("ประเภทเนื้อหา: application/x-msexcel"); ส่วนหัว ("การจัดการเนื้อหา: สิ่งที่แนบมา; fileName=$this->fileName.xls"); พิมพ์ $this ->xlsData ; ) ) ) if(isset($_GET["id"])) ( //กรองข้อมูล $id = mysql_real_escape_string(stripslashes(trim(htmlspecialchars($_GET["id"],ENT_QUOTES)))) ; $filename = "File_with_id_".$id; // ตั้งชื่อไฟล์ $excel = new ExportToExcel(); // สร้างอินสแตนซ์ของคลาส $sql="SELECT * FROM test.test โดยที่ id = $id"; //สอบถามไปยังฐานข้อมูล $rez= mysql_query($sql); $excel->InsertText("Identifier"); $excel->InsertText("Last Name"); $excel->InsertText("Name"); $ excel->GoNewLine(); While($ row=mysql_fetch_assoc($rez))( $excel->InsertNumber($row["id"]); $excel->InsertText($row["ชื่อ"]); $excel->InsertText($row["ชื่อ"]); $excel->GoNewLine(); ) $excel->SaveFile($ชื่อไฟล์); ) ?>

แนวคิดทั้งหมดที่นี่คือฟังก์ชัน หีบห่อ()ซึ่งแพ็คข้อมูลลงในสตริงไบนารี และในทางกลับกัน เราก็เติมสตริงนี้ด้วยข้อมูลที่เราดาวน์โหลดจากฐานข้อมูลตามลำดับ MySqlโดยใช้ฟังก์ชันปกติ mysql_query().

เพื่อตรวจสอบการทำงานของโค้ดนี้ โดยคำนึงถึงข้อเท็จจริงที่ว่าคุณได้กำหนดค่าการเชื่อมต่อกับฐานข้อมูลและสร้างตารางที่คล้ายกัน คุณสามารถส่งคำขอต่อไปนี้:

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

และคุณควรยกเลิกการโหลดสองบรรทัดโดยมี id เท่ากับ 2

และตอนนี้ใครก็ตามที่คุณอนุญาตให้อัปโหลดข้อมูลสามารถส่งออกข้อมูลไปยังคอมพิวเตอร์ของตนผ่านทางเว็บอินเทอร์เฟซได้อย่างง่ายดาย วิธีนี้สะดวกทั้งสำหรับผู้ใช้ในองค์กร หากคุณกำลังพัฒนาแอปพลิเคชันสำหรับองค์กรของคุณและสำหรับผู้ใช้เว็บไซต์ของคุณบนอินเทอร์เน็ต ฉันหวังว่าวิธีนี้จะช่วยคุณได้ ขอให้โชคดี!

.
วิธีการที่นำเสนอในบันทึกนั้นง่ายมาก แต่ก็อาจไม่สะดวกเสมอไป
มีวิธีอื่นอีกมากมายในการถ่ายโอนข้อมูลแบบตารางจาก PHP ไปยัง Excel ฉันจะอธิบายวิธีที่ดูเหมือนง่ายและใช้งานได้ดีที่สุดสำหรับฉัน ควรสังเกตเป็นพิเศษว่าฉันไม่ได้พูดถึงการสร้างไฟล์ xls แต่เพียงแนะนำให้ผู้ใช้เปิดข้อมูลที่ได้รับโดยใช้ Excel เพื่อให้ผู้ใช้ที่ไม่มีประสบการณ์ในการเขียนโปรแกรมจะไม่สังเกตเห็นการปลอมแปลง

ดังนั้น สิ่งแรกที่คุณต้องทำคือวางลิงก์ไปยังสคริปต์ที่สร้างส่วนหัวต่อไปนี้บนหน้าเว็บของเรา:
header("Pragma: สาธารณะ");
ส่วนหัว ("หมดอายุ: 0");
header("การควบคุมแคช: ต้องตรวจสอบใหม่, หลังตรวจสอบ = 0, ตรวจสอบล่วงหน้า = 0");
header("การควบคุมแคช: ส่วนตัว", false);
header("ประเภทเนื้อหา: application/x-msexcel");
header("การจัดการเนื้อหา: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
ส่วนหัว ("การเข้ารหัสเนื้อหาการถ่ายโอน: ไบนารี");
header("ความยาวเนื้อหา: " . $object->getFileSize());

$object เป็นวัตถุทรงกลมในสุญญากาศ ซึ่งผู้อ่านแต่ละคนสามารถนำไปใช้ได้ตามต้องการ วัตถุประสงค์ของ getters getFileName() และ getFileSize() นั้นชัดเจนจากชื่อของพวกเขา คุ้มค่าที่จะเน้นความแตกต่างที่ไม่ชัดเจนที่นี่ (ขอบคุณที่เตือนฉันเกี่ยวกับสิ่งนี้) - getFileName() สามารถส่งคืนชื่อไฟล์ใด ๆ ได้ แต่ถ้าคุณต้องการให้เบราว์เซอร์เสนอให้เปิดเนื้อหาที่ได้รับใน Excel นามสกุลไฟล์ควร เป็น xls
ฉันยังไม่ได้พูดอะไรใหม่เลย แต่ทั้งหมดนี้ถูกประดิษฐ์ขึ้นต่อหน้าฉันเช่นเดียวกับที่จะอธิบายด้านล่าง
ตามที่ระบุไว้อย่างถูกต้องในความคิดเห็นของบทความ Excel ทำงานกับ XML ได้เร็วขึ้นมาก แต่ข้อได้เปรียบที่สำคัญที่สุดอาจไม่ใช่ความเร็ว แต่เป็นความสามารถที่กว้างกว่ามาก ฉันจะไม่เจาะลึกลงไปในวัชพืช แต่จะยกตัวอย่างง่ายๆ และลิงก์ไปยังคำอธิบายโดยละเอียดของแท็กทั้งหมด

ดังนั้นหลังจากสร้างส่วนหัวแล้ว เราจำเป็นต้องให้ข้อมูลจริงแก่ผู้ใช้ ฉันมักจะสรุปการสร้างตารางด้วยวิธีแยกต่างหาก:
เสียงสะท้อน $object->getContent();

และฉันสร้างตารางโดยใช้ Smarty:

( foreach จาก=$data.header item=caption) ($คำบรรยายชื่อคอลัมน์)(/แต่ละ)( foreach จาก=$data.content item=row) ( foreach จาก=$แถวรายการ=col) ($โคล)(/แต่ละ)(/แต่ละ)

ดังที่คุณเห็นจากโค้ด อาร์เรย์ $data จะถูกส่งผ่านไปยังเทมเพลต ซึ่งมีอาร์เรย์สองตัว ได้แก่ บรรทัดหัวเรื่องของตารางและข้อมูลเอง
เป็นที่น่าสังเกตว่าการใช้เอ็นจิ้นเทมเพลตเพื่อสร้าง XML เท่านั้นนั้นค่อนข้างแพง และสามารถรับ XML ได้ด้วยวิธีอื่น ๆ มากมาย ในกรณีเฉพาะของฉัน การสร้าง XML เป็นเพียงโบนัสเล็กๆ น้อยๆ ในโปรเจ็กต์ขนาดใหญ่ที่เครื่องมือเทมเพลตเป็นสิ่งที่ขาดไม่ได้

ตัวอย่างเช่น ฉันให้ตารางง่ายๆ หากต้องการ คุณสามารถจัดการแอตทริบิวต์จำนวนมากขึ้นได้ นี่เป็นสิ่งที่ดีอย่างยิ่งเมื่อพิจารณาว่าไม่จำเป็นต้องมีไลบรารีของบุคคลที่สามในการดำเนินการ
วิธีการที่อธิบายไว้นี้ทำงานในโปรเจ็กต์เดียวมาหลายปีแล้วและไม่มีผู้ใช้รายเดียวที่สงสัยว่าข้อมูลที่เขาเปิดไม่ใช่เอกสาร MS Office

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับโครงสร้าง XML ที่ใช้ใน MS Excel ได้

.
วิธีการที่นำเสนอในบันทึกนั้นง่ายมาก แต่ก็อาจไม่สะดวกเสมอไป
มีวิธีอื่นอีกมากมายในการถ่ายโอนข้อมูลแบบตารางจาก PHP ไปยัง Excel ฉันจะอธิบายวิธีที่ดูเหมือนง่ายและใช้งานได้ดีที่สุดสำหรับฉัน ควรสังเกตเป็นพิเศษว่าฉันไม่ได้พูดถึงการสร้างไฟล์ xls แต่เพียงแนะนำให้ผู้ใช้เปิดข้อมูลที่ได้รับโดยใช้ Excel เพื่อให้ผู้ใช้ที่ไม่มีประสบการณ์ในการเขียนโปรแกรมจะไม่สังเกตเห็นการปลอมแปลง

ดังนั้น สิ่งแรกที่คุณต้องทำคือวางลิงก์ไปยังสคริปต์ที่สร้างส่วนหัวต่อไปนี้บนหน้าเว็บของเรา:
header("Pragma: สาธารณะ");
ส่วนหัว ("หมดอายุ: 0");
header("การควบคุมแคช: ต้องตรวจสอบใหม่, หลังตรวจสอบ = 0, ตรวจสอบล่วงหน้า = 0");
header("การควบคุมแคช: ส่วนตัว", false);
header("ประเภทเนื้อหา: application/x-msexcel");
header("การจัดการเนื้อหา: attachment; filename=\"" . iconv("UTF-8", "CP1251", $object->getFileName()) . "\";");
ส่วนหัว ("การเข้ารหัสเนื้อหาการถ่ายโอน: ไบนารี");
header("ความยาวเนื้อหา: " . $object->getFileSize());

$object เป็นวัตถุทรงกลมในสุญญากาศ ซึ่งผู้อ่านแต่ละคนสามารถนำไปใช้ได้ตามต้องการ วัตถุประสงค์ของ getters getFileName() และ getFileSize() นั้นชัดเจนจากชื่อของพวกเขา คุ้มค่าที่จะเน้นความแตกต่างที่ไม่ชัดเจนที่นี่ (ขอบคุณ savostin ที่เตือนฉันเกี่ยวกับสิ่งนี้) - getFileName() สามารถส่งคืนชื่อไฟล์ใด ๆ ได้แน่นอน แต่ถ้าคุณต้องการให้เบราว์เซอร์เสนอให้เปิดเนื้อหาที่ได้รับใน Excel ไฟล์นั้น นามสกุลควรเป็น xls
ฉันยังไม่ได้พูดอะไรใหม่เลย แต่ทั้งหมดนี้ถูกประดิษฐ์ขึ้นต่อหน้าฉันเช่นเดียวกับที่จะอธิบายด้านล่าง
ตามที่ระบุไว้อย่างถูกต้องในความคิดเห็นในโพสต์เกี่ยวกับการสร้าง xls ใน PHP นั้น Excel ทำงานกับ XML ได้เร็วขึ้นมาก แต่ข้อได้เปรียบที่สำคัญที่สุดอาจไม่ใช่ความเร็ว แต่เป็นความสามารถที่กว้างกว่ามาก ฉันจะไม่เจาะลึกลงไปในวัชพืช แต่จะยกตัวอย่างง่ายๆ และลิงก์ไปยังคำอธิบายโดยละเอียดของแท็กทั้งหมด

ดังนั้นหลังจากสร้างส่วนหัวแล้ว เราจำเป็นต้องให้ข้อมูลจริงแก่ผู้ใช้ ฉันมักจะสรุปการสร้างตารางด้วยวิธีแยกต่างหาก:
เสียงสะท้อน $object->getContent();

และฉันสร้างตารางโดยใช้ Smarty:

( foreach จาก=$data.header item=caption) ($คำบรรยายชื่อคอลัมน์)(/แต่ละ)( foreach จาก=$data.content item=row) ( foreach จาก=$แถวรายการ=col) ($โคล)(/แต่ละ)(/แต่ละ)

ดังที่คุณเห็นจากโค้ด อาร์เรย์ $data จะถูกส่งผ่านไปยังเทมเพลต ซึ่งมีอาร์เรย์สองตัว ได้แก่ บรรทัดหัวเรื่องของตารางและข้อมูลเอง
เป็นที่น่าสังเกตว่าการใช้เอ็นจิ้นเทมเพลตเพื่อสร้าง XML เท่านั้นนั้นค่อนข้างแพง และสามารถรับ XML ได้ด้วยวิธีอื่น ๆ มากมาย ในกรณีเฉพาะของฉัน การสร้าง XML เป็นเพียงโบนัสเล็กๆ น้อยๆ ในโปรเจ็กต์ขนาดใหญ่ที่เครื่องมือเทมเพลตเป็นสิ่งที่ขาดไม่ได้

ตัวอย่างเช่น ฉันให้ตารางง่ายๆ หากต้องการ คุณสามารถจัดการแอตทริบิวต์จำนวนมากขึ้นได้ นี่เป็นสิ่งที่ดีอย่างยิ่งเมื่อพิจารณาว่าไม่จำเป็นต้องมีไลบรารีของบุคคลที่สามในการดำเนินการ
วิธีการที่อธิบายไว้นี้ทำงานในโปรเจ็กต์เดียวมาหลายปีแล้วและไม่มีผู้ใช้รายเดียวที่สงสัยว่าข้อมูลที่เขาเปิดไม่ใช่เอกสาร MS Office

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับโครงสร้าง XML ที่ใช้ใน MS Excel ได้



มีคำถามหรือไม่?

แจ้งการพิมพ์ผิด

ข้อความที่จะส่งถึงบรรณาธิการของเรา: