介绍
PHP开发中会遇到导入导出表格的功能,特别是电商平台,以前用的PHPExcel 作者已经不再更新和维护了,推荐使用PhpSpreadsheet读取和写入Excel。接下来博主将介绍如何使用
提前准备
要使用PhpSpreadsheet需要满足以下条件:
PHP5.6或更高版本,推荐PHP7.0(博主测试的时候php7.0导入导出是没有问题的,php7.3导出是打不开的)
支持php_zip扩展
支持php_xml扩展
支持php_gd2扩展
PHP导入
先新建个测试表格,内容如下
建库
然后新建个测试数据库excel 新建表 表的DDL语句如下
CREATE TABLE `data` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL COMMENT '标题',
`content` varchar(255) NOT NULL COMMENT '内容',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
安装PhpSpreadsheet
开始安装利用composer安装PhpSpreadsheet
composer require phpoffice/phpspreadsheet
编写代码
#数据库配置
require_once '../src/conf.php';
$file = $_FILES['file']['tmp_name'];
# 载入composer自动加载文件
require '../vendor/autoload.php';
# 载入方法库
require '../src/function.php';
# 创建读操作
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
# 打开文件、载入excel表格
$spreadsheet = $reader->load($file);
# 获取活动工作薄
$sheet = $spreadsheet->getActiveSheet();
# 获取总列数
$highestColumn = $sheet->getHighestColumn();
# 获取总行数
$highestRow = $sheet->getHighestRow();
# 列数 改为数字显示
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
// echo $highestRow;
$sql = "INSERT INTO data (id,title,content) VALUES ";
// echo $highestRow;
for($a=2;$a<=$highestRow;$a++){
$id = $sheet->getCellByColumnAndRow(1,$a)->getValue();
$title = $sheet->getCellByColumnAndRow(2,$a)->getValue();
$content = $sheet->getCellByColumnAndRow(3,$a)->getValue();
//转义特殊字符
$title = addslashes($title);
$content = addslashes($content);
//拼接
$itemStr = '( ';
$itemStr .= "'$id','$title','$content'";
$itemStr .= '),';
$sql .= $itemStr;
}
//移除最后一个逗号
$sql = rtrim($sql, ',');
$sql .= ';';
//将拼接好的sql语句插入数据库
$ins = insert($sql);
if($ins){
echo json_encode(['code'=>0,'msg'=>'成功']);
}else{
echo json_encode(['code'=>-2,'msg'=>'失败']);
}
里面有一些函数是博主封装好的,这里的sql语句用的是组装的,不是单条插入的,这样大大提高数据库效率,然后前端页面需要上传,
查看效果
点击导入选择测试的表格进行导入 会看到数据库有内容了
可以看到成功导入了
PHP导出
导出相对于导入简单一点
#数据库配置
require_once '../src/conf.php';
# 载入方法库
require_once '../src/function.php';
$select = fetchAll('select * from data');
if(empty($select)){
exit;
}
# 载入composer自动加载文件
require '../vendor/autoload.php';
# 给类文件的命名空间起个别名
use \PhpOffice\PhpSpreadsheet\Spreadsheet;
# 实例化 Spreadsheet 对象
$spreadsheet = new Spreadsheet();
# 获取活动工作薄
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1','ID');
$sheet->setCellValue('B1','标题');
$sheet->setCellValue('C1','内容');
$sheet->fromArray(
$select,
null,
'A2'
);
// MIME 协议,文件的类型,不设置,会默认html
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// MIME 协议的扩展
header('Content-Disposition:attachment;filename=1.xlsx');
// 缓存控制
header('Cache-Control:max-age=0');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
// php://output 它是一个只写数据流, 允许你以 print 和 echo一样的方式写入到输出缓冲区。
$writer->save('php://output');
点击页面的导出后,浏览器会下载个excel表格
成功下载,安全起见,一般下载的excel是受保护视图打开的,需要编辑,启用编辑即可.这篇博客就简单的讲解了一下php excel的导入导出,博主把实用的部分分享出来,小伙伴要是对表格有其他方面的需求,或者想深入了解这个东西,可以参考
PhpSpreadsheet使用总结
最后博主把打包好的源码和资料放在这里,点击下载
补充:
如果导出excel还是无法打开出现"文件损坏 无法打开",估计是excel保护视图的问题
文件损坏无法打开解决办法
觉得本篇博文对你有帮助可以点个赞或者评论支持一下哦