phptext.net PHPText.Net
PHPText.Net > 文章 > 技术 > WEB开发

ecshop 实现订单导出功能 指定订单导出 EXCEL 数据文件

2015/09/09 23:53
1512人阅读
再谈ecshop,居然没有导出订单功能,我们来做一个。

当下很多功能都觉得理所当然,但是实际作为2012年停更的ECSHOP来说,很多功能其实都是缺少的,好比今天的要说的功能 订单导出 这个功能对于现在的产品设计来说,应该属于一个比较常规的功能,但是ECSHOP中并不是。根本没有这个功能,所以需要我们来进行开发。接下来就给大家讲解下如何给ECSHOP订单加入导出功能。


当然你也可能是找模块来了,先来看看导出的效果。是不是你需要的,接近那你就继续这个例子修改吧。

做之前提供2个下载包。依照你需要下载:

EXCEL支持类

如果你需要学习怎么做,下载这个。放到admin下面


ECSHOP默认版本修改

如果你是默认版本后台要直接用,那么除了上面的文件覆盖,同时下载这个覆盖admin

本人建议,因为版本问题还是选择第一个方式,从头做吧。避免覆盖问题变多。那么接下来我们来看怎么修改。


1,admin\templates\order_list.htm 加入“导出订单”按钮,找到下面代码:

<input name="confirm" type="submit" id="btnSubmit" value="{$lang.op_confirm}" class="button" disabled="true" onclick="this.form.target = '_self'" />

<input name="invalid" type="submit" id="btnSubmit1" value="{$lang.op_invalid}" class="button" disabled="true" onclick="this.form.target = '_self'" />

<input name="cancel" type="submit" id="btnSubmit2" value="{$lang.op_cancel}" class="button" disabled="true" onclick="this.form.target = '_self'" />

<input name="remove" type="submit" id="btnSubmit3" value="{$lang.remove}" class="button" disabled="true" onclick="this.form.target = '_self'" />

<input name="print" type="submit" id="btnSubmit4" value="{$lang.print_order}" class="button" disabled="true" onclick="this.form.target = '_blank'" />

加入下面代码

<!-- 导出订单功能开始 -->

<input name="export" type="submit" id="btnSubmit5" value="导出订单" class="button" disabled="true" onclick="this.form.target = '_blank'" />

<!-- 导出订单功能结束 -->

2,admin\order.php 里面加入PHPExcel 实现导出功能,找到下面代码:

 /* 去发货 */

elseif (isset($_POST['to_delivery']))

{

    $url = 'order.php?act=delivery_list&order_sn='.$_REQUEST['order_sn'];


    ecs_header("Location: $url\n");

    exit;

}

在它的下面加入

 /* 导出订单功能开始 */

    elseif (isset($_POST['export']))

    {

        if (empty($_POST['order_id']))

        {

            sys_msg($_LANG['pls_select_order']);

        }


        /* 赋值公用信息 */

        $smarty->assign('shop_name',    $_CFG['shop_name']);

        $smarty->assign('shop_url',     $ecs->url());

        $smarty->assign('shop_address', $_CFG['shop_address']);

        $smarty->assign('service_phone',$_CFG['service_phone']);

        $smarty->assign('print_time',   local_date($_CFG['time_format']));

        $smarty->assign('action_user',  $_SESSION['admin_name']);


        $html = '';

        $order_sn_list = explode(',', $_POST['order_id']);

 

        require_once dirname(__FILE__) . '/Classes/PHPExcel.php';

        require_once dirname(__FILE__) . '/Classes/PHPExcel/IOFactory.php';

        $PHPExcel = new PHPExcel();

        

        //设置excel属性基本信息

        $PHPExcel->getProperties()->setCreator("Neo")

        ->setLastModifiedBy("Neo")

        ->setTitle("东莞XX系统有限公司")

        ->setSubject("订单列表")

        ->setDescription("")

        ->setKeywords("订单列表")

        ->setCategory("");

        $PHPExcel->setActiveSheetIndex(0);

        $PHPExcel->getActiveSheet()->setTitle("订单列表");

        //填入表头主标题

        $PHPExcel->getActiveSheet()->setCellValue('A1', $_CFG['shop_name'].'订单列表');

        //填入表头副标题

        $PHPExcel->getActiveSheet()->setCellValue('A2', '操作者:'.$_SESSION['admin_name'].' 导出日期:'.date('Y-m-d',time()).' 地址:'.$_CFG['shop_address'].' 电话:'.$_CFG['service_phone']);

        //合并表头单元格

        $PHPExcel->getActiveSheet()->mergeCells('A1:T1');

        $PHPExcel->getActiveSheet()->mergeCells('A2:T2');

        

        //设置表头行高

        $PHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(40);

        $PHPExcel->getActiveSheet()->getRowDimension(2)->setRowHeight(20);

        $PHPExcel->getActiveSheet()->getRowDimension(3)->setRowHeight(30);

        

        //设置表头字体

        $PHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setName('黑体');

        $PHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(20);

        $PHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);

        $PHPExcel->getActiveSheet()->getStyle('A2')->getFont()->setName('宋体');

        $PHPExcel->getActiveSheet()->getStyle('A2')->getFont()->setSize(14);

        $PHPExcel->getActiveSheet()->getStyle('A3:T3')->getFont()->setBold(true);

 

        //设置单元格边框

        $styleArray = array(  

            'borders' => array(  

                'allborders' => array(  

                    //'style' => PHPExcel_Style_Border::BORDER_THICK,//边框是粗的  

                    'style' => PHPExcel_Style_Border::BORDER_THIN,//细边框  

                    //'color' => array('argb' => 'FFFF0000'),  

                ),  

            ),  

        );

        

        //表格宽度

        $PHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(18);//订单编号

        $PHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);//下单时间

        $PHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);//付款时间

        $PHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);//发货时间

        $PHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(18);//发货单号

        $PHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20);//支付方式

        $PHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(10);//配送方式

        $PHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(10);//配送费用

        $PHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(10);//收件人

        $PHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(35);//收货地址

        $PHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(15);//电话

        $PHPExcel->getActiveSheet()->getColumnDimension('L')->setWidth(15);//手机

        $PHPExcel->getActiveSheet()->getColumnDimension('M')->setWidth(25);//邮箱

        $PHPExcel->getActiveSheet()->getColumnDimension('N')->setWidth(15);//货号

        $PHPExcel->getActiveSheet()->getColumnDimension('O')->setWidth(15);//商品名称

        $PHPExcel->getActiveSheet()->getColumnDimension('P')->setWidth(15);//属性

        $PHPExcel->getActiveSheet()->getColumnDimension('Q')->setWidth(10);//价格

        $PHPExcel->getActiveSheet()->getColumnDimension('R')->setWidth(6);//数量

        $PHPExcel->getActiveSheet()->getColumnDimension('S')->setWidth(15);//小计

        $PHPExcel->getActiveSheet()->getColumnDimension('T')->setWidth(15);//应付款金额


        //表格标题

        $PHPExcel->getActiveSheet()->setCellValue('A3', '订单编号');

        $PHPExcel->getActiveSheet()->setCellValue('B3', '下单时间');

        $PHPExcel->getActiveSheet()->setCellValue('C3', '付款时间');

        $PHPExcel->getActiveSheet()->setCellValue('D3', '发货时间');

        $PHPExcel->getActiveSheet()->setCellValue('E3', '发货单号');

        $PHPExcel->getActiveSheet()->setCellValue('F3', '支付方式');

        $PHPExcel->getActiveSheet()->setCellValue('G3', '配送方式');

        $PHPExcel->getActiveSheet()->setCellValue('H3', '配送费用');

        $PHPExcel->getActiveSheet()->setCellValue('I3', '收件人');

        $PHPExcel->getActiveSheet()->setCellValue('J3', '收货地址');

        $PHPExcel->getActiveSheet()->setCellValue('K3', '电话');

        $PHPExcel->getActiveSheet()->setCellValue('L3', '手机');

        $PHPExcel->getActiveSheet()->setCellValue('M3', '邮箱');

        $PHPExcel->getActiveSheet()->setCellValue('N3', '货号');

        $PHPExcel->getActiveSheet()->setCellValue('O3', '商品名称');

        $PHPExcel->getActiveSheet()->setCellValue('P3', '属性');

        $PHPExcel->getActiveSheet()->setCellValue('Q3', '价格');

        $PHPExcel->getActiveSheet()->setCellValue('R3', '数量');

        $PHPExcel->getActiveSheet()->setCellValue('S3', '小计');

        $PHPExcel->getActiveSheet()->setCellValue('T3', '商品总金额');

 

        $hang = 4; 

        foreach ($order_sn_list as $order_sn) {

            /* 取得订单信息 */

            $order = order_info(0, $order_sn);

            if (empty($order)) {

                continue;

            }

 

            /* 根据订单是否完成检查权限 */

            if (order_finished($order)) {

                if (!admin_priv('order_view_finished', '', false)) {

                    continue;

                }

            } else {

                if (!admin_priv('order_view', '', false)) {

                    continue;

                }

            }

 

            /* 如果管理员属于某个办事处,检查该订单是否也属于这个办事处 */

            $sql       = "SELECT agency_id FROM " . $ecs->table('admin_user') . " WHERE user_id = '$_SESSION[admin_id]'";

            $agency_id = $db->getOne($sql);

            if ($agency_id > 0) {

                if ($order['agency_id'] != $agency_id) {

                    continue;

                }

            }

 

            /* 取得用户名 */

            if ($order['user_id'] > 0) {

                $user = user_info($order['user_id']);

                if (!empty($user)) {

                    $order['user_name'] = $user['user_name'];

 

                }

            }

 

            /* 取得区域名 */

            $sql             = "SELECT concat(IFNULL(c.region_name, ''), '  ', IFNULL(p.region_name, ''), " . "'  ', IFNULL(t.region_name, ''), '  ', IFNULL(d.region_name, '')) AS region " . "FROM " . $ecs->table('order_info') . " AS o " . "LEFT JOIN " . $ecs->table('region') . " AS c ON o.country = c.region_id " . "LEFT JOIN " . $ecs->table('region') . " AS p ON o.province = p.region_id " . "LEFT JOIN " . $ecs->table('region') . " AS t ON o.city = t.region_id " . "LEFT JOIN " . $ecs->table('region') . " AS d ON o.district = d.region_id " . "WHERE o.order_id = '$order[order_id]'";

            $order['region'] = $db->getOne($sql);

            

            /* 其他处理 */

            $order['order_time']    = local_date($_CFG['time_format'], $order['add_time']);

            $order['pay_time']      = $order['pay_time'] > 0 ? local_date($_CFG['time_format'], $order['pay_time']) : $_LANG['ps'][PS_UNPAYED];

            $order['shipping_time'] = $order['shipping_time'] > 0 ? local_date($_CFG['time_format'], $order['shipping_time']) : $_LANG['ss'][SS_UNSHIPPED];

            $order['status']        = $_LANG['os'][$order['order_status']] . ',' . $_LANG['ps'][$order['pay_status']] . ',' . $_LANG['ss'][$order['shipping_status']];

            $order['invoice_no']    = $order['shipping_status'] == SS_UNSHIPPED || $order['shipping_status'] == SS_PREPARING ? $_LANG['ss'][SS_UNSHIPPED] : $order['invoice_no'];

 

            /* 此订单的发货备注(此订单的最后一条操作记录) */

            $sql                   = "SELECT action_note FROM " . $ecs->table('order_action') . " WHERE order_id = '$order[order_id]' AND shipping_status = 1 ORDER BY log_time DESC";

            $order['invoice_note'] = $db->getOne($sql);


            $shuliang = 0;

 

            /* 取得订单商品 */

            $sql        = "SELECT o.*, g.goods_number AS storage, o.goods_attr, IFNULL(b.brand_name, '') AS brand_name " . "FROM " . $ecs->table('order_goods') . " AS o " . "LEFT JOIN " . $ecs->table('goods') . " AS g ON o.goods_id = g.goods_id " . "LEFT JOIN " . $ecs->table('brand') . " AS b ON g.brand_id = b.brand_id " . "WHERE o.order_id = '$order[order_id]' ";

            $res        = $db->query($sql);

            $shuliang   = 0;

            $chanpin    = $hang;

            while ($row = $db->fetchRow($res)) {

                $shuliang = $shuliang + 1;

                /* 虚拟商品支持 */

                if ($row['is_real'] == 0) {

                    /* 取得语言项 */

                    $filename = ROOT_PATH . 'plugins/' . $row['extension_code'] . '/languages/common_' . $_CFG['lang'] . '.php';

                    if (file_exists($filename)) {

                        include_once($filename);

                        if (!empty($_LANG[$row['extension_code'] . '_link'])) {

                            $row['goods_name'] = $row['goods_name'] . sprintf($_LANG[$row['extension_code'] . '_link'], $row['goods_id'], $order['order_sn']);

                        }

                    }

                }

 

                $row['formated_subtotal']    = price_format($row['goods_price'] * $row['goods_number']);

                $row['formated_goods_price'] = price_format($row['goods_price']);

                

                //var_dump($order);die;

                //输出订单的商品,由于可能一个人购买多个商品,所以在这先输出了

                $PHPExcel->getActiveSheet()->setCellValue('N' . $chanpin, $row['goods_sn']);

                $PHPExcel->getActiveSheet()->setCellValue('O' . $chanpin, $row['goods_name']);

                $PHPExcel->getActiveSheet()->setCellValue('P' . $chanpin, $row['goods_attr']);

                $PHPExcel->getActiveSheet()->setCellValue('Q' . $chanpin, $row['goods_price']);

                $PHPExcel->getActiveSheet()->setCellValue('R' . $chanpin, $row['goods_number']);

                $PHPExcel->getActiveSheet()->setCellValue('S' . $chanpin, $row['formated_subtotal']);


                $chanpin      = $chanpin + 1;

            }


            for ($kk = $hang; $kk < ($hang + $shuliang); $kk++) {

                //合并单元格

                $PHPExcel->getActiveSheet()->mergeCells('A' . $hang . ':A' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('B' . $hang . ':B' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('C' . $hang . ':C' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('D' . $hang . ':D' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('E' . $hang . ':E' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('F' . $hang . ':F' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('G' . $hang . ':G' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('H' . $hang . ':H' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('I' . $hang . ':I' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('J' . $hang . ':J' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('K' . $hang . ':K' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('L' . $hang . ':L' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('M' . $hang . ':M' . $kk);

                $PHPExcel->getActiveSheet()->mergeCells('T' . $hang . ':T' . $kk);

            }

            $PHPExcel->getActiveSheet()->setCellValue('A' . ($hang), $order['order_sn']." ");//加个空格,防止时间戳被转换

            $PHPExcel->getActiveSheet()->setCellValue('B' . ($hang), $order['order_time']);

            $PHPExcel->getActiveSheet()->setCellValue('C' . ($hang), $order['pay_time']);

            $PHPExcel->getActiveSheet()->setCellValue('D' . ($hang), $order['shipping_time']);

            $PHPExcel->getActiveSheet()->setCellValue('E' . ($hang), $order['invoice_no']." ");

            $PHPExcel->getActiveSheet()->setCellValue('F' . ($hang), $order['pay_name']);

            $PHPExcel->getActiveSheet()->setCellValue('G' . ($hang), $order['shipping_name']);

            $PHPExcel->getActiveSheet()->setCellValue('H' . ($hang), $order['shipping_fee'].'元');

            $PHPExcel->getActiveSheet()->setCellValue('I' . ($hang), $order['consignee']);

            $PHPExcel->getActiveSheet()->setCellValue('J' . ($hang), str_replace(" ","",$order['region']).$order['address']);

            $PHPExcel->getActiveSheet()->setCellValue('K' . ($hang), $order['tel']);

            $PHPExcel->getActiveSheet()->setCellValue('L' . ($hang), $order['mobile']);

            $PHPExcel->getActiveSheet()->setCellValue('M' . ($hang), $order['email']);

            $PHPExcel->getActiveSheet()->setCellValue('T' . ($hang), $order['formated_goods_amount']);

            

            $hang = $hang + $shuliang;

        }

        //设置单元格边框

        $PHPExcel->getActiveSheet()->getStyle('A1:T'.$hang)->applyFromArray($styleArray);

        //设置自动换行

        $PHPExcel->getActiveSheet()->getStyle('A4:T'.$hang)->getAlignment()->setWrapText(true);

        //设置字体大小

        $PHPExcel->getActiveSheet()->getStyle('A4:T'.$hang)->getFont()->setSize(12);

        //垂直居中

        $PHPExcel->getActiveSheet()->getStyle('A1:T'.$hang)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

        //水平居中

        $PHPExcel->getActiveSheet()->getStyle('A1:T'.$hang)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);


        $Writer = PHPExcel_IOFactory::createWriter($PHPExcel, 'Excel5');

        $Writer->save(str_replace('.php', '.xls', __FILE__));

        $url = "order.xls";

        ecs_header("Location: $url\n");

        exit;

    }

    /* 导出订单功能结束 */

到这里就能看到效果了,更新下缓存,在订单列表页部分,下面的批量操作就能找到对应的按钮操作咯。是不是很方便。啥。。你说要勾选,不够全。。。。其实EC支持修改翻页数量的,这个就解决啦。

同类推荐

百度地图WEB API报错:APP Referer校验失败百度地图WEB API报错:APP Referer校验失败
微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘
关于ios/iphone/ipad 网页不能自动播放视频、音频的解决方案 mediaPlaybackRequiresUserAction  和 解决iphone/ipad视频播放单独弹出问题webkit-playsinline/allowsInlineMediaPlayback关于ios/iphone/ipad 网页不能自动播放视频、音频的解决方案 mediaPlaybackRequiresUserAction 和 解决iphone/ipad视频播放单独弹出问题webkit-playsinline/allowsInlineMediaPlayback
web app iphone4 iphone5 iphone6 响应式布局 适配代码web app iphone4 iphone5 iphone6 响应式布局 适配代码
PHP 判断是蜘蛛(搜索引擎)来访PHP 判断是蜘蛛(搜索引擎)来访
PHP版 P2P借贷公式算法函数大全 平息/等额本金/等额本息/先息后本/混合型PHP版 P2P借贷公式算法函数大全 平息/等额本金/等额本息/先息后本/混合型
iPhone iPad HTML5网页不能自动播放AUDIO音频、VIDEO视频 原因iPhone iPad HTML5网页不能自动播放AUDIO音频、VIDEO视频 原因
jQuery获得页面元素(div、table等)页面中的相对位置(position)和绝对位置(offset)jQuery获得页面元素(div、table等)页面中的相对位置(position)和绝对位置(offset)
ECSHOP 订单状态、支付状态、配送状态 相关程序文件、变量、常量 整理说明ECSHOP 订单状态、支付状态、配送状态 相关程序文件、变量、常量 整理说明
Discuz 用户整合 免激活 同步登录 解决方法Discuz 用户整合 免激活 同步登录 解决方法