http://blog.naver.com/ateon1/120202184897
출처 : http://blog.naver.com/blackfrost/40134487471
http://phpexcel.codeplex.com/
https://code.google.com/p/php-excel-reader/
2번째 방법은 아래의 링크이다.
http://phpexcel.codeplex.com/
들어가서 해당CLASS를 다운 받고 쓰면 될것이다. 상당히 방대한 용량의 클래스인만큼, 거기에 나와 있는 40가지의 예제들처럼 엄청난 활용이 가능하다. 다만 PHP 5.2이상 버전인 환경에서만 사용되니 알아두기 바란다.
3번재 방법은 정말 간단하면서 깔끔하다.
http://code.google.com/p/php-excel-reader/
들어가보면 보이는 그림만으로 뭔지 눈치 챌것이다 위 CLASS처럼 여러가지상황에 맞춰 여러가지를 해줄수 있는것도 좋지만, 이건 정말 딱 엑셀을 업로드하면 엑셀을 정확히 읽어서 웹에 표시해준다. 간단하면서도 보통 필요한게 이런것이 아닐까 싶다.
필자는 1번째를 먼저 접하는 바람에 1번째 방법으로 삽질좀 했지만, 다른 분들은 상황에 맞게 2,3번째 방법으로 깔끔한 처리를 하기 바라는 의미에서 이 포스팅을 써본다.
http://spac.tistory.com/176
기존 엑셀 2003까지 버전은 확장자가 xls 로 생성되며 한시트에 최대 65,535 라인까지 처리할 수 있다.
그 이상의 행을 처리하려면 엑셀 2007 이상의 버전에서 xlsx 파일로 생성해야 한다. (100만 라인까지 가능)
기본 65,535라인을 넘는 데이터를 처리해야 할 경우 PHPExcel 클래스를 이용해 간단히 처리할 수 있다.
참고로 서버에 zip 라이브러리가 설치되어 있어야 한다.
먼저 PHPExcel 클래스를 다운로드 받자
http://www.codeplex.com/PHPExcel 에 방문하여 최신 버전을 내려받는다.
현재 기준으로 1.7.9 버전이 최신이다.
파일을 내려 받으면 PHPExcel_1.7.9_doc.zip 라는 파일이 받아진다.
압축을 풀어 서버에 업로드 한다.
나의 경우에는 서버 계정의 _lib 디렉토리에 업로드 하고 디렉토리명을 PHPExcel 로 설정했다.
POST로 엑셀파일을 업로드 하는 폼 페이지는 생략 하겠다.
아래는 폼 페이지에서 파일을 업로드 하면 실행하는 파일이다.
(POST 로 날라오는 파일 폼 이름이 "upfile" 이라 정하면)
<?php
include $_SERVER["DOCUMENT_ROOT"]."/_lib/PHPExcel/Classes/PHPExcel.php";
$UpFile = $_FILES["upfile"];
$UpFileName = $UpFile["name"];
$UpFilePathInfo = pathinfo($UpFileName);
$UpFileExt = strtolower($UpFilePathInfo["extension"]);
if($UpFileExt != "xls" && $UpFileExt != "xlsx") {
echo "엑셀파일만 업로드 가능합니다. (xls, xlsx 확장자의 파일포멧)";
exit;
}
//-- 읽을 범위 필터 설정 (아래는 A열만 읽어오도록 설정함 => 속도를 중가시키기 위해)
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
public function readCell($column, $row, $worksheetName = '') {
// Read rows 1 to 7 and columns A to E only
if (in_array($column,range('A','A'))) {
return true;
}
return false;
}
}
$filterSubset = new MyReadFilter();
//업로드된 엑셀파일을 서버의 지정된 곳에 옮기기 위해 경로 적절히 설정
$upload_path = $_SERVER["DOCUMENT_ROOT"]."/Uploads/Excel_".date("Ymd");
$upfile_path = $upload_path."/".date("Ymd_His")."_".$UpFileName;
if(is_uploaded_file($UpFile["tmp_name"])) {
if(!move_uploaded_file($UpFile["tmp_name"],$upfile_path)) {
echo "업로드된 파일을 옮기는 중 에러가 발생했습니다.";
exit;
}
//파일 타입 설정 (확자자에 따른 구분)
$inputFileType = 'Excel2007';
if($UpFileExt == "xls") {
$inputFileType = 'Excel5';
}
//엑셀리더 초기화
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
//데이터만 읽기(서식을 모두 무시해서 속도 증가 시킴)
$objReader->setReadDataOnly(true);
//범위 지정(위에 작성한 범위필터 적용)
$objReader->setReadFilter($filterSubset);
//업로드된 엑셀 파일 읽기
$objPHPExcel = $objReader->load($upfile_path);
//첫번째 시트로 고정
$objPHPExcel->setActiveSheetIndex(0);
//고정된 시트 로드
$objWorksheet = $objPHPExcel->getActiveSheet();
//시트의 지정된 범위 데이터를 모두 읽어 배열로 저장
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
$total_rows = count($sheetData);
foreach($sheetData as $rows) {
$fieldData = $rows["A"]; //A열값을 가져온다.
/* 데이터 처리 */
}
}
.
.
?>
너무 큰 파일을 읽을 경우 메모리 제한을 풀어줘야 한다.
http://jmnote.com/wiki/PHP_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EB%B6%80%EC%A1%B1
ini_set('memory_limit','-1');
http://forum.falinux.com/zbxe/index.php?document_srl=578422&mid=lecture_tip
PHPExcel를 사용해서 내용을 간단하게 입력해보고 다운로드 받을 수 있도록 테스트해볼 예정입니다.
1. 환경 설정
리눅스에서 Apache, PHP 가 설치되어 있어야합니다.
Ubuntu 에서는 apt-get 으로 apache2 와 php5 를 설치하면 됩니다.
윈도우에서는 apmsetup 을 설치하시면 간단합니다.
APMSETUP 홈페이지 주소는 아래와 같습니다.
홈페이지 주소 : http://www.apmsetup.com
리눅스 apache2 의 경우, 기본 홈 디렉토리가 /var/www/ 이며
윈도우에서 apmsetup 을 설치했을 경우, 기본 홈 디렉토리가 C:\APM_Setup\htdocs 입니다.
강좌는 윈도우에서 php_sample.php 라는 파일을 만들고 진행하였습니다.
2. 샘플 파일
PHPExcel 사이트에 받은 PHPExcel_1.7.8-with_documentation-msoffice_format.zip 파일의 압축을 풀고 html 기본 홈 디렉토리에 넣어줍니다.
윈도우에서 진행했으니, C:\APM_Setup\htdocs 안에 PHPExcel 폴더를 복사해줍니다.
아래는 미리 만들어진 기본 소스 입니다.
<?php
require_once 'PHPExcel/Classes/PHPExcel.php';
$objPHPExcel = new PHPExcel();
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename=sample.xls');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
?>
require_once : PHPExcel 관련 PHP 파일을 포함시켜줘야합니다. PHPExcel 안에 Classes/PHPExcel.php 파일의 경로를 적어줍니다.
그 다음 header 에는 PHPExcel의 샘플 내용대로 엑셀 파일을 다운로드 받을 수 있도록 파일명을 정해줍니다.
위의 내용대로 만든 다음, 웹 브라우저에서 주소를 입력해서 테스트를 해보도록 합니다.
주소를 입력하면 아래 그림과 같이 sample.xls 파일을 다운로드 됩니다.
3. 기본 설정 추가
엑셀 파일이 다운로드 되는 것을 확인했으니, 이제 엑셀 파일의 내용을 넣어줄 차례입니다.
PHPExcel을 새로 만들어준다음,
$objPHPExcel = new PHPExcel();
사용이 가능하도록 시트를 설정해줍니다.
$sheet = $objPHPExcel->getActiveSheet();
엑셀의 기본 글꼴을 정해주지 않으면, 영문쪽 글꼴로 선택됩니다. 윈도우 기본 폰트인 '맑은 고딕' 으로 설정해주기 위해서 아래와 같이 설정해 줍니다.
$sheet->getDefaultStyle()->getFont()->setName('맑은 고딕');
폰트 크기를 정하고 싶다면 뒤에 ->setSize를 넣어주면 됩니다.
$sheet->getDefaultStyle()->getFont()->setName('맑은 고딕')->setSize(10);
4. 내용 추가
간단하게 아래와 같이 내용을 추가해주기 위해서 PHP 소스를 추가하도록 하겠습니다.
처음에는 사용하게 될 시트를 선택해줘야 합니다.
아래 명령처럼 제일 첫 번째 시트를 선택하도록 합니다.
$sheetIndex = $objPHPExcel->setActiveSheetIndex(0);
$sheetIndex 에 내용을 추가하면 됩니다.
위의 '제목' 처럼 입력하면 아래와 같이 적어줍니다.
A1 셀에 내용을 '제 목' 이라고 입력해줍니다.
$sheetIndex->setCellValue('A1','제 목');
A1 ~ D1 셀 내용을 합쳐줍니다.
$sheetIndex->mergeCells('A1:D1');
A1 셀의 폰트와 스타일을 정해줍니다. 폰트 크기는 20으로 하고 두껍게 표시하도록 하였습니다.
$sheetIndex->getStyle('A1')->getFont()->setSize(20)->setBold(true);
A1 셀 내용이 중앙 정렬되도록 아래와 같이 입력해줍니다.
$sheetIndex->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
위의 내용을 추가하고 웹 브라우저에서 주소를 입력하면 '제 목'을 볼 수 있습니다.
그 다음 내용을 추가해줄 차례입니다.
아래와 같이 셀주소와 내용을 입력해주면 됩니다.
$sheetIndex ->setCellValue('A2', '하나')
->setCellValue('B2', '둘')
->setCellValue('C2', '셋')
->setCellValue('D2', '넷');
위와 같이 작성한 후에 웹 브라우저에서 입력을 하면 아래 그림과 같은 화면을 볼 수 있습니다.
간단한 내용을 출력하는거지만, 생각외로 정해줄게 많은거 같습니다.
5. 전체 소스
<?php
require_once 'PHPExcel/Classes/PHPExcel.php';
$objPHPExcel = new PHPExcel();
$sheet = $objPHPExcel->getActiveSheet();
// 글꼴
$sheet->getDefaultStyle()->getFont()->setName('맑은 고딕');
$sheetIndex = $objPHPExcel->setActiveSheetIndex(0);
// 제목
$sheetIndex->setCellValue('A1','제 목');
$sheetIndex->mergeCells('A1:D1');
$sheetIndex->getStyle('A1')->getFont()->setSize(20)->setBold(true);
$sheetIndex->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
// 내용
$sheetIndex ->setCellValue('A2', '하나')
->setCellValue('B2', '둘')
->setCellValue('C2', '셋')
->setCellValue('D2', '넷');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename=sample.xls');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
?>
참고용으로 좋음.
http://gyuha.tistory.com/454