一、getdata.php
<?php
namespace Webadmin\Model;
use ExtendSpace\Excel;
/**
* 导出订单流水
* @return
*/
public function export_bill() {
……
略
……
// 取出数据
$dataBillArr = $this->get_list_bysql($sql);
// 替换数据中的 0 、1 为 是、否
// PHPExcel 有内置的方法处理,但是得到的是 TRUE/FALSE,这里自己处理吧
$this->_formatZero($dataBillArr, array('payflag', 'removeflag'));
// 替换支付状态
foreach ($dataBillArr as $key => $value) {
switch ($value['status_type']) {
case '-1':
$dataBillArr[$key]['status_type'] = '已取消';
break;
case '-2':
$dataBillArr[$key]['status_type'] = '已取消 已退款';
break;
case '0':
$dataBillArr[$key]['status_type'] = '待付款';
break;
case '1':
$dataBillArr[$key]['status_type'] = '待发货';
break;
case '2':
$dataBillArr[$key]['status_type'] = '待收货';
break;
case '3':
$dataBillArr[$key]['status_type'] = '已完成';
break;
case '10':
$dataBillArr[$key]['status_type'] = '退货完成';
break;
case '11':
$dataBillArr[$key]['status_type'] = '退款完成';
break;
default:
$dataBillArr[$key]['status_type'] = '无';
break;
}
}
// 设置要导出的字段及对应的表头名称
$header = array(
array('title'=>'平台订单号', 'field'=>'bill_code', 'type'=>'string', 'autosize'=>true),
array('title'=>'用户帐号', 'field'=>'username', 'type'=>'string', 'autosize'=>true),
array('title'=>'用户昵称', 'field'=>'nickname'),
array('title'=>'支付单号', 'field'=>'pay_code', 'type'=>'string', 'autosize'=>true),
array('title'=>'订单状态', 'field'=>'status_type'),
array('title'=>'是否支付', 'field'=>'payflag'),
array('title'=>'订单是否删除', 'field'=>'removeflag'),
……
略
……
);
// 调用接口,执行 Excel 生成及导出操作
$filename = '订单流水表_' . date('Y年m月d日_His', time());
Excel::export($dataBillArr, $header, $filename);
}
……
略
……
/**
* 将待导出数据中的 0、1 转为 是、否
* @param array &$dataArr 待处理的数据
* @param array $fieldArr 包含是、否的字段
* @return
*/
private function _formatZero(&$dataArr, $fieldArr) {
foreach ($dataArr as $k => $v) {
foreach ($fieldArr as $field) {
if (isset($v[$field])) {
$dataArr[$k][$field] = ($v[$field] == 0) ? '否' : '是';
continue;
}
}
}
// var_dump($dataArr);
}
二、Excel.class.php
<?php
namespace ExtendSpace;
/**
* Class Excel 通用 Excel 接口,处理导出、导出操作
* 使用说明:
* 一、导入
* 待续 。。。
* 二、导出
* use ExtendSpace\Excel;
* .....
* Excel::export($dataArr, $header, $filename);
*
* @package ExtendSpace
* @author xxxxx 2015-08-27 14:07:14
* @version
*/
class Excel {
// private static $objPHPExcel = null;
/**
* 入口文件:导出 Excel
* @param array $data 要导出的数据
* @param array $header 表头及对应的字段设置
* @param string $filename 要保存的文件名
* @return
*/
public static function export($data, $header, $filename='excel_export') {
// 引入 PHPExcel 类库
import('phpexcel.PHPExcel', dirname(__FILE__) . '/', '.php'); // 这里是 TP 特有,可直接用 include 或 require
// 初始化设置
$objPHPExcel = new \PHPExcel();
$objPHPExcel->getProperties()->setCreator('test')->setLastModifiedBy('test'); // 这里设置中文乱码,还没解决
// ->setTitle('这是标题')
// ->setSubject('这是什么')
// ->setDescription('这是描述')
// ->setKeywords('这是关键字')
// ->setCategory('这是目录么');
// var_dump($objPHPExcel->getProperties());exit;
// 获取当前要操作的活动工作表
$objPHPExcel->setActiveSheetIndex(0);
$objActSheet = $objPHPExcel->getActiveSheet();
// 写入表头
foreach ($header as $k => $v) {
$colIndex = self::_getHeaderIndex($k);
$objActSheet->setCellValue($colIndex . '1', $v['title']);
// 列是否需要自动适应宽度
if (!empty($v['autosize'])) {
$objActSheet->getColumnDimension($colIndex)->setAutoSize(true);
}
}
// 写入数据,从第二行开始,第一行是表头
$rowNum = 2;
foreach($data as $rows){ // 遍历数据,获取一行
foreach($header as $kk => $vv){ // 单元格写入
// 获取表头索引
$colIndex = self::_getHeaderIndex($kk);
// 是否指定单元格数据格式
if (!empty($vv['type'])) { // 是
switch ($vv['type']) {
case 'number':
$type = \PHPExcel_Cell_DataType::TYPE_NUMERIC; // 数字
break;
case 'boolean':
$type = \PHPExcel_Cell_DataType::TYPE_BOOL; // 布尔值,0->FALSE;1->TRUE
break;
default:
$type = \PHPExcel_Cell_DataType::TYPE_STRING; // 字符串
break;
}
$objActSheet->setCellValueExplicit($colIndex.$rowNum, $rows[$vv['field']], $type);
} else { // 否,默认常规
$objActSheet->setCellValue($colIndex.$rowNum, $rows[$vv['field']]);
}
}
$rowNum++;
}
// 设置行高度 rownum
// $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(22);
// 设置字体和样式
$objActSheet->getDefaultStyle()->getFont()->setSize(12); // 整体字号
$objActSheet->getStyle('A1:' . self::_getHeaderIndex(count($header)) . '1')->getFont()->setBold(true); // 列标题加粗
// 设置工作表名称
$objActSheet->setTitle('Sheet1');
// 设置 header 头参数
// header("Pragma: public");
// header("Expires: 0");
// header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
// header("Content-Type:application/force-download");
// header("Content-Type:application/vnd.ms-execl");
// header("Content-Type:application/octet-stream");
// header("Content-Type:application/download");;
// header('Content-Disposition:attachment;filename="' . $savedFileName . '"');
// header("Content-Transfer-Encoding:binary");
// 最终输出
$savedFileName = self::_iconv($filename) . '.xls'; // 导出文件名+扩展名
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $savedFileName . '"');
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
// $objWriter->save($savedFileName);
}
/**
* 入口文件:导入 Excel
* @return
*/
public static function import() {
// 引入 PHPExcel 类库
// import('phpexcel.PHPExcel', dirname(__FILE__) . '/', '.php');
}
private static function _init() {
}
/**
* 获取对应的列索引,即:1->A, 2->B, 3->C .....
* 注:根据 Excel 规则,Z 之后列索引为 AA,AB,AC.....
* @param string $num 一个整数值
* @return string
*/
private function _getHeaderIndex($num) {
return \PHPExcel_Cell::stringFromColumnIndex($num);
}
/**
* 字符转换,避免乱码
* @param string $str 待处理的字符
* @return string
*/
private function _iconv($str) {
return iconv('utf-8', 'gb2312', $str);
}
}