thinkphp使用phpspreadsheet导入导出数据到excel,本文以composer的方式安装phpspreadsheet,并以基于think php的thinkcmf进行演示,并附有代码
一、安装依赖包 phpspreadsheet
使用composer的方式安装phpspreadsheet,thinkcmf会自动引入
- 安装composer composer安装教程
- 在项目根目录执行如下命令,用以安装 phpspreadsheet
composer require phpoffice/phpspreadsheet
二、开始使用
excel导出
- 在相应控制器中use
use phpoffice\phpspreadsheet\spreadsheet;
use phpoffice\phpspreadsheet\writer\xlsx;
- 定义导出函数:
/**
* 导出excel表
* $data:要导出excel表的数据,接受一个二维数组
* $name:excel表的表名
* $head:excel表的表头,接受一个一维数组
* $key:$data中对应表头的键的数组,接受一个一维数组
* 备注:此函数缺点是,表头(对应列数)不能超过26;
*循环不够灵活,一个单元格中不方便存放两个数据库字段的值
*/
public function outdata($name='测试表', $data=[], $head=[], $keys=[])
{
$count = count($head); //计算表头数量
$spreadsheet = new spreadsheet();
$sheet = $spreadsheet->getactivesheet();
for ($i = 65; $i < $count 65; $i ) { //数字转字母从65开始,循环设置表头:
$sheet->setcellvalue(strtoupper(chr($i)) . '1', $head[$i - 65]);
}
/*--------------开始从数据库提取信息插入excel表中------------------*/
foreach ($data as $key => $item) { //循环设置单元格:
//$key 2,因为第一行是表头,所以写到表格时 从第二行开始写
for ($i = 65; $i < $count 65; $i ) { //数字转字母从65开始:
$sheet->setcellvalue(strtoupper(chr($i)) . ($key 2), $item[$keys[$i - 65]]);
$spreadsheet->getactivesheet()->getcolumndimension(strtoupper(chr($i)))->setwidth(20); //固定列宽
}
}
header('content-type: application/vnd.ms-excel');
header('content-disposition: attachment;filename="' . $name . '.xlsx"');
header('cache-control: max-age=0');
$writer = new xlsx($spreadsheet);
$writer->save('php://output');
//删除清空:
$spreadsheet->disconnectworksheets();
unset($spreadsheet);
exit;
}
- 开始导出
调用函数导出即可,如:
//要导出的数据,二维
$data = [
['id'=>1,'name'=>'eyunzhu'],
['id'=>2,'name'=>'忆云竹']
];
$head = ['id','name'];//设置表头
$keys = ['id','name'];//数据中表头对应的字段,用于读取相应数据
$this->outdata('导出测试', $data, $head, $keys);
excel导入
- 在相应控制器中use
//导入引入
//use phpoffice\phpspreadsheet\reader\xls;
use phpoffice\phpspreadsheet\iofactory;
use phpoffice\phpspreadsheet\cell\coordinate;
// use phpoffice\phpspreadsheet\worksheet\pagesetup;
// use phpoffice\phpspreadsheet\cell\datatype;
// use phpoffice\phpspreadsheet\style\fill;
// use phpoffice\phpspreadsheet\style\color;
// use phpoffice\phpspreadsheet\style\alignment;
// use phpoffice\phpspreadsheet\style\border;
// use phpoffice\phpspreadsheet\style\numberformat;
- 自定义导入函数
函数传入一个本地excel文件,返回二维数组数据
/**
* 使用phpexecl导入
*
* @param string $file 文件地址
* @param int $sheet 工作表sheet(传0则获取第一个sheet)
* @param int $columncnt 列数(传0则自动获取最大列)
* @param array $options 操作选项
* array mergecells 合并单元格数组
* array formula 公式数组
* array format 单元格格式数组
*
* @return array
* @throws exception
*/
function importexecl($file = '', $sheet = 0, $columncnt = 0, &$options = [])
{
try {
/* 转码 */
$file = iconv("utf-8", "gb2312", $file);
if (empty($file) or !file_exists($file)) {
throw new \exception('文件不存在!');
}
/** @var xlsx $objread */
$objread = iofactory::createreader('xlsx');
if (!$objread->canread($file)) {
/** @var xls $objread */
$objread = iofactory::createreader('xls');
if (!$objread->canread($file)) {
throw new \exception('只支持导入excel文件!');
}
}
/* 如果不需要获取特殊操作,则只读内容,可以大幅度提升读取excel效率 */
empty($options) && $objread->setreaddataonly(true);
/* 建立excel对象 */
$obj = $objread->load($file);
/* 获取指定的sheet表 */
$currsheet = $obj->getsheet($sheet);
if (isset($options['mergecells'])) {
/* 读取合并行列 */
$options['mergecells'] = $currsheet->getmergecells();
}
if (0 == $columncnt) {
/* 取得最大的列号 */
$columnh = $currsheet->gethighestcolumn();
/* 兼容原逻辑,循环时使用的是小于等于 */
$columncnt = coordinate::columnindexfromstring($columnh);
}
/* 获取总行数 */
$rowcnt = $currsheet->gethighestrow();
$data = [];
/* 读取内容 */
for ($_row = 1; $_row <= $rowcnt; $_row ) {
$isnull = true;
for ($_column = 1; $_column <= $columncnt; $_column ) {
$cellname = coordinate::stringfromcolumnindex($_column);
$cellid = $cellname . $_row;
$cell = $currsheet->getcell($cellid);
if (isset($options['format'])) {
/* 获取格式 */
$format = $cell->getstyle()->getnumberformat()->getformatcode();
/* 记录格式 */
$options['format'][$_row][$cellname] = $format;
}
if (isset($options['formula'])) {
/* 获取公式,公式均为=号开头数据 */
$formula = $currsheet->getcell($cellid)->getvalue();
if (0 === strpos($formula, '=')) {
$options['formula'][$cellname . $_row] = $formula;
}
}
if (isset($format) && 'm/d/yyyy' == $format) {
/* 日期格式翻转处理 */
$cell->getstyle()->getnumberformat()->setformatcode('yyyy/mm/dd');
}
$data[$_row][$cellname] = trim($currsheet->getcell($cellid)->getformattedvalue());
if (!empty($data[$_row][$cellname])) {
$isnull = false;
}
}
/* 判断是否整行数据为空,是的话删除该行数据 */
if ($isnull) {
unset($data[$_row]);
}
}
return $data;
} catch (\exception $e) {
throw $e;
}
}
- 导入实例
//$file为本地文件地址
$file = "upload/1.xlsx";
$data = $this->importexecl($file);
dump($data);
//得到了excel中的数据,可进行插入数据库等操作
mark
提交评论
提交评论
--login s
提交评论