加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

PHP导入Excel数据

发布时间:2020-05-30 20:09:57 所属栏目:PHP 来源:互联网
导读:在Sourceforge上提供了一个开源的PHP导入Excel数据的类,在下载的项目中也提供了简单的示例。下面我做了一些简易的包装,让PHP导入Excel数据用起来更为简便。 首先看看示例代码,了解一

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

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

setOutputEncoding();
$data->read();

<span style="color: #557f5f">// 5.循环输出每一行数据,这里读取的是Excel的第一个Sheet表格
// sheets[0]['numRows']代表行数
// <span style="color: #0000c0">sheet<span style="color: #557f5f">s[0]['numCols']代表列数
<span style="color: #7f0055">for ($i = 1; $i <= $data->sheets[0][<span style="color: #0000c0">'numRows']; $i++) { <span style="color: #557f5f">// 遍历行
<span style="color: #7f0055">for ($j = 1; $j <= $data->shee<span style="color: #0000c0">ts[0]['numCols']; $j++) { <span style="color: #557f5f">// 遍历列
<span style="color: #7f0055">echo <span style="color: #0000c0">""".$data->sheets[0][<span style="color: #0000c0">'cells'][$i][$j].<span style="color: #0000c0">"",";
}
<span style="color: #7f0055">echo <span style="color: #0000c0">"n";
}

<span style="color: red">?>

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

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

1. 创建数据库,数据表

<pre class="code"><span style="color: #408080">--创建test数据库
<span style="color: #7f0055">create database test;
use test;
<span style="color: #408080">--创建books表
<span style="color: #7f0055">create table books
(
ISBN <span style="color: #7f0055">varchar(50) <span style="color: #7f0055">primary key,Pubdate <span style="color: #7f0055">varchar(50)
);

2. 拼接sql

<pre class="code"><span style="color: red"><?php

<span style="color: #7f0055">require_once <span style="color: #0000c0">'Excel/reader.php';

@ $db = mysql_connect ( <span style="color: #0000c0">'localhost',<span style="color: #0000c0">'root',<span style="color: #0000c0">'root' ) or <span style="color: #7f0055">die ( <span style="color: #0000c0">"Could not connect to database." ); <span style="color: #557f5f">// 连接数据库
mysql_query ( <span style="color: #0000c0">"set names 'utf-8'" ); <span style="color: #557f5f">// 输出中文
mysql_select_db ( <span style="color: #0000c0">'test' ); <span style="color: #557f5f">// 选择数据库

$data = <span style="color: #7f0055">new Spreadsheet_Excel_Reader ();
$data->setOutputEncoding ( <span style="color: #0000c0">'utf-8' );
$data->read ( <span style="color: #0000c0">'Books.xls' );

<span style="color: #557f5f">// 调用ImportExcelData方法
<font color="#ff0000">ImportExcelData ( $data,<span style="color: #0000c0">'books',<span style="color: #7f0055">array (<span style="color: #0000c0">'ISBN',<span style="color: #0000c0">'Pubdate' ),<span style="color: #7f0055">true );

<span style="color: #3f55bf">/**

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

  • <span style="color: #7f9fbf">@access <span style="color: #3f55bf">public

  • <span style="color: #7f9fbf">@param
    <span style="color: #3f55bf">* hasColumnHeader 是否包含列头

  • <span style="color: #7f9fbf">@param
    <span style="color: #3f55bf">* columnArray 要插入的列

  • <span style="color: #7f9fbf">@param
    <span style="color: #3f55bf">* tableName 要插入的表

  • <span style="color: #7f9fbf">@return <span style="color: #3f55bf">bool
    */
    <span style="color: #7f0055">function ImportExcelData($data,$tableName,$columnArray,$hasColumnHeader = <span style="color: #7f0055">false) {
    <span style="color: #557f5f">// 默认不包含列头,起始行就为1
    $start = 1;

    <span style="color: #7f0055">if ($hasColumnHeader) {
    <span style="color: #557f5f">// 如果包含列头,跳过列头,起始行为2
    $start = 2;
    }
    <span style="color: #557f5f">// 生成insert语句的前半部分
    // 形式如这种:insert into table_name('field1','field2'...) va<span style="color: #0000c0">lues
    $insertstatement = CreateInsertStatement ( $tableName,$columnArray );
    <span style="color: #7f0055">for($i = $start; $i <= $data-<span style="color: #0000c0">>sheets [0] [<span style="color: #0000c0">'numRows']; $i ++) { <span style="color: #557f5f">// 遍历行
    $sql = $insert
    <span style="color: #0000c0">statement;
    $sql .= <span style="color: #0000c0">"(";
    <span style="color: #7f0055">for($j = 1; $j <= $data->sheets [0] [<span style="color: #0000c0">'numCols']; $j ++) { <span style="color: #557f5f">// 遍历列
    $sql .= <span style="color: #0000c0">"'" . $data->sheets [0] [<span style="color: #0000c0">'cells'] [$i] [$j] . <span style="color: #0000c0">"',";
    }
    $sql = trimEnd ( $sql,<span style="color: #0000c0">"," );
    $sql .= <span style="color: #0000c0">");";
    $res = mysql_query ( $sql );
    }
    }

<span style="color: #3f55bf">/**

  • 创建插入sql的语句
  • <span style="color: #7f9fbf">@access <span style="color: #3f55bf">public
  • <span style="color: #7f9fbf">@param
    <span style="color: #3f55bf">* tableName
  • <span style="color: #7f9fbf">@param
    <span style="color: #3f55bf">* columnArray
  • <span style="color: #7f9fbf">@return <span style="color: #3f55bf">string
    */
    <span style="color: #7f0055">function CreateInsertStatement($tableName,$columnArray) {
    $sql = <span style="color: #0000c0">"insert into ".<font color="#333333">$tableName."(";
    <span style="color: #7f0055">foreach ( $columnArray <span style="color: #7f0055">as $c ) {
    $sql .= <span style="color: #0000c0">"" . $c . <span style="color: #0000c0">",";
    }
    $sql = trimEnd ( $sql," );
    $sql .= <span style="color: #0000c0">") values";
    <span style="color: #7f0055">return $sql;
    }

<span style="color: #3f55bf">/**

  • 移除字符串中指定的尾部字符
  • <span style="color: #7f9fbf">@access <span style="color: #3f55bf">public
  • <span style="color: #7f9fbf">@param
    <span style="color: #3f55bf">* str
  • <span style="color: #7f9fbf">@param
    <span style="color: #3f55bf">* strEnd
  • <span style="color: #7f9fbf">@return <span style="color: #3f55bf">string
    */
    <span style="color: #7f0055">function trimEnd($str,$strEnd) {
    <span style="color: #7f0055">return substr ( $str,- (strlen ( $strEnd )) ) == $strEnd ? substr ( $str,strlen ( $str ) - strlen ( $strEnd ) ) : $str;
    }
    <span style="color: red">?>

3. 优化

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

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

<pre class="code"><span style="color: #3f55bf">/**

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

  • <span style="color: #7f9fbf">@access <span style="color: #3f55bf">public

  • <span style="color: #7f9fbf">@param <span style="color: #3f55bf">hasColumnHeader 是否包含列头

  • <span style="color: #7f9fbf">@param <span style="color: #3f55bf">columnArray 要插入的列

  • <span style="color: #7f9fbf">@param <span style="color: #3f55bf">tableName 要插入的表

  • <span style="color: #7f9fbf">@param <span style="color: #3f55bf">batchSize 每次执行插入语句的条数

  • (编辑:安卓应用网)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读