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 adodb操作mysql数据库
Mar 19 PHP
PHP 事件机制(2)
Mar 23 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
php判断当前操作系统类型
Oct 28 PHP
Zend Framework动作助手FlashMessenger用法详解
Mar 05 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
Jul 01 PHP
php代码检查代理ip的有效性
Aug 19 PHP
使用Zttp简化Guzzle 调用
Jul 02 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
PHP格式化显示时间date()函数代码
Oct 03 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
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
PHP中session变量的销毁
2014/02/27 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
php表单处理操作
2017/11/16 PHP
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
es6数值的扩展方法
2019/03/11 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
windows下安装python paramiko模块的代码
2013/02/10 Python
使用python3.5仿微软记事本notepad
2016/06/15 Python
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
幼儿园推普周活动总结
2015/05/07 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python