PHP-ExcelReader를 이용하여 엑셀 데이터를 DB에 입력하기
쇼핑몰 작업을 하다보면 엑셀에 대한 작업을 꽤 하게 된다. 엑셀파일을 이용한 상품정보 일괄등록 같은 기능이 많이 사용되는데 그런 기능을 구현하기 위해 PHP-ExcelReader 를 사용해보기로 했다. PHPExcel 이라는 뛰어난 라이브러리가 있지만 PHP 5.2 등의 요구사항을 충족시키는 것이 가능하지 않을 수도 있기 때문에 PHP-ExcelReader를 사용하기로 했다.
PHP-ExcelReader 파일 다운로드 : http://sourceforge.net/projects/phpexcelreader/files/latest/download
PHP-ExcelReader 를 사용하기 전에 수정해야할 것이 있는데 다운로드한 파일의 압축을 푼 후 reader.php 파일을 열어 31라인 부근의 아래 코드를 수정해야한다.
require_once 'Spreadsheet/Excel/Reader/OLERead.php';
위 코드를 아래와 같이 수정한다.
require_once 'oleread.inc';
파일의 경로가 잘못 지정되어 있는데 내가 다운로드한 파일에서만 이런 현상이 생겼는지도 모르겠다. 실행했을 때 경로 문제로 오류가 발생하면 경로를 수정해야할 것이다.
아래는 간단한 예제코드이다. 아래 테이블처럼 데이터가 엑셀 파일에 있을 때 이 데이트를 DB에 저장하는 것이다.
fld1 | fld2 | fld3 |
100 | 200 | 300 |
110 | 210 | 310 |
120 | 220 | 320 |
<?php
$file = 'excel.xls';
include_once('reader.php');
$data = new Spreadsheet_Excel_Reader();
// Set output Encoding.
$data->setOutputEncoding('UTF-8');
/***
* if you want you can change 'iconv' to mb_convert_encoding:
* $data->setUTFEncoder('mb');
*
**/
/***
* By default rows & cols indeces start with 1
* For change initial index use:
* $data->setRowColOffset(0);
*
**/
/***
* Some function for formatting output.
* $data->setDefaultFormat('%.2f');
* setDefaultFormat - set format for columns with unknown formatting
*
* $data->setColumnFormat(4, '%.3f');
* setColumnFormat - set format for column (apply only to number fields)
*
**/
$data->read($file);
/*
$data->sheets[0]['numRows'] - count rows
$data->sheets[0]['numCols'] - count columns
$data->sheets[0]['cells'][$i][$j] - data from $i-row $j-column
$data->sheets[0]['cellsInfo'][$i][$j] - extended info about cell
$data->sheets[0]['cellsInfo'][$i][$j]['type'] = "date" | "number" | "unknown"
if 'type' == "unknown" - use 'raw' value, because cell contain value with format '0.00';
$data->sheets[0]['cellsInfo'][$i][$j]['raw'] = value if cell without format
$data->sheets[0]['cellsInfo'][$i][$j]['colspan']
$data->sheets[0]['cellsInfo'][$i][$j]['rowspan']
*/
error_reporting(E_ALL ^ E_NOTICE);
$comma = '';
$sql = " INSERT INTO `table`
( fld1, fld2, fld3 )
VALUES ";
for ($i = 2; $i <= $data->sheets[0]['numRows']; $i++) {
$fld1 = addslashes($data->sheets[0]['cells'][$i][1]);
$fld2 = addslashes($data->sheets[0]['cells'][$i][2]);
$fld3 = addslashes($data->sheets[0]['cells'][$i][3]);
$sql .= $comma." ( '$fld1', '$fld2', '$fld3' ) ";
$comma = ' , ';
}
mysql_query($sql);
?>
위 코드에서 $i의 초기값을 2라고 지정한 것은 엑셀파일에서 fld1, fld2, fld3 라는 값은 저장하지 않기 위해서이다. 그리고 $data->setOutputEncoding(‘UTF-8’); 부분에서 캐릭터셋을 지정할 수 있는데 나의 경우는 DB에 저장될 캐릭터셋이 utf-8 이기 때문에 UTF-8로 지정했다.
좋은 자료 공유해주셔서 감사합니다.
덕분에 수월하게 해결했네요 ~ ^^
댓글 남겨주셔서 감사합니다. 좋은 하루 되세요.