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 相关文章推荐
windows下PHP APACHE MYSQ完整配置
Jan 02 PHP
php 数组的一个悲剧?
May 11 PHP
PHP递归算法的详细示例分析
Feb 19 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
PHP大批量插入数据库的3种方法和速度对比
Jul 08 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
php绘制一个扇形的方法
Jan 24 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
Dec 25 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
php数组指针函数功能及用法示例
Feb 11 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/12/05 PHP
phalcon框架使用指南
2016/02/23 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
枚举JavaScript对象的函数
2006/12/22 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
js实现自定义路由
2017/02/04 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
python中pow函数用法及功能说明
2020/12/04 Python
毕业研究生的自我鉴定
2013/11/30 职场文书
车间组长岗位职责
2013/12/20 职场文书
公司门卫岗位职责
2014/03/15 职场文书
活动总结怎么写啊
2014/05/07 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
户外亲子活动总结
2015/05/08 职场文书
诉讼和解协议书
2016/03/23 职场文书
python小程序之飘落的银杏
2021/04/17 Python
详解thinkphp的Auth类认证
2021/05/28 PHP