原創作品,允許轉載,轉載時請務必以超載形式標明文章 原始出處 、作者資訊和本聲明。否則將追究法律責任。 http://ustb80.blog.51cto.com/6139482/1066505
工作中經常要遇到將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 <= $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);
- }
- }
上面的方式算是較複雜的情況了,如果只是想將所有的單元格全讀出來,用下面的方法就行了:
reee我們可以將上面的print_r地方改成組拼sql語句並寫入文件,然後用mysql導入,當然也可以直接連接資料庫向表中插入記錄,這就隨意了。
用這種方法可以將上萬行的記錄很輕鬆的導入到表中,希望對大家有幫助。
本文出自 “凡星的技術博客” 博客,請務必保留此出處http://ustb80.blog.51cto.com/6139482/1066505
以上就介紹如何用PHPExcel讀取超大excel文件,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。