thinkphp导入导出excel -j9九游会真人游戏第一品牌

thinkphp使用phpspreadsheet导入导出数据到excel,本文以composer的方式安装phpspreadsheet,并以基于think php的thinkcmf进行演示,并附有代码

一、安装依赖包 phpspreadsheet

使用composer的方式安装phpspreadsheet,thinkcmf会自动引入
  1. 安装composer composer安装教程
  2. 在项目根目录执行如下命令,用以安装 phpspreadsheet
    composer require phpoffice/phpspreadsheet

二、开始使用

excel导出

  1. 在相应控制器中use
use phpoffice\phpspreadsheet\spreadsheet;
use phpoffice\phpspreadsheet\writer\xlsx;
  1. 定义导出函数:
/**
* 导出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;
}
  1. 开始导出
    调用函数导出即可,如:
//要导出的数据,二维
$data = [
    ['id'=>1,'name'=>'eyunzhu'],
    ['id'=>2,'name'=>'忆云竹']
];
$head = ['id','name'];//设置表头
$keys = ['id','name'];//数据中表头对应的字段,用于读取相应数据
$this->outdata('导出测试', $data, $head, $keys);

excel导入

thinkphp导入导出excel
  1. 在相应控制器中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;
  1. 自定义导入函数
    函数传入一个本地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;
    }
}
  1. 导入实例
//$file为本地文件地址
$file = "upload/1.xlsx";
$data = $this->importexecl($file);
dump($data);
//得到了excel中的数据,可进行插入数据库等操作

发表评论 登录

目前评论:3

  • avatar l4v4 2022-12-31 15:46:56

    mark

    • avatar l4v4 2022-12-31 15:49:18
      • avatar yz7z 2022-12-31 15:51:02

        --login s