thinkphp5中使用excel导出数据表格(包涵图片)

首先使用composer require phpoffice/phpexcel下载安装phpexcel包。

将包放入extend下面。

不附加图片的导出

/**
* 导出excel(不带图片)
* @param string $fileName [description]
* @param [type] $headArr [description]
* @param [type] $data [description]
* @return [type] [description]
*/
public function excelExport($fileName = '', $headArr = [], $data = []) {

$fileName .= "_" . date("Y_m_d", time()) . "_".time().".xls";

Loader::import("PHPExcel.Classes.PHPExcel");
Loader::import("PHPExcel.Drawing");

$objPHPExcel = new PHPExcel;

$objPHPExcel->getProperties();

$key = ord("A"); // 设置表头

foreach ($headArr as $v) {

$colum = chr($key);

$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);

$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);

$key += 1;

}


$column = 2;

$objActSheet = $objPHPExcel->getActiveSheet();

foreach ($data as $key => $rows) { // 行写入

  $span = ord("A");

  foreach ($rows as $keyName => $value) { // 列写入

    $objActSheet->setCellValue(chr($span) . $column, $value);

    $span++;

  }

  $column++;

}

$fileName = iconv("utf-8", "gb2312", $fileName); // 重命名表

$objPHPExcel->setActiveSheetIndex(0); // 设置活动单指数到第一个表,所以Excel打开这是第一个表

header('Content-Type: application/vnd.ms-excel');

header("Content-Disposition: attachment;filename='$fileName'");

header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

//$objWriter->save('php://output'); // 文件通过浏览器下载

exit();
}

控制器方法

public function dcexcel(){
$name='物流信息表';
$header=['商品编号','商品名称','库存数量','商品图'];
/*需要哪张表的数据就查询哪张表的数据*/
$list = db('goods')->limit(1)->select();
$str = array();
foreach ($list as $k => $v) {
/*对应的数据库信息*/
$str[] = [$v['good_sn'],$v['good_name'],$v['store_num'],$v['good_thumb']];
}
$data=$str;
$this->excelExport($name,$header,$data);

}

带图片的导出

/**
* 导出excel表格(带图片)
* @return [type] [description]
*/
function excel_down($data = []){

// 导出Exl
Loader::import("PHPExcel.Classes.PHPExcel");
Loader::import("PHPExcel.Worksheet.Drawing");

$objPHPExcel = new PHPExcel();

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);

$objActSheet = $objPHPExcel->getActiveSheet();

// 水平居中(位置很重要,建议在最初始位置)
$objPHPExcel->setActiveSheetIndex(0)->getStyle('A')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->setActiveSheetIndex(0)->getStyle('B')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->setActiveSheetIndex(0)->getStyle('C')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->setActiveSheetIndex(0)->getStyle('D')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->setActiveSheetIndex(0)->getStyle('E')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

$objActSheet->setCellValue('A1', 'good_sn');
$objActSheet->setCellValue('B1', 'good_name');
$objActSheet->setCellValue('C1', 'store_num');
$objActSheet->setCellValue('D1', 'sales_sum');
$objActSheet->setCellValue('E1', 'good_thumb');

// 设置个表格宽度
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(16);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(12);

// 垂直居中
$objPHPExcel->setActiveSheetIndex(0)->getStyle('A')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->setActiveSheetIndex(0)->getStyle('B')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->setActiveSheetIndex(0)->getStyle('C')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->setActiveSheetIndex(0)->getStyle('D')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->setActiveSheetIndex(0)->getStyle('E')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

foreach($data as $k=>$v){
$k +=2;
$objActSheet->setCellValue('A'.$k, $v['good_sn']);
$objActSheet->setCellValue('B'.$k, $v['good_name']);
$objActSheet->setCellValue('C'.$k, $v['store_num']);
$objActSheet->setCellValue('D'.$k, $v['sales_sum']);

//获取到图片信息
$img =db('goods')->where('good_id = '.$v['good_id'])->field('good_thumb')->find();
// 图片生成
$objDrawing[$k] = new PHPExcel_Worksheet_Drawing();
$objDrawing[$k]->setPath('./uploads/'.$img['good_thumb']);//这里拼接 . 是因为要在根目录下获取
// 设置宽度高度
$objDrawing[$k]->setHeight(80);//照片高度
$objDrawing[$k]->setWidth(80); //照片宽度
/*设置图片要插入的单元格*/
$objDrawing[$k]->setCoordinates('E'.$k);
// 图片偏移距离
$objDrawing[$k]->setOffsetX(12);
$objDrawing[$k]->setOffsetY(12);
$objDrawing[$k]->setWorksheet($objPHPExcel->getActiveSheet());

// 表格高度
$objActSheet->getRowDimension($k)->setRowHeight(80);

}

$fileName = 'duola物流信息表';
$date = date("Y-m-d",time());
$fileName .= "_{$date}.xls";
$fileName = iconv("utf-8", "gb2312", $fileName);
//重命名表
// $objPHPExcel->getActiveSheet()->setTitle('test');
//设置活动单指数到第一个表,所以Excel打开这是第一个表
$objPHPExcel->setActiveSheetIndex(0);
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename="$fileName"");
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output'); //文件通过浏览器下载
// END
}

控制器使用

public function dcexcel(){
/*需要哪张表的数据就查询哪张表的数据*/
$list = db('goods')->limit(1)->select();
$this->excel_down($list);

}