之前讲过php实现Excel导出数据库的随笔,链接:https://www.cnblogs.com/nuanai/p/6727711.html

之前的项目用到较多的就是Excel导出,现在用到了Excel导入,就来把我的经验和过程记录一下。  作者:悦~   博客地址:https://www.cnblogs.com/nuanai/

在导出中说的那个phpExcel的插件,可以继续使用。因为我用的是thinkphp的框架做的导入数据库功能,接下来是我的过程,请大家多多指教。

1.将下载下来的PHPExcel的包放置到自己项目中的thinkphp的里面,放置路径:ThinkPHP\Library\Vendor\PHPExcel文件夹和PHPExcel.php文件,截图如下:

2.放置好了之后就可以进行控制器和视图页面的编写了。首先我是先写的前端页面,在Home的视图文件夹里面的Dao的控制器的dao模板进行视图的编写,代码如下:

<!--action是跳转到的控制器的方法名字,用controller+方法名字,这是我常用的-->
<form action="__CONTROLLER__/daopei" method="post" enctype="multipart/form-data" style="width: 300px; float: left;">
<div class="layui-field-box">
<div class="layui-form-item" style="float: left;">
<!--因为是要上传文件,所以这里的type类型是file类型,我给了一个name名字,因为name控制器要用到-->
<input type="file" name="dao" multiple="multiple" style="width: 200px;">
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<!--提交按钮-->
<input type="submit" value="导入配包" />
</div>
</div>
</div>
</form>

3.视图页面写完了之后就是写我的控制器的方法了,在Home的控制器的文件夹中创建与视图名字相同的控制器名字DaoController.class.php,daopei的方法逻辑如下:

(1)视图的name传过来的值,判断File是否为空

(2)如果不为空,实例化上传类,指定上传类的一些属性值,比如:上传文件类型、文件大小,文件的保存路径等

(3)接收前面的文件,给文件进行起名

(4)判断前面传过来的值有没有错误,如果没有就进行下一步

(5)导入PHPExcel类库,创建PHPExcel对象,excel文件后缀名为.xls或.xlsx分别导入不同的类

(6)然后读取excel表的内容,然候判断表中的数据有没有和数据库中冲突的

具体的代码如下:

public function daopei(){
if (!empty($_FILES)){
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize=2097152 ;// 设置附件上传大小
$upload->exts=array('xls','xlsx'); // 设置附件上传类型
$upload->rootPath ="./Public/"; //根路径
$upload->savePath="Excel/"; // 设置附件上传目录
//$upload->saveName = time().rand(0000,9999); // 上传文件
$info = $upload->uploadOne($_FILES["dao"]); $exts = $info['ext'];
$filename = '.'.'/'.'Public'.'/'.$info['savepath'].$info['savename'];
// 获取文件后缀
//$filename = $upload->rootPath.$info['savePath'].$info['savename']; // 生成文件路径名 if(!$info) { // 上传错误提示错误信息
$this->error($upload->getError());
}else{
vendor("PHPExcel"); // 导入PHPExcel类库
$PHPExcel = new \PHPExcel(); // 创建PHPExcel对象,注意,不能少了\
if ($exts == 'xls') { // 如果excel文件后缀名为.xls,导入这个类
vendor("PHPExcel.PHPExcel.Reader.Excel5");
$PHPReader = new \PHPExcel_Reader_Excel5();
}else if($exts == 'xlsx') {
vendor("PHPExcel.PHPExcel.Reader.Excel2007");
$PHPReader = new \PHPExcel_Reader_Excel2007();
}
$PHPExcel=$PHPReader->load($filename);
$currentSheet = $PHPExcel->getSheet(0); // 获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
$allColumn = $currentSheet->getHighestColumn(); // 获取总列数
$allRow = $currentSheet->getHighestRow(); // 获取总行数
$data=array();
for($j=1;$j<=$allRow;$j++){
//从A列读取数据
for($k='A';$k<=$allColumn;$k++){
// 读取单元格
$data[$j][]=$PHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
}
} for ($i = 2; $i <= $allRow; $i++) {
$ztime = time();
$timee = microtime($ztime);
//数据库中的字段名和excel表中的字段
$data_p['bid'] = $PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue();
$data_p['name'] = $PHPExcel->getActiveSheet()->getCell("B" .$i)->getValue();
$data_p['money'] = $PHPExcel->getActiveSheet()->getCell("C" .$i)->getValue();
$data_p['smoney'] = $PHPExcel->getActiveSheet()->getCell("D" . $i)->getValue(); if($PHPExcel->getActiveSheet()->getCell("E" .$i)->getValue() == FALSE){
$data_p['sel'] = 0;
}else{
$data_p['sel'] = 1;
}
$data_p['sid'] = $PHPExcel->getActiveSheet()->getCell("F" .$i)->getValue();
$data_p['sname'] = $PHPExcel->getActiveSheet()->getCell("G" . $i)->getValue();
$data_p['snum'] = $PHPExcel->getActiveSheet()->getCell("J" . $i)->getValue();
$data_p['time'] = $PHPExcel->getActiveSheet()->getCell("M" . $i)->getValue();
$data_p['hao'] = $PHPExcel->getActiveSheet()->getCell("N" . $i)->getValue();
$data_p['dtime'] = $timee; //判断excel表中的值有没有和数据库中相同的
$result = M('dao')->where ("hao='{$data_p['hao']}'")->field('hao')->find();
if (empty($result['hao'])) {
$ex = M('dao')->add($data_p);
}
//$ex=M('dao')->add($data_p);
} //判断语句是否执行成功
if($ex){
$this->success("导入成功");
}else{
$this->error("导入失败,可能数据已存在");// 提示错误
}
}
}else {
$this->display();
}
}

4.以上逻辑就是thinkphp的Excel的导入功能,其中重点的就是phpExcel的包的使用,其他的就是正常的语句

5.导入时的判断有没有相同的值,我是根据序号来进行判断的,因为无论怎么导入,我这边的Excel表以前导入的东西是不会删除的,那样序号是不会被别的东西代替,这样导入的时候就不会因为序号的问题出错了。

6.正常的thinkphp的使用这边就不多作介绍了。希望可以对导入的小伙伴有帮助。

求大神指教:有没有做过phpword导入数据库的伙伴们,我想学习一下,可以给我留言,或者留下博客地址,谢谢

使用thinkphp框架实现Excel导入数据库的更多相关文章

  1. excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution

    当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...

  2. ASP.NET 将Excel导入数据库

    将Excel导入数据库大致流程:  Excel数据->DataSet->数据库 需要做的准备:1.FileUpload控件一个,按钮一个,如果需要即时显示那么GridView或DataGr ...

  3. Java实现将Excel导入数据库和从数据库中导出为Excel

    实现的功能: 用Java实现从Excel导入数据库,如果存在就更新 将数据库中的数据导出为Excel 1.添加jxl.jar mysql-connector-java.1.7-bin.jar包到项目的 ...

  4. 记录-java(jxl) Excel导入数据库

    本内容主要包括(文件上传.excel2003数据导入数据库)excel导入数据库功能需要jxl  jar包支持 下面是文件上传的前端测试代码 <%@ page language="ja ...

  5. Excel导入数据库百万级数据瞬间插入

    Excel导入数据库百万级数据瞬间插入 百万级别,瞬间,有点吊哇

  6. Hibernate+jxl+excel导入数据库

    在将excel中的10w行数据导入数据库中时,总发生内存溢出,一开始使用的Spring+Hibernate;不知如何使用批处理,后来只是用Hibernate,10W行数据几分钟完成, 代码如下: pu ...

  7. Excel导入数据库(三)——SqlBulkCopy

    上篇博客中介绍了批量导入数据库的方法:下面介绍一下批量导入过程的核心——SqlBulkCopy类. 下面先介绍一些原理性的东西:SQLBulkCopy类,通常用于数据库之间大批量的数据传递.即使表结构 ...

  8. 第三次作业---excel导入数据库及显示(2)

    发现第一次做的功能有点复杂,不能理解.而且第一次的想法是在页面上上传文件,连接并导入到数据库,并在页面上显示.后来才看到要求是直接在本地将数据导入数据库就行了,然后显示.所以才出现了一堆看不懂也解决不 ...

  9. Excel导入数据库脚本

    --数据库中不存在需要导入的表 SELECT * INTO tab_PurchasePriceTemp FROM OPENROWSET( 'Microsoft.Jet.OLEDB.4.0', 'EXC ...

随机推荐

  1. Class doesn't contain any JAX-RS annotated method

    项目中使用了Jersey RESTful风格的注解 , 根据错误提示就知道了 , 在类中没有带注解的方法 ,所以只要在方法上添加 @path() 注解就行了,至少要有一个方法带有Jersey注解

  2. sahrepoint 上传到文档库

    sharepoint学习笔记汇总 http://blog.csdn.net/qq873113580/article/details/20390149         /// <summary&g ...

  3. forever start app.js 启动node时,服务访问一次后第二次就不能访问了

    开始总是找不到原因,是因为在启动服务时,没有设置日志文件.突然想到了是不是forever安装的有问题,就重新安装forever , 这时候提示系统 no space left on device  , ...

  4. php 怎么在foreach中循环数组的时候添加元素的属性

    foreach($arr as $key => &$vo){ //注意,由于上面遍历的时候写了地址传值符&, //所以下面可以直接给$vo 赋值;如果不写&符号,下面这样 ...

  5. 报表嵌入到.net系统页面

    目录: 1. 问题描述 2. 情形一:报表整体嵌入在.net系统框架中 3. 情形二:报表嵌入.net系统的某个页面中 4.权限控制方式 5.嵌入问题解决 1. 问题描述编辑 报表部署到Web应用服务 ...

  6. 椭圆曲线签名算法的v的定义

    在之前的个个与签名相关的地方我都对v的定义感到十分困惑,知道查看了黄皮书以后才对它的作用有了一定地了解,如下: (v is the recovery id: a 1 byte value specif ...

  7. WaitForSingleObject的详细用法

    在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObj ...

  8. spring 基于注解的@Scheduled和quartz定时器两种实现

    一.使用quartz 1.由于我的项目jar包使用的maven托管的,在pom文件中加入quartz的依赖就可以 2.配置quartz-context.xml,确保xml文件能被加载到 <?xm ...

  9. 深入浅出的webpack构建工具---devTool中SourceMap模式详解(四)

    阅读目录 一:什么是SourceMap? 二:理解webpack中的SourceMap的eval,inline,sourceMap,cheap,module 三:开发环境和线上环境如何选择source ...

  10. linux下模拟一个木马程序运行过程

    预备知识: 将一个程序放入到后台,悄悄的执行 ./xxx.sh & 进程: 用户进程:由用户来管理 系统进程:由系统内核自行管理 系统中的每个进程,都有一个位置的ID,这就是pid,而且每次启 ...