PHPExcel 匯出excel
阿新 • • 發佈:2019-02-10
1.當前行num、每條記錄的起始行startNum、每條記錄的結束行endNum
2.不變更實際當前行
/** * 報表匯出 * @param $storeId * @param $userId * @param $isAdmin * @param null $adminId * @param null $listType * @param $date * @return array|bool */ public function emport($storeId, $userId, $isAdmin, $adminId = null, $listType = null, $date = null, $orderType = null, $dateType = null, $isCash = false) { $time = $_SERVER['REQUEST_TIME']; try { if (!$isAdmin) { throw new \Exception('該賬戶非店長,無此許可權'); } if (empty($date)) { $beginDate = date('Y-m', $time) . '-01'; } else { $beginDate = $date . '-01'; } $find = SoOrder::find(); $find->where([ SoOrder::tableName() . '.store_id' => $storeId, SoOrder::tableName() . '.status' => OrderService::STATUS_NORMAL ]); $find = self::orderListTypeFilter($find, $listType, false); $beginTime = strtotime($beginDate); $endDate = date('Y-m-d', strtotime('+1 month', $beginTime)); // 匯出 if (!$isCash) { $find->andWhere([ 'and', ['>=', SoOrder::tableName() . '.date', $beginDate], ['<', SoOrder::tableName() . '.date', $endDate] ]); } else { $find->joinWith(['transactionOrders'], false); $find->andWhere([ 'and', ['>=', TransactionOrder::tableName() . '.finish_date', $beginDate], ['<', TransactionOrder::tableName() . '.finish_date', $endDate] ]); } $find = $this->baseOrderSearchCondition($find, null, $orderType, null, null, null, null, $dateType); $orders = $find->orderBy(['create_time' => SORT_DESC])->all(); $list = []; $otherFeeDetail = []; foreach ($orders as $order) { // $list[] = OrderManageService::orderFormat($order, false, false, true); $data = OrderManageService::orderFormat($order, false, true, true); if ($isCash && empty($data['payment_time_date'])) { continue; } if ($data['order_type'] == OrderService::ORDER_TYPE_BUYER_PERIOD) { $data['credit_order'] = $data['order_period_info']; } // $data['package_fee'] = ''; // $data['loading_fee'] = ''; // $data['other_fee_detail'] = ''; $data['other_fee'] = ''; $data['transportation_fee'] = ''; $data['discount_fee'] = ''; $feeInfo = !empty($data['fee_info']) ? $data['fee_info'] : []; if (in_array($data['order_type'], [OrderService::ORDER_TYPE_SELLER_OFFLINE, OrderService::ORDER_TYPE_SELLER_CREDIT])) { $extendData = !empty($feeInfo) ? $feeInfo[0] : ''; if ($extendData) { // $data['other_fee_detail'] = $extendData['extend_data']; $extendData['extend_data']['order_no'] = $order->order_no; $otherFeeDetail[] = $extendData['extend_data']; foreach ($feeInfo as $fee) { $data[SoOrderFee::$FEE_TYPE_NAME[$fee['fee_type']]] = $fee['fee_amount']; $data['memo'] = $data['memo'] . $fee['memo']; } } } else { foreach ($feeInfo as $key => $fee) { $data[SoOrderFee::$FEE_TYPE_NAME[$fee['fee_type']]] = $fee['fee_amount']; $data['memo'] = $data['memo'] . $fee['memo']; } } $data['nickname'] = isset($data['buyer_info']) ? $data['buyer_info']['nickname'] : ''; $data['pay_amount'] = isset($data['credit_order']) ? HumanReadableHelper::format_money($data['credit_order']['pay_amount']) : ''; $data['unpay_amount'] = isset($data['credit_order']) ? HumanReadableHelper::format_money($data['credit_order']['unpay_amount']) : ''; // if($order->order_id == 3499){var_dump($data);die;} $list[] = $data; } $objPHPExcel = new \PHPExcel(); $header = [ 'A' => '編號', 'B' => '訂單型別', 'C' => '訂單號', 'D' => '下單時間', 'E' => '下單使用者', 'F' => '聯絡方式', 'G' => '類別', 'H' => '品類', 'I' => '品種', 'K' => '商品名', 'J' => '規格', 'L' => '購買數量', 'M' => '單價', // 'N' => '其他-包裝', // 'O' => '其他-運輸', // 'P' => '其他-裝車', 'N' => '其他費用明細', 'O' => '其他費用', 'P' => '優惠金額', 'Q' => '小計', 'R' => '合計', 'S' => '付款時間', 'T' => '賬期實際支付金額', 'U' => '賬期未支付金額', 'V' => '業務員', 'W' => '備註' ]; $fieldName = [ 'order_type_name' => 'B', 'order_no' => 'C', 'create_time_date' => 'D', 'nickname' => 'E', 'buyer_mobile' => 'F', // 'package_fee' => 'N', // 'transportation_fee' => 'O', // 'loading_fee' => 'P', 'other_fee' => 'N', 'other_fee_detail' => 'O', 'discount_fee' => 'P', // 'confirm_total_price' =>'S', 'order_amount' => 'R', 'payment_time_date' => 'S', 'pay_amount' => 'T', 'unpay_amount' => 'U', 'admin' => 'V', 'memo' => 'W' ]; $goodsField = [ 'class_name' => 'G', 'parent_cate_name' => 'H', 'variety_name' => 'I', 'spec' => 'J', 'goods_name' => 'K', 'order_num' => 'L', 'confirm_price' => 'M', 'confirm_total_amount' => 'S' ]; // var_dump($otherFeeDetail); // exit; $getRes = $this->exportExcel($list, date('Ym', $beginTime), $header, $objPHPExcel, $fieldName, $goodsField, $storeId, $otherFeeDetail); if (!$getRes) { throw new \Exception('匯出失敗'); } return $getRes; } catch (\Exception $e) { \Yii::info($e, __FUNCTION__); $this->addError($e->getMessage()); } return false; } // TODO 匯出類 public function exportExcel($data, $filename = 'Excel', $header, $objPHPExcel = null, $fieldName, $goodsField, $storeId, $otherFeeDetail = null, $basePath = null) { // var_dump($data);exit; try { $objPHPExcel->getProperties()->setCreator("hermite.Qiu") ->setLastModifiedBy("hermite.Qiu") ->setTitle("使用者匯出") ->setSubject("資料EXCEL匯出") ->setDescription("備份資料") ->setKeywords("excel") ->setCategory("資料匯出"); $cellName = array_values($header); // 名 $cell = array_keys($header); // 單位元 // 設定標題 foreach ($cellName as $k => $v) { $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cell[$k] . '1', $v); } // 填充資料 $num = 1; // 起始行 $no = 0; // 初始編號 foreach ($data as $kk => $value) { $no += 1; $startNum = $num + 1; $goodsInfo = $value['order_product_detail'] ? $value['order_product_detail'] : []; if ($goodsInfo) { foreach ($goodsInfo as $vv) { $num += 1; $vv = $vv['goods_excel']; foreach ($vv as $goodsKey => $item) { $objPHPExcel->getActiveSheet()->setCellValue($goodsField[$goodsKey] . $num, $item); } } } else { $num += 1; } foreach ($fieldName as $fieldKey => $name) { if ($fieldKey == 'other_fee_detail' && is_array($value[$fieldKey]) && in_array($value['order_type'], [OrderService::ORDER_TYPE_SELLER_OFFLINE, OrderService::ORDER_TYPE_SELLER_CREDIT])) { // $tempStartNum = $startNum; $tempNum = $startNum; foreach ($value[$fieldKey] as $kk2 => $vv2) { if (!empty($vv2)) { $tempNum++; $objPHPExcel->getActiveSheet()->setCellValue($name . $tempNum, SoOrderFee::$TYPE_OTHER_FEE[$kk2] . $vv2); } } if ($tempNum > $num) { $num = $tempNum; } } } $endNum = $num; foreach ($fieldName as $fieldKey => $name) { $objPHPExcel->getActiveSheet()->setCellValue('A' . $startNum, $no); $objPHPExcel->getActiveSheet()->mergeCells("A$startNum" . ':' . "A$endNum"); $objPHPExcel->getActiveSheet()->getStyle($name . $startNum)->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER); if ($fieldKey == 'other_fee_detail' && is_array($value[$fieldKey]) && in_array($value['order_type'], [OrderService::ORDER_TYPE_SELLER_OFFLINE, OrderService::ORDER_TYPE_SELLER_CREDIT])) { } else { $objPHPExcel->getActiveSheet()->setCellValueExplicit($name . $startNum, " $value[$fieldKey] ", \PHPExcel_Cell_DataType::TYPE_STRING); $objPHPExcel->getActiveSheet()->mergeCells($name . $startNum . ':' . $name . $endNum); } } } // die; $objPHPExcel->getActiveSheet()->setTitle('User'); $objPHPExcel->setActiveSheetIndex(0); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); return $objWriter; } catch (\Exception $e) { \Yii::info($e->getMessage(), __FUNCTION__); $this->addError($e->getMessage()); } return false; } /** * 匯出excel * @param $data * @param string $filename * @param $header * @param null $objPHPExcel * @return bool */ public function exportExcel($data, $filename = 'Excel', $header, $objPHPExcel = null, $fieldName, $goodsField, $storeId, $otherFeeDetail = null, $basePath = null) { // var_dump($otherFeeDetail);exit; try { $objPHPExcel->getProperties()->setCreator("hermite.Qiu") ->setLastModifiedBy("hermite.Qiu") ->setTitle("使用者匯出") ->setSubject("資料EXCEL匯出") ->setDescription("備份資料") ->setKeywords("excel") ->setCategory("資料匯出"); $cellName = array_values($header); // 名 $cell = array_keys($header); // 單位元 // 設定標題 foreach ($cellName as $k => $v) { $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cell[$k] . '1', $v); } // 填充資料 $num = 1; // 起始行 $no = 0; // 初始編號 foreach ($data as $kk => $value) { $no += 1; $startNum = $num + 1; $goodsInfo = $value['order_product_detail'] ? $value['order_product_detail'] : []; if ($goodsInfo) { foreach ($goodsInfo as $vv) { $num += 1; $vv = $vv['goods_excel']; foreach ($vv as $goodsKey => $item) { $objPHPExcel->getActiveSheet()->setCellValue($goodsField[$goodsKey] . $num, $item); } } } else { $num += 1; } // foreach ($fieldName as $fieldKey => $name) { // if ($fieldKey == 'other_fee_detail' && is_array($value[$fieldKey]) && in_array($value['order_type'], [OrderService::ORDER_TYPE_SELLER_OFFLINE, OrderService::ORDER_TYPE_SELLER_CREDIT])) { //// $tempStartNum = $startNum; // $tempNum = $startNum; // foreach ($value[$fieldKey] as $kk2 => $vv2) { // if (!empty($vv2)) { // $tempNum++; // $objPHPExcel->getActiveSheet()->setCellValue($name . $tempNum, SoOrderFee::$TYPE_OTHER_FEE[$kk2] . $vv2); // } // } // if ($tempNum > $num) { // $num = $tempNum; // } // } // } $endNum = $num; foreach ($fieldName as $fieldKey => $name) { // var_dump($fieldKey); if ($otherFeeDetail && $fieldKey == 'other_fee_detail' && in_array($value['order_type'], [OrderService::ORDER_TYPE_SELLER_OFFLINE, OrderService::ORDER_TYPE_SELLER_CREDIT])) { $tempNum = $startNum; foreach ($otherFeeDetail as $otherDetail) { if ($otherDetail['order_no'] == $value['order_no']) { foreach ($otherDetail as $feeKey => $fee) { if (!empty($fee) && $feeKey != 'order_no') { $objPHPExcel->getActiveSheet()->setCellValue($name . $tempNum, SoOrderFee::$TYPE_OTHER_FEE[$feeKey] . $fee); } $tempNum++; } } } if ($tempNum > $num) { $num = $tempNum; $endNum = $num; } } else { $objPHPExcel->getActiveSheet()->getStyle($name . $startNum)->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER); if ($fieldKey == 'other_fee_detail') { $objPHPExcel->getActiveSheet()->setCellValueExplicit($name . $startNum, "", \PHPExcel_Cell_DataType::TYPE_STRING); } else { $objPHPExcel->getActiveSheet()->setCellValueExplicit($name . $startNum, " $value[$fieldKey] ", \PHPExcel_Cell_DataType::TYPE_STRING); } $objPHPExcel->getActiveSheet()->mergeCells($name . $startNum . ':' . $name . $endNum); } $objPHPExcel->getActiveSheet()->setCellValue('A' . $startNum, $no); $objPHPExcel->getActiveSheet()->mergeCells("A$startNum" . ':' . "A$endNum"); } } $objPHPExcel->getActiveSheet()->setTitle('User'); $objPHPExcel->setActiveSheetIndex(0); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); return $objWriter; } catch (\Exception $e) { \Yii::info($e->getMessage(), __FUNCTION__); $this->addError($e->getMessage()); } return false; }