电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:5日期: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
主站蜘蛛池模板: 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 证券新闻,热播美式保罗1984第二部_腾讯1080p-仁爱影院 | 扬州汇丰仪表有限公司| 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 | CCE素质教育博览会 | CCE素博会 | 教育展 | 美育展 | 科教展 | 素质教育展 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 达利园物流科技集团-| 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪| 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 江苏齐宝进出口贸易有限公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 阳光1号桔柚_无核沃柑_柑橘新品种枝条苗木批发 - 苧金网 | 农业仪器网 - 中国自动化农业仪器信息交流平台 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 杭州顺源过滤机械有限公司官网-压滤机_板框压滤机_厢式隔膜压滤机厂家 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 广东教师资格网-广东教师资格证考试网 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 酒店厨房设计_中央厨房设计_北京商用厨房设计公司-奇能商厨 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | 通风天窗,通风气楼,屋顶通风天窗,屋顶通风天窗公司 | 拖鞋定制厂家-品牌拖鞋代加工厂-振扬实业中国高端拖鞋大型制造商 | 不锈钢拉手厂家|浴室门拉手厂家|江门市蓬江区金志翔五金制品有限公司 | 物流之家新闻网-最新物流新闻|物流资讯|物流政策|物流网-匡匡奈斯物流科技 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 |