Drupal读取Excel并导入数据库实例


Posted in PHP onMarch 02, 2014

PHPExcel 是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言。可以使用它来读取、写入不同格式的电子表格,如 Excel (BIFF) .xls, Excel 2007 (OfficeOpenXML) .xlsx, CSV, Libre/OpenOffice Calc .ods, Gnumeric, PDF, HTML等等。

一、Drupal 通过Library 调用 PHPExcel
将PHPExcel 下载后,上传到Drupal目录:sites/all/libraries/PHPExcel
如果你的项目中安装了libraries模块,可以通过libraries_load($name);来调用。
如果没有安装libraries模块,可以简单的使用下列代码来调用:

require("sites/all/libraries/PHPExcel/PHPExcel/IOFactory.php");

注意为了确保Excel全部导入,程序可以会话很长的时间来进行。所以在代码开头部分加入:

set_time_limit(0);

来确保运行时间不受限制。
二、Drupal 读取Excel并导入到数据库
Drupal 实现上传Excel文件后,读取Excel 内容,写入到数据库,打印导入结果消息。
归纳起来有这样几点:
1.Drupal 读取Excel 多行多列内容,列数从1到n,行数也是1到n。
2.Drupal 根据数据库结构 n 个字段分别用于存放Excel 1到n列,如果Excel 的列数很多,可以把n列值存放在1个字段中。
3.这里我解决的是Excel n列值存放到MySQL n个字段中(n不是很大)

这就是在Drupal最后提交上传文件后的函数:

<?php 
function excel_upload_form_submit($form, &$form_state) { 
  set_time_limit(0); 
  $timestamp = time(); 
  // 确保Excel文件上传了 
  if ($file = file_save_upload('file')) { 
    $row = 0; //解析行数 
    $paseRows = 0; //跳过行数 没有值的行 
    $insertRows = 0; //插入行数 
    $table = array( 
      'dbfield1′, 
      'dbfield2′, 
      'dbfield3, 
      'dbfield4′, 
      'dbfield5′, 
      … 
      'dbfieldn', 
    ); 
    require("sites/all/libraries/PHPExcel/PHPExcel/IOFactory.php"); 
    if(($handle = fopen ( $file->filepath, "r" )) !== FALSE) { 
      $PHPExcel = new PHPExcel (); 
      $PHPReader = new PHPExcel_Reader_Excel2007 (); 
      if (! $PHPReader->canRead ( $file->filepath )) { 
        $PHPReader = new PHPExcel_Reader_Excel5 (); 
        if (! $PHPReader->canRead ( $file->filepath )) { 
          echo 'no Excel'; 
          return; 
        } 
      } 
      $PHPExcel = $PHPReader->load ( $file->filepath ); 
      $currentSheet = $PHPExcel->getSheet ( 0 ); 
      /**取得一共有多少列*/ 
      $allColumn = $currentSheet->getHighestColumn(); 
      //取得共有多少列,若不使用此静态方法,获得的$col是文件列的最大的英文大写字母 
      $col = PHPExcel_Cell::columnIndexFromString($currentSheet->getHighestColumn()); 
      /**取得一共有多少行*/ 
      $allRow = $currentSheet->getHighestRow(); 
      //循环读取每个单元格的内容。注意行从1开始,列从A开始 
      for($rowIndex = 2; $rowIndex <= $allRow; $rowIndex++) { 
        $token_db = $row_db = $field = array(); 
        $i = 0; 
        $query = ”; 
        for($colIndex = 0; $colIndex <= $col; $colIndex++) { 
          //$addr = $colIndex.$rowIndex; 
          //$cell = $currentSheet->getCell($addr)->getValue(); 
          $cell = $currentSheet->getCellByColumnAndRow($colIndex, $rowIndex)->getValue(); 
          $cell = trim($cell); 
          if($cell instanceof PHPExcel_RichText) { 
            //富文本转换字符串 
            $cell = $cell->__toString(); 
          } 
          if ($colIndex == 'A' && !intval($cell)) { 
            $paseRows++; 
            break; 
          } 
          $field[] = $table[$i]; 
          $token_db[] = "'%s'"; 
          $row_db[] = $cell; 
          $query .= $table[$i]." = '%s', "; 
          $i++; 
        } 
        $row++; 
        if ($row_db) { 
          db_query('INSERT INTO {db_import} ('. implode(', ', $field) .', created) VALUES('. implode(', ', $token_db) .', %d)', array_merge($row_db, array($timestamp))); 
          $insertRows++; 
        } 
      } 
      fclose ( $handle ); 
    } 
    drupal_set_message(t('文件 @file 导入成功.', array('@file' => $file->filename))); 
    drupal_set_message("解析".$row."条数据完毕,新增共".$insertRows."条数据,没有试题类型ID的".$paseRows."条数据。"); 
  } 
  else { 
    drupal_set_message(t('File to import not found.'), 'error'); 
    $form_state['redirect'] = 'admin/content/db/import'; 
    return; 
  } 
} 
?>

上面代码部分注意一下几点:

$allColumn = $currentSheet->getHighestColumn();  //获取的列为英文大写字母的数组索引。
$col = PHPExcel_Cell::columnIndexFromString($currentSheet->getHighestColumn()); //将英文大写字母索引格式化为数字,索引值从0开始计算。

本代码支持读取Excel 2007 及之前的格式。

PHP 相关文章推荐
PHP写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
Oct 30 PHP
PHP使用in_array函数检查数组中是否存在某个值
Mar 25 PHP
php身份证号码检查类实例
Jun 18 PHP
php实现上传图片文件代码
Jul 19 PHP
php压缩文件夹最新版
Jul 18 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 PHP
php判断IP地址是否在多个IP段内
Aug 18 PHP
PHP isset()及empty()用法区别详解
Aug 29 PHP
laravel使用redis队列实例讲解
Mar 23 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 #PHP
Drupal7中常用的数据库操作实例
Mar 02 #PHP
php设计模式之命令模式使用示例
Mar 02 #PHP
php接口和抽象类使用示例详解
Mar 02 #PHP
php通过字符串调用函数示例
Mar 02 #PHP
php多维数组去掉重复值示例分享
Mar 02 #PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 #PHP
You might like
PHP数据库开发知多少
2006/10/09 PHP
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
2019/09/20 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
Python for循环与getitem的关系详解
2020/01/02 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
财务分析个人的自荐书范文
2013/11/24 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
电子商务专业学生职业生涯规划
2014/03/07 职场文书
亲属关系公证书
2014/04/08 职场文书
给numpy.array增加维度的超简单方法
2021/06/02 Python
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技