원저작물, 전재 가능합니다. 재인쇄 시 반드시 기사 원본 출처, 저자 정보 및 본 내용을 하이퍼링크 형태로 표시해 주시기 바랍니다. 그렇지 않으면 법적 책임이 추구됩니다. 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초로 설정해 보았는데 여전히 4,000행의 다채로운 테이블을 읽을 수 없었습니다. 그 이유는 모든 처리 결과를 배열로 저장하는 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);
- }
- }
위 방법은 모든 유닛을 결합하려는 경우 더 복잡한 상황입니다. 전체 그리드를 읽으려면 다음 방법을 사용하면 됩니다.
- 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 < $sheet_count; $s++)
- {
- $currentSheet = $objPHPExcel->getSheet($s);// 当前页
- $row_num = $currentSheet->getHighestRow();// 当前页行数
- $col_max = $currentSheet->getHighestColumn(); // 当前页最大列号
-
- // 循环从第二行开始,第一行往往是表头
- for($i = 2; $i <= $row_num; $i++)
- {
- $cell_values = array();
- for($j = 'A'; $j < $col_max; $j++)
- {
- $address = $j . $i; // 单元格坐标
- $cell_values[] = $currentSheet->getCell($address)->getFormattedValue();
- }
-
- // 看看数据
- print_r($cell_values);
- }
- }
위의 print_r을 결합된 sql 문으로 변경하여 파일에 쓴 다음 mysql을 사용하여 가져올 수 있습니다. , 데이터베이스에 직접 연결할 수도 있습니다. 테이블에 레코드를 삽입하는 것은 보기만큼 쉽습니다.
이 방법을 사용하면 수만 행의 레코드를 쉽게 테이블로 가져올 수 있으므로 모든 사람에게 도움이 되기를 바랍니다.
이 글은 "Fanxing's Technology Blog" 블로그에서 가져온 것입니다. http://ustb80.blog.51cto.com/6139482/1066505
위 내용은 관련 내용을 포함하여 PHPExcel을 사용하여 매우 큰 엑셀 파일을 읽는 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.