php excel数据导出

一般的数据量。

导出excel 例子代码如下,主要思路是mysql 读取数据到php 变量保存,整理成excel 开头格式的字符串,写入文件,保存为 xxx.csv 文件, excel 文件的特性,必须 是GBK, 使用 iconv 转义 字符编码 iconv("utf-8","GBK//TRANSLIT",$csvStr); A 如果内容少 excel 内容直接 告知文件头信息,然后 header("Content-type:text/csv"); header("Content-Disposition:attachment;filename=".$fileNameCsv); echo 出来就可以。 记得需要exit。断掉。

B 文件数据比较多,需要分页获取数据,写入 文件,然后header('Location://http://xxx.xxx.xxx/xx.csv'); 分页是否截至,需要 do{}while(); 如果是多台服务器,那么需要借助 redis key ,存储 文件名,还有状态 (0,没有,1有文件了。过期时间为一天),然后数据就可以不用担心判断不出来 ,是否已经后台生成了。 这个时候定时脚本没3分钟执行一次,避免多任务堆积,吃掉内存,服务挂机。使用 exec('ps -efH|grep "'.basename(FILE).'"', $output); if(count($output) > 3) { //类似守护进程,保证只运行1个此进程 print_r($output); exit; } 判断当前是否已经执行过,需要等待上次执行后,这次才能执行。这个程序导出 23w ,数据大概是 1小时。业务不需要太准确数据,延时几小时可以接受。当键值24小时过期,那么通过键值判断是否已经生成问见我,新文件替换老文件

然后下载文件

public function crontExportExcel()
    {
        global $redis_obj;
        $saveCsv = F('saveCsv');
        $xml = '';
        $key = 'ORDER:exportExcel';
        $dataArr = json_decode($redis_obj->rPop($key), true);
        if(!$dataArr){
            echo __FILE__.' LINE:'.__LINE__.'; dataArr is empty!'.PHP_EOL;
            return true;
        }
        $saveCsv->crontInit(WEB_PATH.'html/orderExcel/exportExcelGeneral/', $dataArr['exceltype'], $dataArr['ostatus'], $dataArr['otype'], $dataArr['userId']);
        $conditions = json_decode($dataArr['conditions'], true);
        $userCnname = $dataArr['userCnname'];
        $shipOrderList    = M("Order")->getOrderList($conditions,1,2);
        M('Order')->clearReadDB();
        if(empty($shipOrderList)){
            $statusStr    = '没有数据!';
            echo '<script language="javascript">
                                alert("'.$statusStr.'");
                                history.back();
                              </script>';
            exit;
        }
        $shipOrderListSku    = $this->getfullOrderSkuInfo($shipOrderList);
        ############################基础数据##########################################
        $accounts        = $this->getAccountList();//账号数组
        $carriers        = $this->getCarrierList();//运输方式数组
        $AbbToNames      = getCarrierNameByAbb();
        $channels        = $this->getChannelLists();//渠道数组
        $users           = $this->getUserList();//用户数组
        $stores          = array(1=>"赛维网络");
        F('order');
        /*
        $fileName    = "Files_FHQD" . date ( "Y-m-d_H_i_s" ) . ".xls";
        $excel       = new ExportDataExcel ( 'browser', $fileName );
        $excel->initialize();
        */
        //发柜目的仓库,订单号,发柜清单号、发柜时间、SKU、数量、对应SKU销售单价、销售总金额(订单总金额),币种;
        $cellData = array(
            'A'  =>'编号',
            'S'  =>"订单编号",
            'S1'  =>"是否拆分",
            'B'  =>'日期',
            'C'  =>'ebay store',
            'D'  =>'交易号',
            'E'  =>'客户ID',
            'F'  =>'料号',
            'F0' =>'实际库存',
            'F1' =>'组合料号',
            'F2' =>'产品状态',
            'G'  =>'仓位',
            'H'  =>'价格',
            'I'  =>'运费',
            'J'  =>'数量',
            'K'  =>'国家',
            'L'  =>'包裹总价值',
            'M'  =>'币种',
            'N'  =>"包装员",
            'O'  =>"挂号条码",
            'P'  =>"重量",
            'Q'  =>"邮费",
            'R'  =>"运输方式",
            'T'  =>"客户邮箱",
            'U'  =>"同步时间",
            'V'  =>"退回时间",
            'W'  =>"城市",
            'X'  =>"县/洲",
            'Y'  =>"街道",
            'AA'  =>"邮编",
            'AB'  =>"手机号",
            'AC'  =>"电话",
        );
        $spuStatus    = array(
            "1"   =>'在线',
            "2"   =>'停售',
            "3"   =>'暂时停售',
            "4"   =>'部分侵权-ebay',
            "5"   =>'部分侵权-B2B',
            "6"   =>'部分侵权-其他平台',
            "51"  =>'PK产品',
            "101" =>'料号转化'
        );
        $csvStr =  '"'.implode('","', $cellData).'"'.PHP_EOL;
        $xmlHead = iconv("utf-8","GBK//TRANSLIT",$csvStr);
        $saveCsv->saveCsv($xmlHead);
        $numIndex    = 1;
        $usoverseaseObjc  = F('skudailyinfooversease');
        $i = 1;
        $shipOrderList = [];
        do{
            $shipOrderList = M("Order")->getOrderList($conditions,$i,500);
            if(empty($shipOrderList)){
                continue;
            }
            $i++;
            $xml = '';
            foreach ( $shipOrderList as $key => $value ) { // key代表最外层的维数
                /*
                 * $value分别有7个对应的键分别为
                * order订单表头数据记录
                * orderExtension//订单表扩展数据记录
                * orderUserInfo//订单表中客户的数据记录
                * orderWarehouse//物料对订单进行操作的数据记录
                * orderNote //订单的备注(销售人员添加)记录
                * orderTracknumber//订单的追踪号记录
                * orderDetail //订单明细记录
                */
                $orderData            = $value['order'];            // 订单表头数据记录,为一维数组
                $orderExtenData       = $value['orderExtension'];   // 扩展表头数据记录,为一维数组
                $orderUserInfoData    = $value['orderUserInfo'];    // 订单客户数据记录,为一维数组
                $orderWhInfoData      = $value['orderWarehouse'];   // 物料对订单进行操作的数据记录,为一维数组
                $orderNote            = $value['orderNote'];        // 订单备注记录,二维数组
                $orderTracknumber     = $value['orderTracknumber']; // 订单跟踪号,一维数组
                $orderDetail          = $value['orderDetail'];      // 订单明细记录,三维数组
                $orderId              = $orderData['id'];           // ****订单编号 $ebay_id
                $is_split             = $orderData['isSplit'] == 2 ? "是" :"否";           // ****订单编号 $ebay_id
                $accountId            = $orderData['accountId'];
                $platformId           = $orderData['platformId'];
                $accountName          = $accounts[$accountId];
                $orderStore           = $orderData['orderStore'];
                $recordNumber         = $orderData['recordNumber'];
                $paymentTime          = date("Y-m-d H:i:s",$orderData['paymentTime']);
                $actualTotal          = $orderData['actualTotal'];
                $calcWeight           = $orderData['calcWeight'];
                $calcShipping         = $orderData['calcShipping'];
                $transportId          = $orderData['transportId'];
                $orderType            = $orderData['orderType'];
                //获取城市相关信息
                $countryName = $orderUserInfoData['countryName'];
                $city = $orderUserInfoData['city'];
                $state = $orderUserInfoData['state'];
                $address1 = $orderUserInfoData['address1'];
                $zipCode = $orderUserInfoData['zipCode'];
                $mobilePhone = $orderUserInfoData['mobilePhone'];
                $phone = $orderUserInfoData['phone'];
                $orderAddTime         = $orderData['orderAddTime'];
                $orderAddTime         = date("Y-m-d H:i:s",$orderAddTime);
                $operateTime          = "";
                if($orderType == 232 ){
                    $whData               = M('Order')->getAllData("om_unshipped_order_wh","*"," omOrderId=$orderId and orderStatus=232 ");
                    $operateTime          = $whData[0]['operateTime'];
                    $operateTime          = empty($operateTime) ? "" : date("Y-m-d H:i:s",$operateTime);
                }
                $usoverseaseObjc  = F('skudailyinfooversease');
                $carriername          = $carriers[$transportId];
                if(in_array($accountId,array(591,592,593))){ //独立商城特殊处理
                    $transportId      = $orderData['ORtransport'];
                    $carriername      = $AbbToNames[$transportId ];
                }
                if($platformId == 11){
                    $transportId          = M("Order")->getCalOrderTransportId($orderId );
                    $carriername          = $carriers[$transportId];
                }
                $orderTracknumber     = isset($value['orderTracknumber']) ? $value['orderTracknumber'] : array();
                $tracknumber          = isset($orderTracknumber[0]['tracknumber']) ? "'".$orderTracknumber[0]['tracknumber']: "无";
                $orderUserInfo        = $value['orderUserInfo'];
                $userId               = $orderUserInfo['username'];
                $platformUsername     = $orderUserInfo['platformUsername'];
                $countryName          = $orderUserInfo['countryName'];
                $currency             = $orderUserInfo['currency'];
                $email                = hideEmailStr($orderUserInfo['email']);
                $cellData             = array(
                    "A"  => "",
                    "S"  => $orderId,
                    "S1"  => $is_split,
                    "B"  => $paymentTime,
                    "C"  => $accountName,
                    "D"  => $recordNumber,
                    "E"  => $platformUsername,
                    "F"  => "",
                    "F0" => '',
                    "F1" => "",
                    "F2" => "",
                    "G"  => "",//仓位
                    "H"  => "",
                    "I"  => "",
                    "J"  => "",
                    "K"  => $countryName,
                    "L"  => $actualTotal,
                    "M"  => $currency,
                    "N"  => "",//包装员
                    "O"  => $tracknumber,
                    "P"  => $calcWeight,//实际重量
                    "Q"  => $calcShipping,//时际运费
                    "R"  => $carriername,
                    "T"  => $email,//加*号
                    "U"  => $orderAddTime,
                    "V"  => $operateTime,
                    "W"  => $city,
                    "X"  => $state,
                    "Y"  => $address1,
                    "Z"  => $zipCode,
                    "Z1"  => $mobilePhone,
                    "Z2"  => $phone,
                );
                $orderDetails         = $value['orderDetail'];
                $detailNum            = count($orderDetails);
                if($detailNum<=1){
                    $orderDetail      = array_values($orderDetails);
                    $orderDetail      = $orderDetail[0]['orderDetail'];
                    $sku              = $orderDetail['sku'];
                    $amount           = $orderDetail['amount'];
                    $itemPrice        = $orderDetail['itemPrice'];
                    $shippingFee      = $orderDetail['shippingFee'];
                    $skuinfos         = $shipOrderListSku[$sku];
                    $skuinfo          = isset($skuinfos['skuInfo']) ? $skuinfos['skuInfo'] : array() ;
                    if(!empty($skuinfo)){
                        foreach ($skuinfo as $truesku => $trueskuInfo) {//真实sku信息
                            $goodsStatus          = $trueskuInfo['skuDetail']['goodsStatus'];//商品状态 1.在线 2.停售 3.暂时停售 4.部分侵权-ebay 5.部分侵权-B2B 6.部分侵权-其他平台,51.PK产品,101,料号转化。默认为1,在线
                            if(!empty($orderStore)){
                                //获取实际库存
                                //这个地方改成从缓存获取
                                $keyConfig  = array(
                                    1=>  "SkuData:info:",
                                    22=>  "SkuData:info:",
                                    4=>  "us01_overseaseSkuData:info:",
                                    15=> "de01_15_overseaseSkuData:info:",
                                    16=> "us01_16_overseaseSkuData:info:",
                                    20=> "uk01_20_overseaseSkuData:info:",
                                    21=> "jp01_21_overseaseSkuData:info:",
                                    25=> "us01_25_overseaseSkuData:info:",
                                    26=> "us01_26_overseaseSkuData:info:",
                                );
                                $actualStockCount = 0;
                                if(array_key_exists($orderStore,$keyConfig)){
                                    $this_key = $keyConfig[$orderStore];
                                    $this_key .= $truesku;
                                    global $redis_obj;
                                    $stockInfo = $redis_obj->get($this_key);
                                    if(!empty($stockInfo)){
                                        $stockInfo = json_decode($stockInfo,true);
                                        if(in_array($orderStore,array(1))){
                                            $actualStockCount = $stockInfo["stock_qty_shenzhen"];
                                        }elseif(in_array($orderStore,array(22))){
                                            $actualStockCount = $stockInfo["stock_qty_dongguan"];
                                        }else{
                                            $actualStockCount = $stockInfo["stock_qty"];
                                        }
                                    }
                                }
                            }
                            $cellData['F0']       = $actualStockCount;
                            $cellData['F2']       = $spuStatus[$goodsStatus];
                            $cellData['F']    = $truesku;
                            if($sku!=$truesku){
                                $cellData['F1']  = $sku;
                            }
                            $cellData['H']    = $itemPrice;
                            $cellData['I']    = $shippingFee;
                            $cellData['J']    = $amount;
                            if(count($skuinfo)>1){
                                $cellData['A']    = "";
                                $cellData = array_map("html_entity_decode",$cellData);
                                //$excel->addRow($cellData);
                                $csvStr =  '"'.implode('","', $cellData).'"'.PHP_EOL;
                                $xml .= iconv("utf-8","GBK//TRANSLIT",$csvStr);
                                $csvStr = "";
                            }else{
                                $cellData['A']    = $numIndex;
                                $cellData = array_map("html_entity_decode",$cellData);
                                //$excel->addRow($cellData);
                                $csvStr =  '"'.implode('","', $cellData).'"'.PHP_EOL;
                                $xml .= iconv("utf-8","GBK//TRANSLIT",$csvStr);
                                $csvStr = "";
                                $numIndex++;
                            }
                        }
                    }else{
                        $cellData['F']    = $sku;
                        $cellData['F1']    = $sku;
                        $cellData['H']    = $itemPrice;
                        $cellData['I']    = $shippingFee;
                        $cellData['J']    = $amount;
                        $cellData['A']    = $numIndex;
                        $cellData = array_map("html_entity_decode",$cellData);
                        $csvStr =  '"'.implode('","', $cellData).'"'.PHP_EOL;
                        $xml .= iconv("utf-8","GBK//TRANSLIT",$csvStr);
                        $csvStr = "";
                        $numIndex++;
                    }
                    unset($orderDetail);
                }else{
                    //$orderDetailNE      = array_values($orderDetails);
                    //$orderDetailArr     = $orderDetailNE['orderDetail'];
                    $totalMoney         = 0;
                    $totalShipFee       = 0;
                    $totalamount        = 0;
                    $cellDatasSplilts    = array();
                    foreach($orderDetails as $orderDetail){
                        $sku              = $orderDetail['orderDetail']['sku'];
                        $amount           = $orderDetail['orderDetail']['amount'];
                        $totalamount     += $amount;
                        $itemPrice        = $orderDetail['orderDetail']['itemPrice'];
                        $totalMoney      += $amount*$itemPrice;
                        $shippingFee      = $orderDetail['orderDetail']['shippingFee'];
                        $totalShipFee    += $shippingFee;
                        $skuinfos          = $shipOrderListSku[$sku];
                        $skuinfo          = isset($skuinfos['skuInfo']) ? $skuinfos['skuInfo'] : array() ;
                        if(!empty($skuinfo)){
                            foreach ($skuinfo as $truesku => $trueskuInfo) {//真实sku信息
                                $cellData['F']    = $truesku;
                                //$skuShippedInfo   = M('Order')->GetSkuDailystatus($truesku);
                                //$actualStockCount     = $skuShippedInfo[0]['actualStockCount'];//实际库存
                                //这个地方改成从缓存获取
                                $keyConfig  = array(
                                    1=>  "SkuData:info:",
                                    22=>  "SkuData:info:",
                                    4=>  "us01_overseaseSkuData:info:",
                                    15=> "de01_15_overseaseSkuData:info:",
                                    16=> "us01_16_overseaseSkuData:info:",
                                    20=> "uk01_20_overseaseSkuData:info:",
                                    21=> "jp01_21_overseaseSkuData:info:",
                                    25=> "us01_25_overseaseSkuData:info:",
                                    26=> "us01_26_overseaseSkuData:info:",
                                );
                                $actualStockCount = 0;
                                if(array_key_exists($orderStore,$keyConfig)){
                                    $this_key = $keyConfig[$orderStore];
                                    $this_key .= $truesku;
                                    $stockInfo = $redis_obj->get($this_key);
                                    if(!empty($stockInfo)){
                                        $stockInfo = json_decode($stockInfo,true);
                                        if(in_array($orderStore,array(1))){
                                            $actualStockCount = $stockInfo["stock_qty_shenzhen"];
                                        }elseif(in_array($orderStore,array(22))){
                                            $actualStockCount = $stockInfo["stock_qty_dongguan"];
                                        }else{
                                            $actualStockCount = $stockInfo["stock_qty"];
                                        }
                                    }
                                }
                                $goodsStatus          = $trueskuInfo['skuDetail']['goodsStatus'];//商品状态 1.在线 2.停售 3.暂时停售 4.部分侵权-ebay 5.部分侵权-B2B 6.部分侵权-其他平台,51.PK产品,101,料号转化。默认为1,在线
                                $cellData['F0']       = $actualStockCount;
                                $cellData['F2']       = $spuStatus[$goodsStatus];
                                if($sku!=$truesku){
                                    $cellData['F1']  = $sku;
                                }
                                $cellData['H']    = $itemPrice;
                                $cellData['I']    = $shippingFee;
                                $cellData['J']    = $amount;
                                $cellData['A']    = "";
                                $cellDatasSplilts[]=$cellData;
                            }
                        }else{
                            $cellData['F']    = $sku;
                            $cellData['F1']   = $sku;
                            $cellData['H']    = $itemPrice;
                            $cellData['I']    = $shippingFee;
                            $cellData['J']    = $amount;
                            $cellData['A']    = "";
                            $cellDatasSplilts[]=$cellData;
                        }
                    }
                    $cellData['F']         = "无";
                    $cellData['F1']        = "无";
                    $cellData['F2']        = '';
                    $cellData['H'] = "";
                    $cellData['I'] = "";
                    $cellData['J'] = "";
                    $cellData['A'] = $numIndex;
                    $numIndex++;
                    $cellData = array_map("html_entity_decode",$cellData);
                    $csvStr =  '"'.implode('","', $cellData).'"'.PHP_EOL;
                    $xml .= iconv("utf-8","GBK//TRANSLIT",$csvStr);
                    $csvStr = "";
                    foreach ($cellDatasSplilts as $cellData) {
                        $csvStr =  '"'.implode('","', $cellData).'"'.PHP_EOL;
                        $xml .= iconv("utf-8","GBK//TRANSLIT",$csvStr);
                        $csvStr = "";
                    }
                }//end of else; */
            }//end of foreach orderLists
            $status = $saveCsv->saveCsv($xml, 1);
        }while(!empty($shipOrderList));
        $fileKey = $saveCsv->getFileKey();
        $redis_obj->set($fileKey, 1, 90000);
        $title = '订单系统小包缺货excel 下载通知邮件';
        $contact = '你好,'.PHP_EOL;
        $contact .= 'time: '.date('Y-m-d H:i').'. 订单系统小包缺货excel 已经同步完成,请回到页面点击下载';
        $emailResult = M("InterfaceNotice")->sendMessageByNoticeSys($contact, $title, $userCnname);
        if ($emailResult['errCode'] == 2013) {
            echo date('Y-m-d H:i')."订单系统小包缺货excel 下载通知邮件已经发出", PHP_EOL;
        }
        return $status;
    }

猜你喜欢

转载自my.oschina.net/u/2280651/blog/1628780