ThinkPHP6 --phpoffice 导入Excel表格 动态导入

empty的头像
empty
216
composer安装phpoffice

这个方法目前是个笨方法,这个方法严重依赖excel标头对应数据库创建字段的顺序
以后会改进成对表字段的注释

public function excel()
{

$fileExtendName
= substr(strrchr($_FILES['file']["name"], '.'), 1);
$filename = $_FILES['file']['tmp_name'];
if ($fileExtendName == 'xlsx') {
$objReader = IOFactory::createReader('Xlsx');
} else {
$objReader = IOFactory::createReader('Xls');
}
// 启动事务
Db::startTrans();
try {
//载入excel文件
$objPHPExcel = $objReader->load($filename); //$filename可以是上传的表格,或者是指定的表格
$sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet
$highestRow = $sheet->getHighestRow();
//获取总列数
$col_num = $sheet->getHighestColumn();
//定义单元格的表头字母 ps:不够的自己加
$arr = 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', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BH');
//循环$arr的内容
foreach ($arr as $key=>$item){
if ($item==$col_num)
{
//获取索引 与上面的arr做对应
$letter = $key;
}
}
//获取数据库字段
$res = Db::query('show COLUMNS FROM rh_surface');

//筛选出字段
$field = [];
foreach($res as $key=>$vo){
$field[] = $vo['Field'];
}
//获取表格内容
$data = [];
for ($i = 3; $i <= $highestRow; $i++) {
for ($a=0;$a<=$letter;$a++){
//+1的目的 因为第一列是id
$data[$i][$field[$a+1]] = (string)$objPHPExcel->getActiveSheet()->getCell($arr[$a] . $i)->getValue();
}
}
$TransformersModel->saveAll($data1);
// /* list */
Db::commit();
return json(["code" => 1,'message' => '导入成功']);
} catch (\Throwable $t) {
Db::rollback();
return json(["code" => 0,'message' => '导入失败']);
}
}


如果不明原因报错请先注释掉本代码的事务
用户评论
评论列表