基于PhpSpreadsheet类库的数据导出方案
2019-04-17 本文已影响0人
是彬不是杉
前言
我之前有写过一篇使用PHPexcel导出的文章,需要的可以看下:ThinkPHP5+PHPExcel导入导出 那篇文章使用的是旧版本PHPexcel库,目前这个库已经不再维护了,且项目已迁移至PhpSpreadsheet,项目地址https://github.com/PHPOffice/PhpSpreadsheet。所以,本篇文章我分享下使用新版PhpSpreadsheet开发导出功能,演示代码基于thinkphp5。
解读
下载类库
https://wx2.sinaimg.cn/large/0064eL5bly1g1ynrugqwvj30sg0dt7cc.jpg在Composer 中文网 里搜索PHPoffice时,会发现有好几个可用库,细心点可以发现,phpexcel库显示不再维护更新,所以选择下面的
phpoffice/phpspreadsheet
类库。
bash进入项目根目录执行下面命令进行安装
composer require phpoffice/phpspreadsheet
安装完成后,需要在项目中引入类库,如果使用常见框架(如:thinkphp,Laravel...) 在项目根目录中入口文件中引入 vendor/autoload.php
。
这个类库的调用方式于原PHPExcel库的调用方式有所不同,个人感觉相对来说新版库的使用方式比较简单
异常处理
如果是正常导入导出的话按照下载的库里面的示例代码就可以用了,但是万一碰到必须导出大量列的业务场景时,示例中的方法就有点不胜其任了。使用Coordinate类中的stringFromColumnIndex可以解决。调用方法见代码。
Tips:需要注意的一点是,在循环时,如果第一级循环从0
开始的话,其实列是从Z1
开始的,导出后就会出现少列的情况,使用$i+1
即可;第二级循环如果从0开始时,则需要使用$j+1
。这样出来的起始列才是A1
。否则会报错。
代码
//此方法基于新版PHPExcel
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
/**
* excel表格导出
* @param string $fileName 文件名称
* @param array $headArr 表头名称
* @param array $data 要导出的数据
* @author whongbin
*/
function excel_export($fileName = '', $headArr = [], $datas = []) {
foreach($datas as $item) $data[] = array_values($item);
$dataArr[] = $headArr;
$count = count($headArr); //计算表头数量
$spreadsheet = new Spreadsheet();
$spreadsheet->getProperties();
$sheet = $spreadsheet->getActiveSheet();
$fileName .= "_" . date("Ymd", \think\Request::instance()->time()) . ".xlsx";
/*--------------开始从数据库提取信息插入Excel表中------------------*/
for ($a=0; $a < count($data); $a++) {
$dataArr[] = $data[$a];
}
for ($i=0; $i < count($dataArr[0]); $i++) {
for ($j=0; $j < count($dataArr); $j++) {
$coord = Coordinate::stringFromColumnIndex($i+1) . ($j+1);
if (is_numeric($dataArr[$j][$i])) {
if ($dataArr[$j][$i]==0) {
$value = '否';
}else if ($dataArr[$j][$i]==1) {
$value = '是';
}else{
$value = ' '.$dataArr[$j][$i];
}
}else{
$value = $dataArr[$j][$i];
}
$sheet->setCellValue($coord,$value);
}
}
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $fileName);
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
//删除清空:
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
exit;
}