一:话不多说,上干货
1.首先,需要创建个数据库 product
数据库代码参考:
/*
Navicat MySQL Data Transfer
Source Server : TP-jifen-demo
Source Server Version : 50717
Source Host : localhost:3306
Source Database : product
Target Server Type : MYSQL
Target Server Version : 50717
File Encoding : 65001
Date: 2018-07-20 20:15:34
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `pro_info`
-- ----------------------------
DROP TABLE IF EXISTS `pro_info`;
CREATE TABLE `pro_info` (
`pId` int(4) NOT NULL AUTO_INCREMENT,
`pName` varchar(20) NOT NULL,
`pPrice` float NOT NULL,
`pCount` float NOT NULL,
PRIMARY KEY (`pId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gb2312;
-- ----------------------------
-- Records of pro_info
-- ----------------------------
2.整个excel备用,测试必备,大致这样就可以
3.创建项目demo,结构如下(红框重点,Public文件夹下可能还需要个Uploads文件夹用来存放临时文件)
config.php:
<?php
return array(
//'配置项'=>'配置值'
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'product', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => '', // 密码。。
'DB_PORT' => '3306', // 端口
'DB_PREFIX' => 'pro_', // 数据库表前缀
);
IndexController.class.php(有部分注释为本人调试时修改,请轻喷)
<?php
/**
* @Author: ND01
* @Date: 2018-07-19 16:13:25
* @Last Modified by: ND01
* @Last Modified time: 2018-07-21 09:16:50
*/
/**
*
* 导入Excel文件数据到MySQL数据库
*/
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
/**
* 显示上传表单html页面
*/
public function index() {
$this->display();
}
/**
* 上传Excel文件
*/
public function upload() {
//引入ThinkPHP上传文件类
import('ORG.Net.UploadFile');
$config = array(
'exts' => array('xlsx','xls'),
'maxSize' => 3145728000,
'rootPath' =>"./Public/",
'savePath' => 'Uploads/',
'subName' => array('date','Ymd'),
);
//实例化上传类
$upload = new \Think\Upload($config);
// dump($upload);die;
//存在同名文件是否是覆盖
$upload->uploadReplace = true;
if (!$info = $upload->upload()) { //如果上传失败,提示错误信息
$this->error($upload->getError());
} else { //上传成功
//获取上传文件信息
// $info = $upload->upload();
//获取上传保存文件名
$filename = $info['file']['savename'];
$savepath = $info['file']['savepath'];
// dump($filename);die;
//重定向,把$fileName文件名传给importExcel()方法
// $this->success('Index/importExcel', array('filename' => $filename), 1, '上传成功!');
header("content-type:text/html;charset=utf-8");
//引入PHPExcel类
// vendor('PHPExcel');
vendor("PHPExcel.PHPExcel");
vendor('PHPExcel.IOFactory');
vendor('PHPExcel.Reader.Excel5');
// $info= $_GET['info'];dump($info);die;
//redirect传来的文件名
// $filename = $_GET['filename'];
// $filepath = $_GET['filepath'];
// $info= $_GET['info'];dump($info);die;
// dump($filename);die;
//文件路径
$filePath = './Public/' . $savepath. $filename ;
// dump($savePath);die;
//实例化PHPExcel类
// $PHPExcel = new \Think\PHPExcel();
//默认用excel2007读取excel,若格式不对,则用之前的版本进行读取
$PHPReader = new \PHPExcel_Reader_Excel2007();
if (!$PHPReader->canRead($filePath)) {
$PHPReader = new \PHPExcel_Reader_Excel5();
if (!$PHPReader->canRead($filePath)) {
echo 'no Excel';
return;
}
}
// dump($PHPReader);die;
//读取Excel文件
$PHPExcel = $PHPReader->load($filePath);
//读取excel文件中的第一个工作表
$sheet = $PHPExcel->getSheet(0);
//取得最大的列号
$allColumn = $sheet->getHighestColumn();
//取得最大的行号
$allRow = $sheet->getHighestRow();
//从第二行开始插入,第一行是列名
for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
//获取B列的值
$name = $PHPExcel->getActiveSheet()->getCell("B" . $currentRow)->getValue();
//获取C列的值
$price = $PHPExcel->getActiveSheet()->getCell("C" . $currentRow)->getValue();
//获取D列的值
$count = $PHPExcel->getActiveSheet()->getCell("D" . $currentRow)->getValue();
$m = D('Info');
$num = $m->add(array('pName' => $name, 'pPrice' => $price, 'pCount' => $count));
}
if ($num > 0) {
echo "添加成功!";
} else {
echo "添加失败!";
}
}
}
}
?>
index.html
<!DOCTYPE html>
<html>
<head>
<title>上传文件</title>
<meta charset="UTF-8">
</head>
<body>
<form id="upload" action="__URL__/upload/" method="post" enctype="multipart/form-data">
<label for="file">上传文件:</label>
<input type="file" name="file" id="file"><br />
<input type="submit" name="submit" value="上传" />
</form>
</body>
</html>
4.测试
二:总结
文章说明:因学习时浏览网站较多且参考网站较多,如有参考内容转载绝非有意,若有侵犯,还请告知。
问题总结:学习过程中出现过很多问题。如找不到文件的问题,尝试多处使用dump来查看变量值,保证代码走得通。
多次出现The filename * is not readable错误,大致分为两种问题,一种是路径问题,一定要多检查、修改、测试,另一种是文件权限问题,可以百度解决(注明一点,我的文件只读也取消不了,百度到的合理解释为:https://baike.1688.com/doc/view-d26261162.html就是说并不影响)。
注意PHPExcel插件放于Vendor目录下。
文章若有错误或问题,欢迎指出。