Heim >PHP-Framework >Denken Sie an PHP >Bringen Sie Ihnen Schritt für Schritt bei, wie Sie ThinkPHP+phpExcel zum Importieren und Exportieren von Excel-Daten verwenden (Übung)
Wie importiere ich eine Excel-Tabelle mit Bildern in PHP? Wie exportiere ich Bilder nach Excel? Wie definiere ich Stile für exportiertes Excel, um es schöner zu machen? Der folgende Artikel wird Ihnen helfen, das Problem einzeln zu lösen. Ich hoffe, er wird Ihnen hilfreich sein!
Excel ist ein häufig verwendetes Tool zur Datenerfassung und Statistik. Um papierlos zu arbeiten oder in die Cloud zu wechseln, müssen Bürodaten normalerweise vom Bürocomputer auf die Plattform migriert werden. Oder das Herunterladen der Daten auf die Plattform zur Nutzung durch Nicht-Entwickler erfordert zwangsläufig den Import und Export von Daten, und das Datenformat muss Excel sein.
In diesem Artikel werden die tatsächlichen Entwicklungsanforderungen zusammengefasst und der Import und Export von Excel während des Entwicklungsprozesses zusammengefasst. Das beteiligte Entwicklungsframework:
Bei der Bereitstellung ist es für Daten mit vielen Bildern in Excel erforderlich, das Timeout oder die Laufzeit zu verlängern und die Upload-Größenbeschränkung zu erhöhen
Code-Warehouse: https://github.com/QuintionTang/crayon-thinkphp
Datenimport: Bevor Sie beginnen, müssen Sie das Format der importierten Daten definieren und das vorgeschriebene Formatprogramm strikt befolgen, um die Daten korrekt zu analysieren. Der übliche Datenimport besteht nur aus einfachen Textdaten. In diesem Artikel werden Daten mit Bildern in Excel importiert, um den Importbedarf so weit wie möglich abzudecken.
Die Vorlage ist die Grundlage für den Datenimport. Nachfolgend wird eine einfache Datenvorlage mit folgendem Format definiert:
Bei Text und Bildern besteht die erste Wahl zum Importieren von Daten darin, eine Excel-Datei zu lesen. Daher muss auch die Datei hochgeladen werden. Nachdem die Datei erfolgreich hochgeladen wurde, erkennen Sie zunächst die Bildspalte und sehen Sie sich den Code direkt an:
public function excel_import(){ $usedfor = empty($_GET['usedfor']) ? 'picture' : trim($_GET['usedfor']); $used_for = $usedfor; import('ORG.Net.UploadFile'); $upload = $this->_upload_init(new \Org\Net\UploadFile(),$usedfor);// 实例化上传类 $attach = array(); $attachment = array(); $attach["success"] = 0; $info = ""; if(!$upload->upload()) { // 上传错误提示错误信息 $upload_error = $upload->getErrorMsg(); $attach["msg"] = $upload_error; }else{ // 上传成功 获取上传文件信息 $info = $upload->getUploadFileInfo(); } // 上传成功后开始处理 if(is_array($info)){ $info = $info[0]; // PHPExcel 类引入 import("Org.Util.PHPExcel"); import("Org.Util.PHPExcel.Reader.Excel5"); import("Org.Util.PHPExcel.Reader.Excel2007"); import("Org.Util.PHPExcel.IOFactory.php"); $filePath = $info["savepath"] . $info["savename"]; $input_file_type = \PHPExcel_IOFactory::identify($filePath); // 开始读取Excel数据 $objExcel = new \PHPExcel(); $objReader = \PHPExcel_IOFactory::createReader($input_file_type); // 加载Excel文件 $objPHPExcel = $objReader->load($filePath); $objWorksheet = $objPHPExcel->getActiveSheet(); $data = $objWorksheet->toArray(); $attach_path = C('attach_path'); $subpath = date('YmdHm', time()); // Excel图片存储路径 $imageFileRealPath = $attach_path . "excel_img/".$subpath ."/" ; mkdirs($imageFileRealPath); $i = 0; $rebarRows = array(); // 下面开始处理图片 foreach ($objWorksheet->getDrawingCollection() as $img) { list($startColumn, $startRow) = \PHPExcel_Cell::coordinateFromString($img->getCoordinates()); //获取图片所在行和列 $imageFileName = uniqid(); try { switch($img->getExtension()) { case 'jpg': case 'jpeg': $imageFileName .= '.jpeg'; $source = imagecreatefromjpeg($img->getPath()); imagejpeg($source, $imageFileRealPath.$imageFileName,100); break; case 'gif': $imageFileName .= '.gif'; $source = imagecreatefromgif($img->getPath()); $width = imagesx($source); $height = imagesy($source); if (function_exists("imagecreatetruecolor")) { $newImg = imagecreatetruecolor($width, $height); /* --- 用以处理缩放png图透明背景变黑色问题开始 --- */ $color = imagecolorallocate($newImg,255,255,255); imagecolortransparent($newImg,$color); imagefill($newImg,0,0,$color); ImageCopyResampled($newImg, $source, 0, 0, 0, 0, $width, $height, $width, $height); } else { $newImg = imagecreate($width, $height); ImageCopyResized($newImg, $source, 0, 0, 0, 0, $width, $height, $width, $height); } imagejpeg($source, $imageFileRealPath.$imageFileName,100); break; case 'png': $imageFileName .= '.png'; $source = imagecreatefrompng($img->getPath()); $width = imagesx($source); $height = imagesy($source); if (function_exists("imagecreatetruecolor")) { $newImg = imagecreatetruecolor($width, $height); /* --- 用以处理缩放png图透明背景变黑色问题开始 --- */ $color = imagecolorallocate($newImg,255,255,255); imagecolortransparent($newImg,$color); imagefill($newImg,0,0,$color); ImageCopyResampled($newImg, $source, 0, 0, 0, 0, $width, $height, $width, $height); } else { $newImg = imagecreate($width, $height); ImageCopyResized($newImg, $source, 0, 0, 0, 0, $width, $height, $width, $height); } imagejpeg($newImg, $imageFileRealPath.$imageFileName,100); break; } $startColumn = $this->ABC2decimal($startColumn); $data[$startRow-1][$startColumn] = $imageFileRealPath . $imageFileName; } catch (\Throwable $th) { throw $th; } } $rowsData = array(); foreach ($data as $key => $rowData) { $serial = safty_value($rowData[0],0,'intval'); // 第一列 序号 $title = safty_value($rowData[1],'','trim'); // 第二列 名称 $logo_save_path = safty_value($rowData[2],'','trim'); // logo图形保存路径 $remark = safty_value($rowData[3],'','trim'); //备注 if ($serial >0 && $logo_save_path!=="" && $title!==""){ array_push($rowsData,array( "serial"=>$serial, "title"=>$title, "logo_path"=>$logo_save_path, "remark"=>$remark )); } } // 将导入的数据生成文件缓存 $this->update_excel_data($rowsData); $upload_result = array( "count" => count($rowsData), "success" => 1, "state"=>"SUCCESS" ); } else { $upload_result = array( "message" => "上传失败!", "success" => 0 ); } echo json_encode($upload_result); }
Der folgende Vorgang ist wie folgt:
Wählen Sie die Datei aus zum Hochladen und Importieren. Nach erfolgreichem Export wird die aktuelle Listenseite angezeigt und aktualisiert.
Liste nach erfolgreichem Export:
Zu diesem Zeitpunkt ist der Datenimport abgeschlossen.
Unzureichend, die importierte Excel-Datei wurde nach dem Importieren nicht verarbeitet, daher wird empfohlen, sie zu löschen
Jetzt exportieren wir die oben genannten Daten und exportieren die Formatdefinition von Excel, die Sie benötigen Definieren Sie zuerst den Header:
$first_cells = array( array("serial","序号"), array("title","名称"), array("logo","logo"), array("remark","描述") );
Der nächste Schritt besteht darin, die Daten gemäß dem Format des Tabellenkopfes wie folgt zu kapseln:
foreach ($excel_data as $key => $row_info) { array_push($first_rows_data,array( "serial"=>$row_info['serial'], "title"=>$row_info['title'], "logo"=>$row_info['logo_path'], "remark"=>$row_info['remark'] )); }
An diesem Punkt ist die Datenkapselung abgeschlossen, der vollständige Code lautet wie folgt :
public function export(){ $excel_detail = array( "author"=>"devpoint", "date"=>join(" ",$artifacts_full) ); // 定义导出Excel表格信息 $sheets = array(); // Excel表信息,一维代表一个数据表 // 定义表头 $first_cells = array( array("serial","序号"), array("title","名称"), array("logo","logo"), array("remark","描述") ); // 为表增加数据 $excel_data = get_file_cache("excel_data"); $first_rows_data = array(); // 数据与上面表头对应 foreach ($excel_data as $key => $row_info) { array_push($first_rows_data,array( "serial"=>$row_info['serial'], "title"=>$row_info['title'], "logo"=>$row_info['logo_path'], "remark"=>$row_info['remark'] )); } array_push($sheets,array( "title"=>"前端项目流行框架", "cells"=>$first_cells, "rows"=>$first_rows_data )); $xlsName = "Excel数据导出"; $xlsName = $xlsName . date('YmdHis'); $this->exportExcel($xlsName,$sheets,$excel_detail); }
Function exportExcel
schreibt die Daten nach Excel und definiert den Stil der Tabelle. Der vollständige Code lautet wie folgt: exportExcel
将数据写入到Excel,并定义表格的样式,完整代码如下:
protected function exportExcel($expTitle,$xlsSheets,$detail){ import("Org.Util.PHPExcel"); import("Org.Util.PHPExcel.Writer.Excel5"); import("Org.Util.PHPExcel.IOFactory.php"); $fileName = $expTitle; $objPHPExcel = new \PHPExcel(); $objPHPExcel->getDefaultStyle()->getFont()->setName('宋体'); // Excel列名称 $cellName = array( 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U', 'V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM', 'AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ' ); foreach ($xlsSheets as $index => $sheet_info) { $sheet_title = $sheet_info['title']; if ($index>0){ // Excel默认已经建好的数据表,超过一张需要执行这里创建一个工作表 $newSheet = new \PHPExcel_Worksheet($objPHPExcel, $sheet_title); //创建一个工作表 $objPHPExcel->addSheet($newSheet); } else { $objPHPExcel->getActiveSheet($index)->setTitle($sheet_title); } $expCellName = $sheet_info['cells']; $expTableData = $sheet_info['rows']; $cellNum = count($expCellName); $dataNum = count($expTableData); $cellmerget = ""; $cellWidths = array(); $sheet_head_title = $sheet_title; // 下面需要为每个工作表定义宽度 switch ($index) { case 1: // 每张表的索引从 0 开始计算 $cellmerget = 'A1:E1'; $cellWidths=array(16,16,16,28,16); break; default: $cellmerget = 'A1:D1'; $sheet_head_title = $sheet_title ; $cellWidths=array(16,16,16,36); break; } $activeSheet = $objPHPExcel->setActiveSheetIndex($index); for($i=0;$i<$cellNum;$i++){ $currentCellName = $cellName[$i]; $activeSheet->getRowDimension(1)->setRowHeight(36); $activeSheet->getColumnDimension($currentCellName)->setWidth($cellWidths[$i]); $activeSheet->getStyle($currentCellName.'1')->getFont()->setSize(12)->setBold(true); $activeSheet->getStyle($currentCellName.'1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); } $activeSheet->mergeCells($cellmerget);//合并单元格 $activeSheet->setCellValue('A1', $sheet_head_title); $activeSheet->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $activeSheet->getStyle('A1')->getFont()->setSize(20); $activeSheet->getRowDimension(1)->setRowHeight(50); $styleThinBlackBorderOutline = array( 'borders' => array ( 'outline' => array ( 'style' => \PHPExcel_Style_Border::BORDER_MEDIUM, //设置border样式 'color' => array ('argb' => 'FF9b9b9b'), //设置border颜色 ), ), ); for($i=0;$i<$cellNum;$i++){ $currentCellName = $cellName[$i]; $activeSheet->getRowDimension(2)->setRowHeight(36); $activeSheet->getColumnDimension($currentCellName)->setWidth($cellWidths[$i]); $activeSheet->setCellValue($currentCellName.'2', $expCellName[$i][1]); $activeSheet->getStyle($currentCellName.'2')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID); $activeSheet->getStyle($currentCellName.'2')->getFill()->getStartColor()->setARGB('FFc6efcd'); $activeSheet->getStyle($currentCellName.'2')->getFont()->setSize(12)->setBold(true); $activeSheet->getStyle($currentCellName.'2')->applyFromArray($styleThinBlackBorderOutline); $activeSheet->getStyle($currentCellName.'2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); $activeSheet->freezePane($currentCellName.'3'); // 锁定表头,3 意味着锁定第3行上面的 } switch ($index) { case 1: break; default: $start_row_index = 3; // 数据开始索引行 for($i1=0;$i1<$dataNum;$i1++){ $objPHPExcel->getActiveSheet()->getRowDimension($i1+3)->setRowHeight(60); for($j1=0;$j1<$cellNum;$j1++){ if ($j1===2){ $logo_path = $expTableData[$i1][$expCellName[$j1][0]]; if ($logo_path!=="" && file_exists($logo_path)){ $objDrawing = new \PHPExcel_Worksheet_Drawing(); $objDrawing->setPath($logo_path); $objDrawing->setHeight(60); $objDrawing->setWidth(60); $objDrawing->setOffsetX(5); $objDrawing->setOffsetY(5); $objDrawing->setCoordinates($cellName[$j1].($i1+$start_row_index)); $objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); } else { $objPHPExcel->getActiveSheet()->setCellValue($cellName[$j1].($i1+$start_row_index), ""); $objPHPExcel->getActiveSheet()->getStyle($cellName[$j1].($i1+$start_row_index))->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($cellName[$j1].($i1+$start_row_index))->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT); $objPHPExcel->getActiveSheet()->getStyle($cellName[$j1].($i1+$start_row_index))->getAlignment()->setWrapText(true); } } else { $objPHPExcel->getActiveSheet()->setCellValue($cellName[$j1].($i1+$start_row_index), $expTableData[$i1][$expCellName[$j1][0]]); $objPHPExcel->getActiveSheet()->getStyle($cellName[$j1].($i1+$start_row_index))->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($cellName[$j1].($i1+$start_row_index))->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT); $objPHPExcel->getActiveSheet()->getStyle($cellName[$j1].($i1+$start_row_index))->getAlignment()->setWrapText(true); } } } break; } } $objPHPExcel->setActiveSheetIndex(0); header('pragma:public'); header('Content-type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8;name="'.$fileName.'.xlsx"'); header("Content-Disposition:attachment;filename=$fileName.xlsx"); // attachment新窗口打印inline本窗口打印 $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); exit; }
导出后的格式如下:
锁定表头
锁定表头是Excel比较常见的功能,可以方便查阅者查阅数据,使用 phpExcel
设置表头的代码如下:
$activeSheet->freezePane($currentCellName.'3'); // 3 意味着锁定第3行上面的行数
表格边框样式
上面的代码设置表格边框样式的代码为PHPExcel_Style_Border::BORDER_MEDIUM
,在 phpExcel
中有14个配置可选项目。
PHPExcel_Style_Border::BORDER_NONE; PHPExcel_Style_Border::BORDER_THIN; PHPExcel_Style_Border::BORDER_MEDIUM; PHPExcel_Style_Border::BORDER_DASHED; PHPExcel_Style_Border::BORDER_DOTTED; PHPExcel_Style_Border::BORDER_THICK; PHPExcel_Style_Border::BORDER_DOUBLE; PHPExcel_Style_Border::BORDER_HAIR; PHPExcel_Style_Border::BORDER_MEDIUMDASHED; PHPExcel_Style_Border::BORDER_DASHDOT; PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT; PHPExcel_Style_Border::BORDER_DASHDOTDOT; PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT; PHPExcel_Style_Border::BORDER_SLANTDASHDOT;
1. BORDER_NONE
对应的完整配置项为 PHPExcel_Style_Border::BORDER_NONE
\PHPExcel_Style_Border::BORDER_THINDas exportierte Format ist wie folgt:
Kopfzeile sperren
Kopfzeile sperren ist eine häufige Funktion in Excel, die den Lesern das Überprüfen von Daten erleichtern kann. Verwenden Sie phpExcel
, um den Kopfzeilencode wie folgt festzulegen :
\PHPExcel_Style_Border::BORDER_MEDIUM
Tabellenrahmenstil
Der Code zum Festlegen des Tabellenrahmenstils im obigen Code istPHPExcel_Style_Border::BORDER_MEDIUM code>. Es gibt <p>14<img src="https://img.php.cn/upload/image/976/107/161/163170676514147Bringen%20Sie%20Ihnen%20Schritt%20f%C3%BCr%20Schritt%20bei,%20wie%20Sie%20ThinkPHP+phpExcel%20zum%20Importieren%20und%20Exportieren%20von%20Excel-Daten%20verwenden%20(%C3%9Cbung)" title="163170676514147Bringen Sie Ihnen Schritt für Schritt bei, wie Sie ThinkPHP+phpExcel zum Importieren und Exportieren von Excel-Daten verwenden (Übung)" alt="Bringen Sie Ihnen Schritt für Schritt bei, wie Sie ThinkPHP+phpExcel zum Importieren und Exportieren von Excel-Daten verwenden (Übung)">optionale Konfigurationselemente in <code>phpExcel
. \PHPExcel_Style_Border::BORDER_DASHED1. BORDER_NONE
3. BORDER_MEDIUM
\PHPExcel_Style_Border::BORDER_DOTTED
4. BORDER_DASHED
\PHPExcel_Style_Border::BORDER_THICK
\PHPExcel_Style_Border::BORDER_DOUBLE
7. BORDER_DOUBLE
\PHPExcel_Style_Border::BORDER_HAIR
8. BORDER_HAIR
\PHPExcel_Style_Border::BORDER_HAIR
9. BORDER_MEDIUMDASHED
\PHPExcel_Style_Border::BORDER_MEDIUMDASHED
10. BORDER_DASHDOT
\PHPExcel_Style_Border::BORDER_DASHDOT
11. BORDER_MEDIUMDASHDOT
\PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT
12. BORDER_DASHDOTDOT
\PHPExcel_Style_Border::BORDER_DASHDOTDOT
13. BORDER_MEDIUMDASHDOTDOT
\PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT
14. BORDER_SLANTDASHDOT
\PHPExcel_Style_Border::BORDER_SLANTDASHDOT
部署
在部署上,通常的架构是 nginx + php-fpm
,对于Excel中图片比较多的数据导入需要设置加大上传文件的限制和超时时间。
在文件上传上,通常会出现 413 request Entity too Large
错误,解决的办法是在 nginx
配置中增加以下配置:
client_max_body_size 2048m;
相应的 PHP 配置也需要修改,需要修改 php.ini
:
upload_max_filesize = 2048M post_max_size = 2048M
Excel数据导入,通常会触发504错误,这种情况一般是执行时间太短,涉及的 nginx
配置:
fastcgi_connect_timeout 600;
php-fpm
中的 www.conf
request_terminate_timeout = 1800
环境问题个人觉得是后台开发经常发生的,最佳的方式是实际运行出一个最佳的配置,将其制作成 docker
镜像,这样可以确保环境迁移或者其他场合需要,可以快速完成环境配置,而且不容易出问题。
原文地址:https://juejin.cn/post/6982953271933550628
作者:天行无忌
推荐学习:《PHP视频教程》
Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen Schritt für Schritt bei, wie Sie ThinkPHP+phpExcel zum Importieren und Exportieren von Excel-Daten verwenden (Übung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!