PHP导入Excel数据

在Sourceforge上提供了一个开源的PHP导入Excel数据的类,在下载的项目中也提供了简单的示例。下面我做了一些简易的包装,让PHP导入Excel数据用起来更为简便。

首先看看示例代码,了解一下Excel Reader的基本使用方式(按照下面的注释step by step)

<?php // 1.引用ExcelReader类文件 require_once 'Excel/reader.php'; // 2.实例化读取Excel的类 $data = new Spreadsheet_Excel_Reader(); // 3.设置输出编码 $data->setOutputEncoding('utf-8'); // 4.读取指定的excel $data->read('test.xls'); // 5.循环输出每一行数据,这里读取的是Excel的第一个Sheet表格 // sheets[0]['numRows']代表行数 // sheets[0]['numCols']代表列数 for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) { // 遍历行 for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) { // 遍历列 echo "\"".$data->sheets[0]['cells'][$i][$j]."\","; } echo "\n"; } ?>

这个简单的例子只是输出了Excel中每个单元格的值,我们还需要拼接sql语句最终将这些值插入到数据库中,而且当Excel的第一行为列头时,这一行数据是不能够插入到数据表中的。

下面的步骤就来演示这一简单过程。

  1. 创建数据库,数据表

–创建test数据库
create database test;
use test;
–创建books表
create table books
(
ISBN varchar(50) primary key,
Pubdate varchar(50)
);
2. 拼接sql

<?php require_once 'Excel/reader.php'; @ $db = mysql_connect ( 'localhost', 'root', 'root' ) or die ( "Could not connect to database." ); // 连接数据库 mysql_query ( "set names 'utf-8'" ); // 输出中文 mysql_select_db ( 'test' ); // 选择数据库 $data = new Spreadsheet_Excel_Reader (); $data->setOutputEncoding ( 'utf-8' ); $data->read ( 'Books.xls' ); // 调用ImportExcelData方法 ImportExcelData ( $data, 'books', array ('ISBN', 'Pubdate' ), true ); /** * 将读取到的Excel数据导入到数据库中 * * @access public * @param * hasColumnHeader 是否包含列头 * @param * columnArray 要插入的列 * @param * tableName 要插入的表 * @return bool */ function ImportExcelData($data, $tableName, $columnArray, $hasColumnHeader = false) { // 默认不包含列头,起始行就为1 $start = 1; if ($hasColumnHeader) { // 如果包含列头,跳过列头,起始行为2 $start = 2; } // 生成insert语句的前半部分 // 形式如这种:insert into table_name('field1','field2'...) values $insert_statement = CreateInsertStatement ( $tableName, $columnArray ); for($i = $start; $i <= $data->sheets [0] ['numRows']; $i ++) { // 遍历行 $sql = $insert_statement; $sql .= "("; for($j = 1; $j <= $data->sheets [0] ['numCols']; $j ++) { // 遍历列 $sql .= "'" . $data->sheets [0] ['cells'] [$i] [$j] . "',"; } $sql = trimEnd ( $sql, "," ); $sql .= ");"; $res = mysql_query ( $sql ); } } /** * 创建插入sql的语句 * * @access public * @param * tableName * @param * columnArray * @return string */ function CreateInsertStatement($tableName, $columnArray) { $sql = "insert into ".$tableName."("; foreach ( $columnArray as $c ) { $sql .= "" . $c . ","; } $sql = trimEnd ( $sql, "," ); $sql .= ") values"; return $sql; } /** * 移除字符串中指定的尾部字符 * * @access public * @param * str * @param * strEnd * @return string */ function trimEnd($str, $strEnd) { return substr ( $str, - (strlen ( $strEnd )) ) == $strEnd ? substr ( $str, 0, strlen ( $str ) - strlen ( $strEnd ) ) : $str; } ?>
  1. 优化

上面的方法有一个问题,每次生成一个insert语句,就执行一次插入操作,如果Excel的数据量很大,那么执行的插入操作也非常多。既然如此,何不生成一批sql语句后再执行插入操作呢?

我对ImportExcelData方法做了简单的优化,加了一个batchSize参数,表示每次执行多少条插入语句,也许这样的做法会更加节约资源。

/**

  • 将读取到的Excel数据导入到数据库中

  • @access public

  • @param hasColumnHeader 是否包含列头

  • @param columnArray 要插入的列

  • @param tableName 要插入的表

  • @param batchSize 每次执行插入语句的条数

  • @return bool
    */
    function ImportExcelData( d a t a , data, data,tableName, c o l u m n A r r a y , columnArray, columnArray,hasColumnHeader = false, $batchSize = 100){

    // 默认不包含列头,起始行就为1
    $start = 1;

    if($hasColumnHeader){
    // 如果包含列头,跳过列头,起始行为2
    $start = 2;
    }
    // 记录循环次数
    $loop = 0;
    $sql = “”;
    // 生成insert语句的前半部分
    // 形式如这种:insert into table_name(‘field1’,‘field2’…) values
    i n s e r t s t a t e m e n t = C r e a t e I n s e r t S t a t e m e n t ( insert_statement = CreateInsertStatement( insertstatement=CreateInsertStatement(tableName, c o l u m n A r r a y ) ; f o r ( columnArray); for( columnArray);for(i = $start; $i <= $data->sheets[0][‘numRows’]; $i++){ // 遍历行
    $sql .= $insert_statement;
    s q l . = " ( " ; f o r ( sql .= "("; for ( sql.="(";for(j = 1; $j <= $data->sheets[0][‘numCols’]; $j++){ // 遍历列
    s q l . = " ′ " . sql .= "'". sql.="".data->sheets[0][‘cells’][ i ] [ i][ i][j].“',”;
    }
    s q l = t r i m E n d ( sql = trimEnd( sql=trimEnd(sql,“,”);
    $sql .= “);”;

     $loop ++;
     // 当loop值等于batchSize时,执行插入操作
     if($loop == $batchSize){
         $res = mysql_query ( $sql );
         $loop = 0;
         $sql = "";
     }
     //echo $sql;
    

    }

    // 如果有950条记录,执行了前9个batch,剩余50条也应当执行
    if($loop != 0){
    $res = mysql_query ( $sql );
    }
    }
    Books.xls文件的内容如图1:
    【图1】

image

生成的sql语句如图2:
【图2】

image

执行后的结果如图3:
【图3】
SNAGHTML17f0279

当然Excel Reader类中提供的方法不止这些,大家可以参考Sourceforge上提供的example,也可以直接去查看或更改源代码获取自己需求的功能。

文章转自:怪物猎人崛起凶镜妖云怎么制作-9335游戏网

作者:9335游戏网,转载请注明原文链接:https://www.clw9335.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值