A. 如何用PHPExcel讀取超大excel文件
工作中經常要遇到將xlsx文件中的部分內容導入到資料庫。通常我們都是用PHPExcel來讀取。
通過下面的方法我們可以很容易將一個excel表格讀取成為php數組,之後就可以為所欲為了:
$input_file = "data.xlsx";
$objPHPExcel = PHPExcel_IOFactory::load($input_file);
$sheetData = $objPHPExcel->getSheet(0)->toArray(null, true, true, true);
如果文章到此結束,那價值就不大了。
很不幸的情況總是存在的,當data.xlsx有上萬行,每一行又有很多列,每一列又有很長的字元串,並且有的還有顏色等效果時,用上面的方法經常發生的情況就是內存不足。
好吧,我們還有ini_set來加大內存,還可以用set_time_limit來設置較長的超時,如下:
set_time_limit(90);
ini_set("memory_limit", "1024M");
$input_file = "data.xlsx";
$objPHPExcel = PHPExcel_IOFactory::load($input_file);
$sheetData = $objPHPExcel->getSheet(0)->toArray(null, true, true, true);
但很負責任的說,這些都不是終極的方案。
我曾經試過將內存設置到了2G,超時設置到了90秒,也仍然讀不出一個4000行的花花綠綠的表格。原因都出在toArray這個方法上,它會將處理的結果全保存到數組中,這種方式在處理簡單表格時還是很方便的,但在處理大表格時,真的是很杯具。
我們的解決方案如下:
require 'lib/PHPExcel.php';
set_time_limit(90);
$input_file = "data.xlsx";
$objPHPExcel = PHPExcel_IOFactory::load($input_file);
// 讀取規則
$sheet_read_arr = array();
$sheet_read_arr["sheet1"] = array("A","B","C","D","F");
$sheet_read_arr["sheet2"] = array("A","B","C","D","F");
// 循環所有的頁
foreach ($sheet_read_arr as $key => $val)
{
$currentSheet = $objPHPExcel->getSheetByName($key);// 通過頁名稱取得當前頁
$row_num = $currentSheet->getHighestRow();// 當前頁行數
// 循環從第二行開始,第一行往往是表頭
for ($i = 2; $i <</span>= $row_num; $i++)
{
$cell_values = array();
foreach ($val as $cell_val)
{
$address = $cell_val . $i;// 單元格坐標
// 讀取單元格內容
$cell_values[] = $currentSheet->getCell($address)->getFormattedValue();
}
// 看看數據
print_r($cell_values);
}
}
上面的方式算是較復雜的情況了,如果只是想將所有的單元格全讀出來,用下面的方法就行了:
require 'lib/PHPExcel.php';
set_time_limit(90);
$input_file = "data.xlsx";
$objPHPExcel = PHPExcel_IOFactory::load($input_file);
$sheet_count = $objPHPExcel->getSheetCount();
for ($s = 0; $s <</span> $sheet_count; $s++)
{
$currentSheet = $objPHPExcel->getSheet($s);// 當前頁
$row_num = $currentSheet->getHighestRow();// 當前頁行數
$col_max = $currentSheet->getHighestColumn(); // 當前頁最大列號
// 循環從第二行開始,第一行往往是表頭
for($i = 2; $i <</span>= $row_num; $i++)
{
$cell_values = array();
for($j = 'A'; $j <</span> $col_max; $j++)
{
$address = $j . $i; // 單元格坐標
$cell_values[] = $currentSheet->getCell($address)->getFormattedValue();
}
// 看看數據
print_r($cell_values);
}
}
我們可以將上面的print_r地方改成組拼sql語句並寫入文件,然後用mysql導入,當然也可以直接連接資料庫向表中插入記錄,這就隨意了。
B. 導入excel文件,後端php處理導入的數據並存入資料庫,需要前後端結合的demo!
thinkphp3.2和phpexcel導入最基本用法
先整個最基礎的代碼,理解了這個,後面的就非常簡單了
$file_name='./Upload/excel/123456.xls';
import("Org.Util.PHPExcel");
import("Org.Util.PHPExcel.IOFactory");
$objReader=PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel=$objReader->load($file_name,$encode='utf-8');
$sheet=$objPHPExcel->getSheet(0);
$highestRow=$sheet->getHighestRow();//取得總行數
$highestColumn=$sheet->getHighestColumn();//取得總列數
$s=$objPHPExcel->getActiveSheet()->getCell("A2")->getValue();
表格內容:
 publicfunctionupload(){
publicfunctionupload(){
$files=$_FILES['exl'];
//exl格式,否則重新上傳
if($files['type']!='application/vnd.ms-excel'){
$this->error('不是Excel文件,請重新上傳');
}
//上傳
$upload=newThinkUpload();//實例化上傳類
$upload->maxSize=3145728;//設置附件上傳大小
$upload->exts=array('xls');//設置附件上傳類型
$upload->rootPath='./Upload/';//設置附件上傳根目錄
$upload->savePath='excel/';//設置附件上傳(子)目錄
//$upload->subName=array('date','Ym');
$upload->subName='';
//上傳文件
$info=$upload->upload();
$file_name=$upload->rootPath.$info['exl']['savepath'].$info['exl']['savename'];
$exl=$this->import_exl($file_name);
//去掉第exl表格中第一行
unset($exl[0]);
//清理空數組
foreach($exlas$k=>$v){
if(empty($v)){
unset($exl[$k]);
}
};
//重新排序
sort($exl);
$count=count($exl);
//檢測表格導入成功後,是否有數據生成
if($count<1){
$this->error('未檢測到有效數據');
}
//開始組合數據
foreach($exlas$k=>$v){
$goods[$k]['goods_sn']=$v;
//查詢資料庫
$where['goods_sn']=array('like','%'.$v.'%');
$res=M('goods')->where($where)->find();
$goods[$k]['goods_name']=$res['goods_name'];
$goods[$k]['goods_thumb']=$res['goods_thumb'];
if($res){
//是否匹配成功
$goods[$k]['is_match']='1';
$f+=1;
}else{
//匹配失敗
$goods[$k]['is_match']='0';
$w+=1;
}
}
//實例化數據
$this->assign('goods',$goods);
//print_r($f);
//統計結果
$total['count']=$count;
$total['success']=$f;
$total['error']=$w;
$this->assign('total',$total);
//刪除Excel文件
unlink($file_name);
$this->display('info');
}
/*處理上傳exl數據
*$file_name文件路徑
*/
publicfunctionimport_exl($file_name){
//$file_name='./Upload/excel/123456.xls';
import("Org.Util.PHPExcel");//這里不能漏掉
import("Org.Util.PHPExcel.IOFactory");
$objReader=PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel=$objReader->load($file_name,$encode='utf-8');
$sheet=$objPHPExcel->getSheet(0);
$highestRow=$sheet->getHighestRow();//取得總行數
$highestColumn=$sheet->getHighestColumn();//取得總列數
for($i=1;$i<$highestRow+1;$i++){
$data[]=$objPHPExcel->getActiveSheet()->getCell('A'.$i)->getValue();
}
return$data;
}
有問題一定要及時弄清楚
C. 使用phpexcel導入excel表格數據到MYSQL,亂碼怎麼解決
第一步:建立資料庫和數據表(按照自己的Excel數據設立欄位)。
[sql] view plain  print?
CREATE DATABASE php_excel;    
USE php_excel;    
CREATE TABLE IF NOT EXISTS php_excel(  
    id int(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,  
    gid varchar(20) NOT NULL,  
    stu_no varchar(20) NOT NULL,  
    name varchar(45) NOT NULL,  
    age int(4) NOT NULL  
)ENGINE=MyISAM DEFAULT CHARSET=utf8;  
    第二步:前台index.php文件。
[html] view plain  print?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
        <title>phpexcel導入excel數據到MYSQL資料庫</title>  
    </head>  
  
    <body>  
        <form name="frm1"  action="insertdb.php" method="post" enctype="multipart/form-data">  
            <input name="filename" type="file" />  
            <input name="submit" type="submit" value="import" />  
        </form>  
    </body>  
</html>  
 
    第三步:向資料庫插入數據的insertdb.php文件。
[php] view plain  print?
session_start();  
header("Content-type:text/html;charset:utf-8");  
//全局變數  
  
$succ_result=0;  
$error_result=0;  
$file=$_FILES['filename'];  
$max_size="2000000"; //最大文件限制(單位:byte)  
$fname=$file['name'];  
$ftype=strtolower(substr(strrchr($fname,'.'),1));  
 //文件格式  
$uploadfile=$file['tmp_name'];  
if($_SERVER['REQUEST_METHOD']=='POST'){  
    if(is_uploaded_file($uploadfile)){  
      if($file['size']>$max_size){  
        echo "Import file is too large";   
        exit;  
     }  
    if($ftype!='xls'){  
        echo "Import file type is error";  
        exit;     
    }  
    }else{  
        echo "The file is not empty!";  
        exit;   
 }   
}  
require("./conn.php");  //連接mysql資料庫  
  
//調用phpexcel類庫  
require_once 'PHPExcel.php';   
require_once 'PHPExcel\IOFactory.php';  
require_once 'PHPExcel\Reader\Excel5.php';  
  
$objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format   
$objPHPExcel = $objReader->load($uploadfile);   
$sheet = $objPHPExcel->getSheet(0);   
$highestRow = $sheet->getHighestRow(); // 取得總行數   
$highestColumn = $sheet->getHighestColumn(); // 取得總列數  
  $arr_result=array();  
  $strs=array();  
  
for($j=2;$j<=$highestRow;$j++)  
 {   
    unset($arr_result);  
    unset($strs);  
 for($k='A';$k<= $highestColumn;$k++)  
    {   
     //讀取單元格  
  $arr_result  .= $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue().',';  
    }  
 $strs=explode(",",$arr_result);  
 $sql="insert into php_excel(gid,stu_no,name,age) values ($strs[0],'$strs[1]','$strs[2]',$strs[3])";  
 echo $sql."<br/>";   
 mysql_query("set names utf8");  
 $result=mysql_query($sql) or die("執行錯誤");  
  
 $insert_num=mysql_affected_rows();  
  if($insert_num>0){  
        $succ_result+=1;  
    }else{  
        $error_result+=1;  
   }  
  
}    
echo "插入成功".$succ_result."條數據!!!<br>";  
echo "插入失敗".$error_result."條數據!!!";  
其中conn.php代碼如下:
[php] view plain  print?
$mysql=mysql_connect("localhost","root","") or die("資料庫連接失敗!");  
mysql_select_db("php_excel",$mysql);  
mysql_query("set names utf8");  
 
我的導入效果如下:
至此,從Excel文件讀取數據批量導入到Mysql資料庫完成。