PhpSpreadsheet是PHPExcel的下一个版本。它打破了兼容性,大大提高了代码库质量(命名空间,PSR合规性,最新PHP语言功能的使用等)。
由于所有努力都转移到了PhpSpreadsheet,因此将不再维护PHPExcel。PHPExcel,补丁和新功能的所有贡献都应该针对PhpSpreadsheet开发分支。
说明:由于PHPExcel已更名phpspreadsheet,PHPExcel已不再更新,兼容新版本PHP会存在某些问题,建议升级到PHPSpreadsheet。
PHPExcel已经被废弃在PHP7.2中已经无法获取更新,官方重新开了一个新包phpspreadsheet
环境及版本:ThinkPHP5.1.24、PHP7.2.8、Nginx1.15.3
功能实现:使用phpspreadsheet导出Excel、导入Excel返回数组数据
安装说明:请先使用composer安装依赖:composer install
在线地址:http://demo.linzening.club/
Git地址:https://gitee.com/linzening/newthink
重要的事情说N遍,建议使用 phpspreadsheet
composer安装
composer require phpoffice/phpspreadsheet
安装好之后
<!-- Excle导入 开始 -->
<form action="/admin/market/csj_upExcle" method="post" enctype="multipart/form-data" class="layui-form layui-form-pane form-search dd1">
<div class="layui-form-item layui-inline">
<label class="layui-form-label">导入文件</label>
<div class="layui-input-inline" style="width: 160px;">
<input name="csjexclefile" class="layui-input" type="file">
</div>
<input type="hidden" name="now_time" class="csj_date" value=""><div class="layui-input-inline" style="width: 100px;">
<input class="layui-input csjSubmit" type="submit" value="上传" style="width: 55px;">
</div></div>
</form>
只需要看form表单中input-name即可,其他的是 layui 不用管,提交表单之后 后台
<?php
namespace app\admin\controller;
use controller\BasicAdmin;use think\Db;use PHPExcel_IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use think\Loader;
use service\AliyunLogService;
/**
* 大盘总览
* Class Market
* @package app\admin\controller
*/
class Index extends BasicAdmin
{public function csj_upExcle()
{
header("content-type:text/html;charset=utf-8");
$file = request()->file('csjexclefile');
//将文件保存到public/uploads目录下面
$info = $file->move('./uploads');
if ($info) {
//获取上传到后台的文件名
$fileName = $info->getSaveName();
//获取文件路径.
$filePath =__DIR__."/../../../uploads" . DIRECTORY_SEPARATOR . $fileName;
//获取文件后缀
$suffix = $info->getExtension();
// 有Xls和Xlsx和Cvs格式三种
if ($suffix=="xls")
{
$reader = IOFactory::createReader('Xls');
}elseif ($suffix=="xlsx")
{
$reader = IOFactory::createReader('Xlsx');
}elseif ($suffix=="csv")
{
$reader = IOFactory::createReader('Csv');
}
} else {
return "<script>alert('文件过大或格式不正确导致上传失败-_-!');window.history.back(-1);</script>";
}
//如果是cvs文件则不走PhpSpreadsheet
if ($suffix=="csv")
{
$handle = fopen($filePath,'r');
if (!$handle)
{
return "<script>alert('读取文件失败-_-!');window.history.back(-1);</script>";
}
//不取第一个集合(第一个集合是主题)
$j = 0;
//新数组下标从0开始
$k = 0;
$new_insert_data = [];
while(($data = fgetcsv($handle)) !== false)
{
for ($i = 0; $i < count($data); $i++) {
$data[$i] = iconv('gbk', 'utf-8', $data[$i]);
}
if ($j>0)
{
if (in_array($data[1],$gameArr))
{
$new_insert_data[$k]['game_name'] = $data[1];
$new_insert_data[$k]['date'] = date("Y-m-d",strtotime($data[0]));
$new_insert_data[$k]['channel'] = $data[2];
$new_insert_data[$k]['c_income'] = $data[3];
$new_insert_data[$k]['c_impel_income'] = $data[4];
$new_insert_data[$k]['c_information_income'] = $data[5];
$new_insert_data[$k]['c_all_video_income'] = $data[6];
$new_insert_data[$k]['c_start_video_income'] = $data[7];
$new_insert_data[$k]['c_insert_video_income'] = $data[8];
$new_insert_data[$k]['c_banner_income'] = $data[9];$k++;
}
}
$j++;
}
}else{
//载入excel文件
$excel = $reader->load($filePath);
//读取第一张表
$sheet = $excel->getSheet(0);
//var_dump($sheet);die();
//获取总行数
$row_num = $sheet->getHighestRow();
//获取总列数
$col_num = $sheet->getHighestColumn();
$insert_data = [];
for ($i = 2; $i <= $row_num; $i++) {
$game_name = $excel->getActiveSheet()->getCell("B" . $i)->getValue();
if (in_array($game_name,$gameArr))
{$insert_data[$i]['date'] = gmdate('Y-m-d',intval(($excel->getActiveSheet()->getCell("A" . $i)->getValue() - 25569) * 3600 * 24));
$insert_data[$i]['game'] = $excel->getActiveSheet()->getCell("B" . $i)->getValue();
$insert_data[$i]['chel'] = $excel->getActiveSheet()->getCell("C" . $i)->getValue();
$insert_data[$i]['c_me'] = $excel->getActiveSheet()->getCell("D" . $i)->getValue();
$insert_data[$i]['c_icome'] = $excel->getActiveSheet()->getCell("E" . $i)->getValue();
$insert_data[$i]['c_inincome'] = $excel->getActiveSheet()->getCell("F" . $i)->getValue();
$insert_data[$i]['c_alincome'] = $excel->getActiveSheet()->getCell("G" . $i)->getValue();
$insert_data[$i]['c_stacome'] = $excel->getActiveSheet()->getCell("H" . $i)->getValue();
$insert_data[$i]['c_ins_income'] = $excel->getActiveSheet()->getCell("I" . $i)->getValue();
$insert_data[$i]['c_e'] = $excel->getActiveSheet()->getCell("J" . $i)->getValue();
$insert_data[$i]['c_come'] = $excel->getActiveSheet()->getCell("K" . $i)->getValue();
}
}
if (empty($insert_data)) {
return "<script>alert('数据解析失败,请检查Excle序列号是否连续/联系管理员!');window.history.back(-1);</script>";
}
$new_insert_data = array_values($insert_data);
}
//入库就好了
$res = $this->insertCsj();
if ($res)
{
return "<script>alert('导入成功!');window.history.back(-1);</script>";
}
}
}
我这边没有导入cvs结尾的excle表格没有走 PhpSpreadsheet 因为中文读取为空。可能是我的表哥有问题吧。
我的表格这个样子