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 相关文章推荐
APMServ使用说明
Oct 23 PHP
php Undefined index和Undefined variable的解决方法
Mar 27 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
PHP实现的博客欢迎提示功能(很特别哦)
Jun 05 PHP
yii操作cookie实例简介
Jul 09 PHP
laravel 4安装及入门图文教程
Oct 29 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
php简单实现sql防注入的方法
Apr 22 PHP
PHP反射实际应用示例
Apr 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
操作Oracle的php类
2006/10/09 PHP
phpmyadmin的#1251问题
2006/11/25 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
js使用心得分享
2015/01/13 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
使用cx_freeze把python打包exe示例
2014/01/24 Python
详解Django中Request对象的相关用法
2015/07/17 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
Python实现多线程的两种方式分析
2018/08/29 Python
python实现三次样条插值
2018/12/17 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
党员一句话承诺大全
2014/03/28 职场文书
营销团队口号
2014/06/06 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
Element实现动态表格的示例代码
2021/08/02 Javascript