导入分两个大的步骤
一、通过 ajax/upload 上传文件,这部分会读取到extra/upload.php 里面的相关配置
二、导入数据库,这一项分为以下几个部分:
1、第一部分:实例化reader
也就是根据文件后缀来判断该用哪个类去读取该文件,其中csv的文件涉及编码问题,需要转换为utf8,所有上面有一大段的处理代码。
if ($ext === 'csv') { $file = fopen($filePath, 'r'); $filePath = tempnam(sys_get_temp_dir(), 'import_csv'); $fp = fopen($filePath, "w"); $n = 0; while ($line = fgets($file)) { $line = rtrim($line, "nr "); $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']); if ($encoding != 'utf-8') { $line = mb_convert_encoding($line, 'utf-8', $encoding); } if ($n == 0 || preg_match('/^".*"$/', $line)) { fwrite($fp, $line . "n"); } else { fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . ""n"); } $n++; } fclose($file) || fclose($fp); $reader = new Csv();} elseif ($ext === 'xls') { $reader = new Xls();} else { $reader = new Xlsx();}
2、第二部分:建立文件首行标题与数据库字段对应关系数组
$fieldArr = ['名字'=>'name','年龄'=>'age','性别'=>'sex']
$importHeadType = isset($this->importHeadType) ? $this->importHeadType : 'comment';$table = $this->model->getQuery()->getTable();$database = thinkConfig::get('database.database');$fieldArr = [];$list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]);foreach ($list as $k => $v) { if ($importHeadType == 'comment') { $fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME']; } else { $fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME']; }}
也可以不按照它这样,直接自定义,写死
3、第三部分:加载文件,读取数据,组装数据
先读取第一行的标题,例如:$fields = ['名字','年龄','性别'] 然后从第二行读取数据,例如:$values = ['test',18,'男'] 接着用array_combine 合并成这样的数据 ['名字'=>'test','年龄'=>18,'性别'=>'男'] 再根据第二部分的$fieldArr进行组装数据为:['name'=>'test','age'=>18,'sex'=>'男'] 最后将这条数据插入$insert 数组
$currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表$allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号$allRow = $currentSheet->getHighestRow(); //取得一共有多少行$maxColumnNumber = Coordinate::columnIndexFromString($allColumn);$fields = [];for ($currentRow = 1; $currentRow <= 1; $currentRow++) { for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $fields[] = $val; }}for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) { $values = []; for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $values[] = is_null($val) ? '' : $val; } $row = []; $temp = array_combine($fields, $values); foreach ($temp as $k => $v) { if (isset($fieldArr[$k]) && $k !== '') { $row[$fieldArr[$k]] = $v; } } if ($row) { $insert[] = $row; }}
4、第四部分:插入数据库
第三步生成的$insert 数组插入数据库
$this->model->saveAll($insert);
理解了导入的原理,你就可以再这过程中自行修改某些部分的内容。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。