☞ 背景
- 这两天在开发快递查询的功能时,涉及到了
Excel表导入MySQL
的操作,为了方便后期的快捷使用,在此整理一下PHPExcel
对excel
表导入导出的代码解决步骤,希望能帮到有需要的道友们…
框架:
ThinkPHP5.1
类库:PHPExcel
技能:Composer
,MySql
☞ 前期准备:PHPExcel
类库的获取
第一种方式为:使用
Composer
进行安装; 第二种方式为:直接到【Github·PHPOffice/PHPExcel】下载源包 后者需要注意,将压缩包解压后放到vendor
目录,并且注意路径的正确引入 此处,只做第一种方式的指导参考[建议学会Composer的简单使用,实在是太方便了]
- 进入项目目录,输入命令:
composer require phpoffice/phpexcel
安装成功后,会注意到项目的vendor
目录下,多出了一个phpoffice
文件夹
☞ 如何将 Excel
中的数据导入MySQL
☜
除了参考我展示的步骤,也要注意下我的代码注释哦!
①. excel 文件的整理
首先要求用来导入
MySQL
数据表的excel文件
中的内容要规整,对应于你的数据表
- 鄙人将其放置于目录
public\cms\file\bird_express.xlsx
以我要操作的 excel
表为例,(数据简单,可举一反三,自由拓展):
②. 创建目标数据表
- 以我的简答测试为例,表格设计如下:
③. MTPhpExcel类的使用
- 首先引入所提供源码中的
MTPhpExcel.php
下图即为我创建的 测试入口,主要目的就是为了调用核心方法readExcelFileToArray()
核心处理方法
readExcelFileToArray()
源码见附录
- 运行代码后的结果如下:
☞ 如何将数据导出到Excel
文件 ☜
- 同理,我设计了一个测试方法,主要目的就是为了调用核心方法
outputDataToExcelFile()
核心处理方法
outputDataToExcelFile()
源码见附录
- 运行代码后,可以得到如下的一个
excel
表:
【温馨提示:】
1. 为了代码参考方便,鄙人尽量使其简洁化
所以如果对于某列数据需要字体加粗、居中、变大等各种操作,可自行扩展
2. 当前代码,未做图片格式的展示处理
如有需要可阅读 phpexcel 文档规则,根据目标数据对应性处理即可 ...
☞ 附录
☛ >>>源码下载>>>(正在审核中,稍等…) ☚
- 毕竟主要使用的就是这个
MTPhpExcel
类,如果不需要下载参考excel
数据表,也可直接参考下面的源码
<?php
/**
* Created by PhpStorm.
* User: moTzxx
* Date: 2019/4/21
* Time: 9:24
*/
namespace app\api\Controller;
use think\Db;
class MTPhpExcel
{
/**
* 测试方法 1
* (根据传入的 excel 文件导入MySQL)
* @return array
*/
public function inputMySQLTest()
{
$excel_file_path = "./cms/file/bird_express.xlsx";
$excelArr = $this->readExcelFileToArray($excel_file_path);
$resultArr = [];
//TODO 将获取的数组数据进行优化,并压入目标数组 $resultArr
foreach ($excelArr as $key => $value) {
$resultArr[$key]['name'] = $value[0];
$resultArr[$key]['code'] = $value[1];
}
//var_dump($resultArr);
/**
* TODO 此时进行数据表记录的遍历插入操作即可
* 因为数据量较大,建议使用批量插入的方式
* 以我的业务需求,代码举例如下:
*/
//Db::name('xbird_express')->data($resultArr)->limit(50)->insertAll();
return $resultArr;
}
/**
* 测试方法 2
* (根据得到的的数组数据,导出Excel文件)
*/
public function outputToExcelTest()
{
//测试数据(数组形式),一般来源于数据表查询
$list = [
['name' => '顺丰速运', 'code' => 'SF', 'mark' => '很贵的哦'],
['name' => '百世快递', 'code' => 'HTKY', 'mark' => 'en嗯嗯'],
['name' => '中通快递', 'code' => 'ZTO', 'mark' => '还是挺快的!'],
['name' => '申通快递', 'code' => 'STO', 'mark' => 'God bless you!'],
['name' => '圆通速递', 'code' => 'YTO', 'mark' => '施主您好'],
['name' => '韵达速递', 'code' => 'YD', 'mark' => '大学的记忆'],
['name' => '邮政快递包裹', 'code' => 'YZPY', 'mark' => '听,起风了~'],
];
$headerArr = ['快递名称', '编码', '备注'];
//设置保存的Excel表格名称
$excelTitle = 'moTzxx表格导出测试';
$save_fileUrl = "moTzxx快递公司".date('Ymd-His', time()) . ".xls";
$this->outputDataToExcelFile($list, $headerArr, $excelTitle, $save_fileUrl);
}
/**
* 将得到的数组数据,转化为Excel文件导出
* @param array $list 数组数据
* @param array $headerArr 显示的顶部导航栏
* @param string $excelTitle 表格标题
* @param string $save_fileUrl 构建存储文件,注意扩展名
*/
public function outputDataToExcelFile($list = [], $headerArr = [],
$excelTitle = "", $save_fileUrl = "")
{
//实例化PHPExcel类
$objPHPExcel = new \PHPExcel();
//设置头信息 激活当前的sheet表
$objPHPExcel->setActiveSheetIndex(0);
$keyC = ord('A');
foreach ($headerArr as $head) {
$colKey = chr($keyC);
//TODO 设置表格头(即excel表格的第一行)
$objPHPExcel->getActiveSheet()->setCellValue($colKey . '1', $head);
//设置单元格宽度
$objPHPExcel->getActiveSheet()->getColumnDimension($colKey)->setWidth(20);
$keyC++;
}
$colIndex = 2;
foreach ($list as $key => $rows) {
$colKey2 = ord('A');
foreach ($list[$key] as $keyName => $value) {
$objPHPExcel->getActiveSheet()->setCellValue(chr($colKey2) . $colIndex, $value);
$colKey2++;
}
$colIndex++;
}
//设置当前激活的sheet表格名称;
$objPHPExcel->getActiveSheet()->setTitle($excelTitle);
//设置浏览器窗口下载表格
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition:inline;filename="' . $save_fileUrl . '"');
//生成excel文件
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
//下载文件在浏览器窗口
$objWriter->save('php://output');
exit;
}
/**
* 将读取到的 excel 文件转化为数组数据并返回
* 此处的要求是:
* excel文件的后缀名不要手动改动,一般为 xls、xlsx
* excel文件中的数据尽量整理的跟数据表一样规范
*
* @param $excel_file_path 文件路径,保证能访问到
* @return array
*/
public function readExcelFileToArray($excel_file_path)
{
if (!file_exists($excel_file_path)) {
die('Sorry, file not found!');
} else {
$extension = strtolower(pathinfo($excel_file_path, PATHINFO_EXTENSION));
$objExcel = null;
if ($extension == 'xlsx') {
$objReader = new \PHPExcel_Reader_Excel2007();
$objExcel = $objReader->load($excel_file_path);
} else if ($extension == 'xls') {
$objReader = new \PHPExcel_Reader_Excel5();
$objExcel = $objReader->load($excel_file_path);
} else if ($extension == 'csv') {
$PHPReader = new \PHPExcel_Reader_CSV();
//默认输入字符集
$PHPReader->setInputEncoding('GBK');
//默认的分隔符
$PHPReader->setDelimiter(',');
//载入文件
$objExcel = $PHPReader->load($excel_file_path);
}
$excelArr = $objExcel->getSheet(0)->toArray();
}
return $excelArr;
}
}