PHPExcel使用以及所遇見的坑
一、Tp5的PHPExcel安裝
composer下載 composer require phpoffice/phpexcel
文件存儲位置 vendor/phpofice/phpexcel
二、tp5使用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已經有了,那麼就會出現衝突,報這個偏移量的錯誤。
三、PHPExcel導出代碼以及問題
我做的是單獨吧導出封裝起來了,使用的是調用方式
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了