日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解如何實現phpoffice的excel導入功能解耦

瀏覽:48日期:2022-06-14 10:53:23
目錄前言:沖突:解決方法:編碼:前言:

在業務中開發中,表格的導入導出功能很常見。但是這里主要是使用PhpOffice類庫介紹實現導入表格數據的功能。

沖突:

大部分的導入功能,就是通過點擊按鈕上傳一張表格,然后后臺讀取表格數據根據業務整理后直接插入到數據庫,最后再返回給前端。但是如果表格數據龐大,業務邏輯復雜的時候,就會導致導入那一塊很臃腫不好維護。

解決方法:

處理方式是把導入與業務數據插入分離,所以在二者之間添加一個隊列就可以了。導入只負責將表格數據存入隊列。業務部分可以是單獨的系統,最后就是消費隊列中的數據了。這樣一來,不但提升了導入速度,而且還讓導入與系統解耦,不會因為異常而影響到其他業務。

編碼:

1.下載PhpOffice。

composer repuire phpoffice/phpspreadsheet

2.導入導出代碼。

<?phpnamespace app\common\helper;use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;use PhpOffice\PhpSpreadsheet\IOFactory;use PhpOffice\PhpSpreadsheet\Cell\Coordinate;use think\Exception;class Excel{ // 導出 public function outPut($data, $columns, $table = '導出文件') {$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();// 設置第一欄的標題foreach ($columns as $k => $v) { $sheet->setCellValue($k . '1', $v['title']);}//第二行起 設置內容$baseRow = 2; //數據從N-1行開始往下輸出 這里是避免頭信息被覆蓋foreach ($data as $key => $value) { foreach ($columns as $k1 => $v1) {$i = $key + $baseRow;$sheet->setCellValue($k1 . $i, $value[$v1['field']]); }}$writer = new Xlsx($spreadsheet);$filename = $table . date('Y-m-d', time()) . '_' . time() . '.xlsx';$writer->save('./excel/' . $filename);return '/excel/' . $filename; } // 導入 public function importExcel($file = '', $sheet = 0, $columnCnt = 0, &$options = []) {try { $file = iconv('utf-8', 'gb2312', $file); if (empty($file) OR !file_exists($file)) {throw new \Exception('文件不存在!'); } $objRead = IOFactory::createReader('Xlsx'); if (!$objRead->canRead($file)) {$objRead = IOFactory::createReader('Xls');if (!$objRead->canRead($file)) { throw new \Exception('只支持導入Excel文件!');} } /* 如果不需要獲取特殊操作,則只讀內容,可以大幅度提升讀取Excel效率 */ empty($options) && $objRead->setReadDataOnly(true); /* 建立excel對象 */ $obj = $objRead->load($file); /* 獲取指定的sheet表 */ $currSheet = $obj->getSheet($sheet); //$currSheet = $obj->getSheetByName($sheet); // 根據名字 if (isset($options['mergeCells'])) {/* 讀取合并行列 */$options['mergeCells'] = $currSheet->getMergeCells(); } if (0 == $columnCnt) {/* 取得最大的列號 */$columnH = $currSheet->getHighestColumn();/* 兼容原邏輯,循環時使用的是小于等于 */$columnCnt = Coordinate::columnIndexFromString($columnH); } /* 獲取總行數 */ $rowCnt = $currSheet->getHighestRow(); $data = []; /* 讀取內容 */ for ($_row = 1; $_row <= $rowCnt; $_row++) {$isNull = true;for ($_column = 1; $_column <= $columnCnt; $_column++) { $cellName = Coordinate::stringFromColumnIndex($_column); $cellId = $cellName . $_row; $cell = $currSheet->getCell($cellId); if (isset($options['format'])) {/* 獲取格式 */$format = $cell->getStyle()->getNumberFormat()->getFormatCode();/* 記錄格式 */$options['format'][$_row][$cellName] = $format; } if (isset($options['formula'])) {/* 獲取公式,公式均為=號開頭數據 */$formula = $currSheet->getCell($cellId)->getValue();if (0 === strpos($formula, '=')) { $options['formula'][$cellName . $_row] = $formula;} } if (isset($format) && 'm/d/yyyy' == $format) {/* 日期格式翻轉處理 */$cell->getStyle()->getNumberFormat()->setFormatCode('yyyy/mm/dd'); } $data[$_row][$cellName] = trim($currSheet->getCell($cellId)->getFormattedValue()); if (!empty($data[$_row][$cellName])) {$isNull = false; }}if ($isNull) { unset($data[$_row]);} } return $data;} catch (\Exception $e) { throw $e;} }}

3.抽取指定的字段格式化Excel數據。

return [ // 導入的表格標題 'bidding' => ['stock_no' => '編號','price' => '價格','mobile' => '手機','nickname' => '姓名' ]];// 格式化指定列數據(默認第一行表頭)public static function formattingCells(array $data, array $cellConfig){ $res = array_values($data); // 表頭 $header = $res[0]; $cellKeys = []; foreach ($header as $key => $value) {foreach ($cellConfig as $k => $v) { if ($value == $v) {$cellKeys[$key] = $k; }} } if (count($cellKeys) != count($cellConfig)) {throw new Exception('表格不完整'); } // 需要添加過濾 $temp = []; for ($i = 1; $i <= count($res) - 1; $i++) {foreach ($cellKeys as $m => $n) { $temp[$i][$n] = $res[$i][$m];} } return array_values($temp);}

4.導入部分,上傳接口。

// 導入表格,上傳接口public function importExcel(){ $upload_file = $_FILES['files']['tmp_name']; $input = $this->input; // ID $id = isset($input['id']) ? $input['id'] : 0; // 默認取第一工作表 $excelData = (new Excel())->importExcel($upload_file, 0); // 取Excel字段 $config = config('excel_export.bidding'); $price_offer = Excel::formattingCells($excelData, $config); // 判斷每條記錄的手機和價格格式 // …… $jsonList = json_encode(compact('id', 'price_offer')); //$jsonList = json_encode($price_offer); // 入MQ $host = config('mq.host'); $options = config('mq.price_offer_import'); try {$mq = new ProductMQ($host, $options);$mq->publish($jsonList);$mq->close(); } catch (\Exception $e) {return $this->jsonData(200, $e->getMessage()); } // 入MQ return $this->jsonData(200, '導入成功');}

5.消費業務邏輯。

以上就是詳解如何實現phpoffice的excel導入功能解耦的詳細內容,更多關于phpoffice excel導入解耦的資料請關注好吧啦網其它相關文章!

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91九色精品| 欧美亚洲国产精品久久| 天堂va蜜桃一区二区三区| 国产精品呻吟| 在线亚洲观看| 亚洲欧美网站在线观看| 四虎在线精品| 欧美黄色精品| 日韩在线二区| 视频一区国产视频| 欧美片网站免费| 国产九一精品| 日本а中文在线天堂| 91久久中文| 国产视频一区二区在线播放| 精品福利久久久| 欧美精品一二| 日本中文字幕视频一区| 麻豆一区在线| 亚洲精品国产偷自在线观看| 亚洲最新av| 国产精品久久| 日韩国产欧美一区二区| 美女国产精品| 精品日韩一区| 亚洲一区久久| 国产精品欧美日韩一区| 99精品国产一区二区三区| 久久国产精品毛片| 国产精品久久久久av蜜臀| 久草免费在线视频| 亚洲专区在线| 久久久精品国产**网站| 91精品蜜臀一区二区三区在线| 久久国产精品久久w女人spa| 国产亚洲电影| 日韩在线视频精品| 亚洲精品日韩久久| 色婷婷色综合| 综合亚洲视频| av资源亚洲| 美美哒免费高清在线观看视频一区二区| 国产精品第十页| 99xxxx成人网| 精品国产乱码| 亚洲另类av| 精品日韩视频| 国产日韩欧美高清免费| 自拍日韩欧美| 久久久久久一区二区| 日本欧美大码aⅴ在线播放| 久久青草久久| 国产激情久久| 中文不卡在线| 久久国产中文字幕| 国产精品成人3p一区二区三区| 久久国产亚洲精品| 国产精品**亚洲精品| 一区二区电影在线观看| 精品三级久久| 精品国产美女a久久9999| 日韩欧美中文字幕一区二区三区 | 亚洲精品观看| 欧美三级网址| 久久精品亚洲| 日韩高清欧美激情| 乱人伦精品视频在线观看| 国产综合色区在线观看| 国产极品一区| 奇米色欧美一区二区三区| 久久精品动漫| 成人片免费看| 成人精品久久| 精品三区视频| 国产精品亚洲四区在线观看| 亚洲精选91| 亚洲综合不卡| 九九久久婷婷| 日韩高清不卡| 日韩在线观看| 日韩精品中文字幕第1页| 精品一区二区三区中文字幕在线| 久久精品99久久久| 日本欧美一区| 五月国产精品| 亚洲一区二区av| 午夜一级久久| 久久国产99| 99re国产精品| 99亚洲精品| 日韩视频一区| 精品丝袜在线| 久久精品亚洲欧美日韩精品中文字幕| 成人影视亚洲图片在线| 国产在线日韩精品| 精品一区电影| 久久久久久夜| 成人片免费看| 日韩在线高清| 日韩精品一区二区三区免费观影| 国产v日韩v欧美v| 日韩在线精品| 五月天久久久| 热久久免费视频| 91久久国产| 婷婷亚洲综合| 日本欧美在线看| 欧美日韩精品一区二区三区在线观看| 久久国内精品自在自线400部| 免费亚洲一区| 91看片一区| 亚洲精品一二三区区别| 免费在线观看成人| 日本欧美一区| 精品一区二区三区四区五区| 精品三级在线| 久久久夜精品| 亚洲男女自偷自拍| 亚洲3区在线| 麻豆国产精品777777在线| 成人福利av| 性欧美69xoxoxoxo| 亚洲一级大片| 国产精品2023| 久久美女性网| 视频一区二区三区入口| 91成人在线| 中文字幕在线视频网站| 黄色日韩在线| 国产乱子精品一区二区在线观看| 久久不卡日韩美女| 欧美天堂视频| 国产亚洲网站| 国产免费av国片精品草莓男男| 国产中文在线播放| 男女激情视频一区| 欧美激情三区| 好吊日精品视频| 国产日韩一区二区三区在线播放| 日韩成人三级| 少妇精品久久久一区二区| 精品视频在线你懂得| 国精品一区二区三区| 亚洲18在线| 日本久久成人网| 日韩毛片一区| 福利在线免费视频| 综合亚洲色图| 日韩欧美二区| 日日夜夜免费精品视频| 日韩精品2区| 91大神在线观看线路一区| 久久国产日韩| 国产精品嫩模av在线| 黄色亚洲在线| 毛片不卡一区二区| 亚洲一区免费| 美女av在线免费看| 日韩精品一区二区三区中文字幕| 日韩综合精品| 日韩欧美高清一区二区三区| 视频在线不卡免费观看| 欧美va天堂在线| 久久av超碰| 中文字幕免费精品| 在线观看精品| 国产欧美高清| 午夜一区在线| 成人羞羞在线观看网站| 国产精品一区二区三区美女| 午夜在线观看免费一区| 国产精品xx| 国产亚洲字幕| 亚洲综合欧美| 91精品国产91久久久久久黑人| 91亚洲精品在看在线观看高清| 亚洲一级网站| 日韩综合在线| 久久超碰99| 日韩在线网址| 亚洲精品1区| 久久国产成人午夜av影院宅| 精品一区不卡| 国产精品99精品一区二区三区∴ | 超碰成人av| 国产精品nxnn| 日本三级亚洲精品| 亚洲一区二区小说| 精品在线99| 日韩一区二区三区在线免费观看| 欧美黄页在线免费观看| 日韩欧美中文在线观看| 首页欧美精品中文字幕| 亚洲大全视频| 国产一区亚洲| 久久久精品日韩| 欧美日韩免费观看视频| 美女福利一区二区三区| 国产不卡精品| 你懂的网址国产 欧美|