composer下载 composer require phpoffice/phpexcel
文件存储位置 vendor/phpofice/phpexcel
不多说废话,直接上代码。
public function createExcel()
{
// 接收文件
$inputdata = $this->request->file('file');
//上传文件
$info = $inputdata->validate(['size'=>1048576,'ext'=>'xls,xlsx'])->move( './uploads');
if($info){
//获取上传到后台的文件名
$fileName = $info->getSaveName();
//获取文件路径
$filePath = Env::get('root_path').'public'.DIRECTORY_SEPARATOR.'uploads'.DIRECTORY_SEPARATOR.$fileName;
//获取文件后缀
$suffix = $info->getExtension();
//判断哪种类型
if($suffix=="xlsx"){
$reader = \PHPExcel_IOFactory::createReader('Excel2007');
}else{
$reader = PHPExcel_IOFactory::createReader('Excel5');
}
}else{
$this->error('文件过大或格式不正确导致上传失败-_-!');
}
// 载入excel文件
$excel = $reader->load($filePath,$encode='utf-8');
//读取第一张表
$sheet = $excel->getSheet(0)->toArray();
//获取总行数
foreach ($sheet as $k=>$v){
//$data[$k]["id"]=$v[0];//单号 ****************
$data[$k]["userid"]=$v[1];//类型名称
$data[$k]["cardid"]=$v[2];
$data[$k]["username"]=$v[3];
$data[$k]["ruly"]=$v[4];
$data[$k]["time"]=time();
}
// 添加数据
for ($i = 1; $i < count($data); $i ++) {
$res[] = $data[$i];
//将数据保存到数据库
}
$result = $this->guest->insertAll($res);
if ($result) {
return true;
} else {
return false;
}
}
1、看代码的时候注意一下那个 ******** 那个地方就会遇见添加Excel的第一个坑,这个坑就是 rying to access array offset on value of type int
因为我们在创建数据库时id时自增张int型,然后上传时候时数据,当我们的数据库中的id已经有了,那么就会出现冲突,报这个偏移量的错误。
我做的是单独吧导出封装起来了,使用的是调用方式
public function exportExcel($expTitle,$expCellName,$expTableData){
$xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称
$fileName = $xlsTitle;//or $xlsTitle 文件名称可根据自己情况设定
$cellNum = count($expCellName);
$dataNum = count($expTableData);
$objPHPExcel = new \PHPExcel();
$cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');
$objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格
// $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.' Export time:'.date('Y-m-d H:i:s'));
for($i=0;$i<$cellNum;$i++){
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i][1]);
}
// Miscellaneous glyphs, UTF-8
for($i=0;$i<$dataNum;$i++){
for($j=0;$j<$cellNum;$j++){
$objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3), $expTableData[$i][$expCellName[$j][0]]);
}
}
//$filePath = "/Users/shuaibi/Desktop/".$fileName.".xlsx"; *********
// halt($filePath); ***********
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;charset=UTF-8");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header("Content-Disposition:attachment;filename=" . $fileName . ".xlsx");
header("Content-Transfer-Encoding:binary");
$PHPWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$PHPWriter->save('php://output'); //表示在$path路径下面生成demo.xlsx文件
#释放内存
unset($PHPWriter);
unset($objPHPExcel);
return 1;
}
public function dchis(){
$xlsName = "入场历史数据".date("m-d His");
$history = new History();
$xlsCell = array(
array('userid','UserID'),
array('site','会场名称'),
array('time','扫描时间'),
array('static','进出场'),
);
/*
$xlsCell = array(
array('userid',=>'123'),
array('site'=>'会场1231'),
array('time'=>time()),
array('static'=>'进场'),
);
*/
$data = $history->select();
$xlsname=[];
foreach ($data as $key => $val){
$xlsname[] = [
"userid" => $val['userid'],
"site" => $val['site'],
"time" => date("Y-m-d H:i",$val['time']),
"static" => $val['static'],
];
}
$this->exportExcel($xlsName,$xlsCell,$xlsname);
// return apiArr(config("status.success") , "成功导出!");
}
1、数据导出时遇见不清楚的错误的时候,首先创建虚拟数据,也就是写死数据,比如 **/* */**中的测试代码一样,看一下能不能成功导出。
2、这个问题,也是我测试了好久的问题。如果你使用ajax调用导出,他不会使用浏览器下载,回报一个下图错误
其实这个错误很好修改
** 使用a标签 **
** 使用a标签 **
** 使用a标签 **
** 使用a标签 **
** 使用a标签 **
这个错误真的让我修改了满满1天。我是真的fo了