先生成Excel模板,然后导入Excel数据到mysql,每条数据对应图片上传到阿里云

 <?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/9/27
* Time: 13:57
*/ namespace site\admin\model; use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use system\library\AliYunOSS;
use system\library\Unzip; class ProductBatchModel extends \site\admin\component\Model
{ public function add($data){ if (!$this->_validate($data, 'add')) {
return false;
} $languageModel = new LanguageModel();
$categoryModel = new CategoryModel();
$productModel = new ProductModel();
$urlAliasModel = new UrlAliasModel(); if(substr(strrchr($data['excel_file'], '.'), 1)<>'xlsx'){
$this->addError('excel_file', '请上传xlsx格式的Excel文件');
return false;
} $arr_file = explode('com/', $data['excel_file']); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load(DIR_UPLOAD.$arr_file[1]); //载入excel表格 $worksheet = $spreadsheet->getActiveSheet();
$highestRow = $worksheet->getHighestRow(); // 总行数
$highestColumn = $worksheet->getHighestColumn(); // 总列数
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5 $lines = $highestRow - 1;
if ($lines <= 0) {
$this->addError('Excel', 'Excel表格中没有数据');
return false;
} $enableRow = array();
$arr_url = array(); for ($row = 2; $row <= $highestRow; ++$row) { /******************************验证产品型号***********************************/ $model_no = $worksheet->getCellByColumnAndRow(1, $row)->getValue();
if(empty($model_no)){
$this->addError('model_no'.$row, '第'.$row.'行产品型号为空');
}else{
$if_exist = $productModel->getProductByModel($model_no);
if(empty($if_exist)){
$enableRow[] = $row; //新增该行
}
} /******************************验证产品分类***********************************/ $category_name = $worksheet->getCellByColumnAndRow(2, $row)->getValue();
if(empty($category_name)){
$this->addError('category_name'.$row, '第'.$row.'行分类名为空');
}else{
$category = $categoryModel->getCategoryIdByName($category_name);
if(empty($category)){
$this->addError('category_name'.$row, '第'.$row.'行分类名不存在');
}
} $sort_order = $worksheet->getCellByColumnAndRow(3, $row)->getValue();
if(empty($sort_order) || !is_numeric($sort_order)){
$this->addError('sort_order'.$row, '第'.$row.'行排序错误');
} $status = $worksheet->getCellByColumnAndRow(4, $row)->getValue();
if(empty($status) || !is_numeric($status)){
$this->addError('status'.$row, '第'.$row.'行状态错误');
} /******************************验证语言***********************************/ $language_name = $worksheet->getCellByColumnAndRow(5, $row)->getValue();
if(empty($language_name)){
$this->addError('language_name'.$row, '第'.$row.'行语言为空');
}else{
$languages = $languageModel->getSysLanguageByName($language_name);
if(empty($languages)){
$this->addError('languages'.$row, '第'.$row.'行语言不存在');
}
} $name = $worksheet->getCellByColumnAndRow(6, $row)->getValue();
if(empty($name)){
$this->addError('name'.$row, '第'.$row.'行名称为空');
} $keywords = $worksheet->getCellByColumnAndRow(7, $row)->getValue();
if(empty($keywords)){
$this->addError('keywords'.$row, '第'.$row.'行关键词为空');
} $url = $worksheet->getCellByColumnAndRow(10, $row)->getValue();
if(!empty($url)){
if(in_array($url, $arr_url)){
$this->addError('url'.$row, '第'.$row.'行网址重复出现');
}else{
$arr_url[] = $url;
}
} } if($this->hasErrors()){
return false;
} //组装数组
$enableData = array();
foreach ($enableRow as $key => $row) { $model_no = $worksheet->getCellByColumnAndRow(1, $row)->getValue(); //获取分类ID
$category_name = $worksheet->getCellByColumnAndRow(2, $row)->getValue();
$category = $categoryModel->getCategoryIdByName($category_name);
$category_id = $category['category_id']; $sort_order = $worksheet->getCellByColumnAndRow(3, $row)->getValue();
$status = $worksheet->getCellByColumnAndRow(4, $row)->getValue(); //获取语言ID
$language_name = $worksheet->getCellByColumnAndRow(5, $row)->getValue();
$languages = $languageModel->getSysLanguageByName($language_name);
$language_id = $languages['language_id']; $name = $worksheet->getCellByColumnAndRow(6, $row)->getValue();
$keywords = $worksheet->getCellByColumnAndRow(7, $row)->getValue();
$abstract = $worksheet->getCellByColumnAndRow(8, $row)->getValue();
$description = $worksheet->getCellByColumnAndRow(9, $row)->getValue();
$url = $worksheet->getCellByColumnAndRow(10, $row)->getValue();
$meta_title = $worksheet->getCellByColumnAndRow(11, $row)->getValue();
$meta_keyword = $worksheet->getCellByColumnAndRow(12, $row)->getValue();
$meta_description = $worksheet->getCellByColumnAndRow(13, $row)->getValue(); if(!isset($enableData[$model_no])){
$enableData[$model_no] = array(
'product_type_id'=>'',
'model_no'=>$model_no,
'sort_order'=>$sort_order,
'status'=>$status,
'category'=>array($category_id),
'trade'=>'',
'producttradeinfo'=>array()
);
} $enableData[$model_no]['desc'][$language_id] = array(
'description'=>$description,
'name'=>$name,
'abstract'=>$abstract,
'keywords'=>$keywords,
'language_name'=>$language_name,
'meta_title'=>$meta_title,
'meta_keyword'=>$meta_keyword,
'meta_description'=>$meta_description,
'url_alias'=>$url
); } //遍历检测网址
foreach ($enableData as $key => $value){
if(isset($value['desc']) && !empty($value['desc'])){
foreach ($value['desc'] as $k => $v){
$cc = $urlAliasModel->validate(['keyword' => $v['url_alias'], 'language_id' => $k, 'query' => ''],'add');
if($cc==false){
return false;
}
}
}
} //解压缩图片压缩包
$dirPath = DIR_UPLOAD.$this->session->data['site_id'];
$file = $dirPath.'/'.$data['images_file'];
if(!file_exists($file) || (substr(strrchr($file, '.'), 1)<>'zip')){
$this->addError('imageZip', '请上传产品图片压缩包(zip格式)');
return false;
}
$z = new Unzip;
$info = $z->unzip($file, $dirPath.'/', true, false);
if($info){
unlink($file); //删除压缩包
} //获取产品图片
foreach ($enableData as $key => $value){
$enableData[$key]['image'] = $this->_getImage($key,$dirPath.'/'.basename($data['images_file'],'.zip'));
} foreach ($enableData as $key => $value){
try {
$productModel->add($value);
} catch (Exception $e) {
$this->addError('add', $e->getMessage());
return false;
}
}
return true; } /**
* 生成模板
*
* @access public
* @return void
*/
public function createTemplate()
{ $languageModel = new LanguageModel();
$languages = $languageModel->getEnabledLanguages(); $categoryModel = new CategoryModel();
$category = $categoryModel->getRecursionCategory();
$categoryNme = $this->_getCategoryName($category); $columnNum = 3000; $spreadsheet = new Spreadsheet(); /*****************************************设置当前活动页内容***********************************/ $sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', '型号(必填)');
$sheet->setCellValue('B1', '分类名(必填)');
$sheet->setCellValue('C1', '排序(必填,请输入数字)');
$sheet->setCellValue('D1', '状态(必填,1=上架|0=下架)');
$sheet->setCellValue('E1', '语言(必填)');
$sheet->setCellValue('F1', '名称(必填)');
$sheet->setCellValue('G1', '关键词(必填)');
$sheet->setCellValue('H1', '简要描述');
$sheet->setCellValue('I1', '详细描述');
$sheet->setCellValue('J1', '网址');
$sheet->setCellValue('K1', 'seo标题');
$sheet->setCellValue('L1', 'seo关键词');
$sheet->setCellValue('M1', 'seo描述'); //设置相关属性
$sheet->setTitle('Product');
$sheet->getDefaultColumnDimension()->setWidth(30);
$sheet->getStyle('A1:M1')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$sheet->getStyle('A1:M1')->getFill()->getStartColor()->setARGB('FF808080');
$sheet->getStyle('A1:M1')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE); //分类列
for($i=2;$i<=$columnNum;$i++){
$objValidation = $sheet->getDataValidation('B'.$i);
$objValidation -> setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)
-> setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_INFORMATION)
-> setAllowBlank(false)
-> setShowInputMessage(true)
-> setShowErrorMessage(true)
-> setShowDropDown(true)
-> setErrorTitle('输入的值有误')
-> setError('您输入的值不在下拉框列表内')
-> setPrompt('请选择下拉框列表中的值')
-> setFormula1('data!$C$3:$C$'.(count($categoryNme)+2));
} //状态列
for($i=2;$i<=$columnNum;$i++){
$objValidation = $sheet->getDataValidation('D'.$i);
$objValidation -> setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)
-> setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_INFORMATION)
-> setAllowBlank(false)
-> setShowInputMessage(true)
-> setShowErrorMessage(true)
-> setShowDropDown(true)
-> setErrorTitle('输入的值有误')
-> setError('您输入的值不在下拉框列表内')
-> setPrompt('请选择下拉框列表中的值')
-> setFormula1('data!$A$3:$A$4');
} //语言列
for($i=2;$i<=$columnNum;$i++){
$objValidation = $sheet->getDataValidation('E'.$i);
$objValidation -> setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)
-> setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_INFORMATION)
-> setAllowBlank(false)
-> setShowInputMessage(true)
-> setShowErrorMessage(true)
-> setShowDropDown(true)
-> setErrorTitle('输入的值有误')
-> setError('您输入的值不在下拉框列表内')
-> setPrompt('请选择下拉框列表中的值')
-> setFormula1('data!$B$3:$B$'.(count($languages)+2));
} /*******************************************新增一个活动页,放公共数据*********************************/ $spreadsheet->createSheet();
$spreadsheet->setActiveSheetIndex(1);
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('data');
$sheet->getDefaultColumnDimension()->setWidth(25);
$sheet->mergeCells('A1:C1');
$styleArray = [
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
],
];
$sheet->getStyle('A1')->applyFromArray($styleArray);
$sheet->getRowDimension('1')->setRowHeight(35); $sheet->getStyle('A1')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$sheet->getStyle('A1')->getFill()->getStartColor()->setARGB('8B0000');
$sheet->getStyle('A1')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
$sheet->setCellValue('A1', '公共数据(请不要修改)'); $sheet->getStyle('A2:C2')->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID);
$sheet->getStyle('A2:C2')->getFill()->getStartColor()->setARGB('FF808080');
$sheet->getStyle('A2:C2')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE); $sheet->setCellValue('A2', '状态(1=上架|0=下架)');
$sheet->setCellValue('A3', '0');
$sheet->setCellValue('A4', '1'); $sheet->setCellValue('B2', '语言');
foreach ($languages as $key => $value){
$sheet->setCellValue('B'.($key+3), $value['name']);
} $sheet->setCellValue('C2', '分类名');
foreach ($categoryNme as $key => $value){
$sheet->setCellValue('C'.($key+3), $value);
} $sheet->setSheetState('hidden'); //设置第一页为活动页,保存
$spreadsheet->setActiveSheetIndex(0);
$writer = new Xlsx($spreadsheet);
$file_name = $this->session->data['site_id'].'.xlsx';
$file_path = DIR_UPLOAD.'excel_template/'.$file_name;
$writer->save($file_path); //释放内存
$spreadsheet->disconnectWorksheets();
unset($spreadsheet); return $file_name;
} /**
* 验证
* @access private
* @param array $data
* @param string $scenario 验证场景 add
* @return bool
*/
private function _validate($data, $scenario = '')
{ if (!isset($data['excel_file']) || empty($data['excel_file'])) {
$this->addError('excel_file', '没有上传产品Excel文件');
} if (!isset($data['images_file']) || empty($data['images_file'])) {
$this->addError('images_file', '没有上传产品图片文件');
} return $this->hasErrors() ? false : true;
} /**
* 获取产品分类名称
* @access private
* @param array $data
* @return array
*/
private function _getCategoryName($data){ if(!empty($data)){ foreach ($data as $key => $value){
if(!empty($data['children'])){
$this->_getCategoryName($data['children']);
}else{
$retrun[] = $value['name'];
}
} }else{
$retrun = array();
} return $retrun; } /**
* 遍历文件夹
* @access private
* @param string $dir
* @return array
*/
private function _getDirFile($dir) {
$files = array();
if(@$handle = opendir($dir)) { //注意这里要加一个@,不然会有warning错误提示:)
while(($file = readdir($handle)) !== false) {
if($file != ".." && $file != ".") { //排除根目录;
if(is_dir($dir."/".$file)) { //如果是子文件夹,就进行递归
$files[$file] = $this->_getDirFile($dir."/".$file);
} else { //不然就将文件的名字存入数组;
$files[] = $file;
} }
}
closedir($handle);
return $files;
}
} /**
* 获取产品图片
* @access private
* @param string $dir
* @return array
*/
private function _getImage($key,$images_file){ $aliYunOSS = new AliYunOSS();
$data = array();
$arr_image = $this->_getDirFile($images_file); if(isset($arr_image[$key])){ foreach ($arr_image[$key] as $k => $v){
$result = $aliYunOSS->uploadFile($images_file.'/'.$key.'/'.$v, 'upload/images/'.$key.'/'.$v);
if($result['success']==1){
$data[] = array(
'name'=>$v,
'image'=>$result['info']['url']
);
}
} } return $data;
} }

php+phpspreadsheet读取Excel数据存入mysql的更多相关文章

  1. java的poi技术读取Excel数据到MySQL

    这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...

  2. jxl读写excel, poi读写excel,word, 读取Excel数据到MySQL

    这篇blog是介绍: 1. java中的poi技术读取Excel数据,然后保存到MySQL数据中. 2. jxl读写excel 你也可以在 : java的poi技术读取和导入Excel了解到写入Exc ...

  3. 关于mapreducer 读取hbase数据 存入mysql的实现过程

    mapreducer编程模型是一种八股文的代码逻辑,就以用户行为分析求流存率的作为例子 1.map端来说:必须继承hadoop规定好的mapper类:在读取hbase数据时,已经有现成的接口 Tabl ...

  4. 通过读取excel数据和mysql数据库数据做对比(二)-代码编写测试

    通过上一步,环境已搭建好了. 下面开始实战, 首先,编写链接mysql的函数conn_sql.py import pymysql def sql_conn(u,pwd,h,db): conn=pymy ...

  5. 通过读取excel数据和mysql数据库数据做对比(一)-win环境准备

    要想操作excel和mysql首先需要安装python,然后是安装excel和mysql插件: 第一步安装python: 直接百度搜索,下载安装就可以了. 第二步安装excel插件: 首先到这个htt ...

  6. 【python 3.6】python读取json数据存入MySQL(一)

    整体思路: 1,读取json文件 2,将数据格式化为dict,取出key,创建数据库表头 3,取出dict的value,组装成sql语句,循环执行 4,执行SQL语句 #python 3.6 # -* ...

  7. 【python 2.7】python读取json数据存入MySQL

    同上一篇,只是适配 CentOS+ python 2.7 #python 2.7 # -*- coding:utf-8 -*- __author__ = 'BH8ANK' import json im ...

  8. 【python 3.6】python读取json数据存入MySQL(二)

    在网上找到一个包含全国各省市经纬度的json文件,也可以通过上次的办法,解析json关键字,构造SQL语句,插入数据库. JSON文件格式如下: [ { "name": " ...

  9. java的poi技术读取Excel数据

    这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: ja ...

随机推荐

  1. 搭建VUE项目

    1.换源由于npm源服务器在国内访问速度较慢,所以一般需要更换源服务器地址npm config set registry https://registry.npm.taobao.org也可以安装cnp ...

  2. 如何使用Android Studio把自己的Android library分享到jCenter和Maven Central

    参考链接: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html

  3. Codeforce 9C - Hexadecimal's Numbers

    One beautiful July morning a terrible thing happened in Mainframe: a mean virus Megabyte somehow got ...

  4. TrueCrypt 7.1a Hashes

    Here are the SHA256, SHA1, and MD5 hashes of all TrueCrypt version 7.1a files. The signature of the ...

  5. MySQL篇,第三章:数据库知识3

    MySQL 数据库 3 索引 1.普通索引(MUL)   2.唯一索引(UNI)   3.主键索引(PRI) 1.使用规则 1.一个表中只能有一个主键(primary)字段 2.对应字段的值不允许重复 ...

  6. unity中实现简单对象池,附教程原理

    Unity对象池的创建与使用 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  7. 20155219 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    一.实验内容及步骤 1.使用JDK编译.运行简单的java程序 先在命令行中按老师要求输入,之后编译运行,如下图. 具体代码如下: package src.shiyan1; import java.u ...

  8. 集合框架 ArrayList LinkedList(待续)

    ArrayList中存储的元素的内存空间是连续的, LinkedList内存空间不是连续的 集合对象不能被序列化到硬盘中 http://blog.csdn.net/eson_15/article/de ...

  9. ios-UITableView无内容时,不显示多余的分隔线

    效果如上. 只要补上以下方法: //设置多于的分割线 -(void)setExtraCellLineHidden: (UITableView *)tableView { UIView *view = ...

  10. codeforces 788A Functions again

    …… 原题: Something happened in Uzhlyandia again... There are riots on the streets... Famous Uzhlyandia ...