TIP게시판

제목 PHPExcel를 CI속으로~
글쓴이 터프키드 작성시각 2010/03/30 11:56:57
댓글 : 6 추천 : 0 스크랩 : 1 조회수 : 42618   RSS
웅파님이 올려주신 팁을 한글화 한 정도 입니다;
( 웅파님이 올려주신 팁 http://codeigniter-kr.org/tip/view/378/page/1/q/excel )

1. PHPExcel 을 다운로드 받으세요 http://phpexcel.codeplex.com/releases/view/10719
저는 1.7.2 버전을 사용하였습니다.

2. /system/application 아래 excelWriter 라는 이름으로 디렉토리를 만듭니다.. 이름은 아무거나 상관없어요
웅파님 팁에는 my_classes로 되어있는데... 전 확장 모듈별로 디렉토리를 따로 만들려고.. ( /system/application/pear, /system/application/excelWriter ...)

3. application/config/config.php 파일을 열어 $config['enable_hooks'] = FALSE; 를 찾아 TRUE 로 변경해주세요

4. application/config/hooks.php 파일을 열어 아래와 같이 추가합니다
$hook['pre_controller'][] = array(
'class' => 'ExcelWriter',
'function' => 'index',
'filename' => 'ExcelWriter.php',
'filepath' => 'hooks'
);
5. /system/application/hooks/ 디렉토리에 ExcelWriter.php 파일을 생성하고 아래와 같이 입력해주세요
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
 
class ExcelWriter
{
/**
* includes the directory application\my_classes\Classes in your includes directory
*
*/
	function index()
	{
		//includes the directory application\my_classes\Classes\
		ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.BASEPATH.'application/excelWriter/Classes/');
		ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.BASEPATH.'application/excelWriter/Classes/PHPExcel/');
		ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.BASEPATH.'application/excelWriter/Classes/PHPExcel/Writer');
	}
}
?>
로더를 생성하고 클래스를 로드해서 쓰려고 하다보니 패스가 세개가 됐네요;; 

6. 마지막으로 /system/application/libraries/ 에 ExcelWriterLoader.php 를 생성하고 아래와 같이 입력해주세요.
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

class ExcelWriterLoader {
	function load($class, $options = null){
		require_once($class.'.php');
		$classname = $class;
		
		if(is_null($options)){
			return new $classname();
		}else{
			return new $classname($options);
		}
	}
}

?>

8. 마지막이 아니었군요 ㅎㅎ; 
로더가 클래스를 잘~ 읽어올 수 있게 파일이름 두개만 수정합니다~
/system/application/excelWriter/Classes/PHPExcel/Writer 에 들어가보시면 Excel5.php, Excel2007.php 파일 두개가 있어요
둘다 파일 안의 클래스명과 동일하게 파일명을 바꿔줍니다.
( Excel5.php => PHPExcel_Writer_Excel5.php , Excel2007.php => PHPExcel_Writer_Excel2007 )
나중에 html이나 csv 등을 사용할때도 로더로 읽으시려면 동일하게 바꿔주셔야 합니다

9. 실제로 사용한 코드 입니다.

// Create new PHPExcel object
		echo date('H:i:s') . " Create new PHPExcel object\n";

		$this->load->library("excelwriterloader");
		$exObj = $this->excelwriterloader->load("PHPExcel");
		
		// Set properties
		echo date('H:i:s') . " Set properties\n";
		$exObj->getProperties()->setCreator("BazZ");
		$exObj->getProperties()->setLastModifiedBy("BazZ");
		$exObj->getProperties()->setTitle("TestExcel");
		$exObj->getProperties()->setSubject("");
		// Set row height
		$exObj->getActiveSheet()->getRowDimension(1)->setRowHeight(50);
		$exObj->getActiveSheet()->getRowDimension(2)->setRowHeight(25);
		// Set column width
		$exObj->getActiveSheet()->getColumnDimension('A')->setWidth(5);
		$exObj->getActiveSheet()->getColumnDimension('B')->setWidth(30);
		$exObj->getActiveSheet()->getColumnDimension('C')->setWidth(30);
		$exObj->getActiveSheet()->getColumnDimension('D')->setWidth(40);
		$exObj->getActiveSheet()->getColumnDimension('E')->setWidth(15);
		$exObj->getActiveSheet()->getColumnDimension('F')->setWidth(15);
		$exObj->getActiveSheet()->getColumnDimension('G')->setWidth(30);
		$exObj->getActiveSheet()->getColumnDimension('H')->setWidth(10);
		$exObj->getActiveSheet()->getColumnDimension('I')->setWidth(20);
		$exObj->getActiveSheet()->getColumnDimension('J')->setWidth(20);
		$exObj->getActiveSheet()->getColumnDimension('K')->setWidth(20);
		$exObj->getActiveSheet()->getColumnDimension('L')->setWidth(20);
		$exObj->getActiveSheet()->getColumnDimension('M')->setWidth(20);
		$exObj->getActiveSheet()->getColumnDimension('N')->setWidth(20);
		//Merge cells (warning: the row index is 0-based)
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(0,1,13,1);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(0,2,13,2);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(0,3,0,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(1,3,1,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(2,3,3,3);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(2,4,2,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(3,4,3,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(4,3,4,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(5,3,5,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(6,3,6,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(7,3,9,3);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(7,4,7,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(8,4,9,4);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(10,3,10,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(11,3,11,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(12,3,12,5);
		$exObj->getActiveSheet()->mergeCellsByColumnAndRow(13,3,13,5);
		//Modify cell's style
		$exObj->getActiveSheet()->getStyle('A1')->applyFromArray(
		array(
		'font' => array(
		'name'         => 'Times New Roman',
		'bold'         => true,
		'italic'    => false,
		'size'        => 20
		),
		'alignment' => array(
		'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
		'vertical'   => PHPExcel_Style_Alignment::VERTICAL_CENTER,
		'wrap'       => true
		)
		)
		);
		$exObj->getActiveSheet()->getStyle('A2')->applyFromArray(
		array(
		'font' => array(
		'name'         => 'Times New Roman',
		'bold'         => true,
		'italic'    => false,
		'size'        => 14
		),
		'alignment' => array(
		'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT,
		'vertical'   => PHPExcel_Style_Alignment::VERTICAL_CENTER,
		'wrap'       => true
		)
		)
		);
		$exObj->getActiveSheet()->duplicateStyleArray(
		array(
		'font' => array(
		'name'         => 'Times New Roman',
		'bold'         => true,
		'italic'    => false,
		'size'        => 12
		),
		'borders' => array(
		'top'        => array('style' => PHPExcel_Style_Border::BORDER_DOUBLE),
		'bottom'    => array('style' => PHPExcel_Style_Border::BORDER_DOUBLE),
		'left'        => array('style' => PHPExcel_Style_Border::BORDER_DOUBLE),
		'right'        => array('style' => PHPExcel_Style_Border::BORDER_DOUBLE)
		),
		'alignment' => array(
		'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
		'vertical'   => PHPExcel_Style_Alignment::VERTICAL_CENTER,
		'wrap'       => true
		)
		),
		'A3:N5'
		);
		// Add some data
		echo date('H:i:s') . " Add some data\n";
		$exObj->setActiveSheetIndex(0);
		$exObj->getActiveSheet()->SetCellValue('A1', 'Try PHPExcel with CodeIgniter');
		$exObj->getActiveSheet()->SetCellValue('A2',"Subtitle here");
		$exObj->getActiveSheet()->SetCellValue('A3',"No.");
		$exObj->getActiveSheet()->SetCellValue('B3',"Name");
		$exObj->getActiveSheet()->SetCellValue('C3',"Number");
		$exObj->getActiveSheet()->SetCellValue('C4',"Code");
		$exObj->getActiveSheet()->SetCellValue('D4',"Register");
		$exObj->getActiveSheet()->SetCellValue('E3',"Space (M2)");
		$exObj->getActiveSheet()->SetCellValue('F3',"Year");
		$exObj->getActiveSheet()->SetCellValue('G3',"Location");
		
		// Rename sheet
		echo date('H:i:s') . " Rename sheet\n";
		$exObj->getActiveSheet()->setTitle('Try PHPExcel with CodeIgniter');
		
		// Save Excel 2003 file
		echo date('H:i:s') . " Write to Excel2003 format\n";
		
		$objWriter = $this->excelwriterloader->load("PHPExcel_Writer_Excel5", $exObj);
		
		//$objWriter = new PHPExcel_Writer_Excel5($exObj);
		
		$file_name = "/files/excel/data_".date('YmdHis', time()).".xls";
		
		$objWriter->save($_SERVER['DOCUMENT_ROOT'].$file_name);
아마.. 잘 될거라 생각합니다;


 다음글 set_value 시 htmlspecialchars 가... (3)
 이전글 설정없이 GET으로 전달한 Query String 가져... (6)

댓글

터프키드 / 2010/03/30 13:53:17 / 추천 0
 ㅜㅜ 2007은 잘안되네요
변종원(웅파) / 2010/03/30 14:52:07 / 추천 0

한글화된 팁 감사합니다. ^^

2007은 포맷이 조금 틀릴겁니다.

kirrie / 2010/03/30 22:14:14 / 추천 0
스쿨에 최근 버전에 대응하는 라이브러리가 올라왔던 것으로 기억합니다. 팁택한번 훑어보심이.. ㅎㅎ;;
가우리언 / 2010/03/31 00:06:15 / 추천 0
Excel 2007 로의 출력은 아래와 같은 방식으로 하시면 된답니다. 좀더 자세한 설명은 PHPExcel 다운로드 받으시면 워드로 된 문서가 있으며, 샘플코드들을 참고하시면 큰 도움이 될 거에요.
// 파일 다운로드 (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="IP_LIST.xlsx"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');

터프키드 / 2010/03/31 12:10:33 / 추천 0
두분 감사합니다;
방법을 찾긴 했지만 두분이 말씀하신 부분과 다르니 두분이 말씀하신것도  해봐야겟네요

일단 제가 한 방법은
파일명 변경으로 인해서 2007 관련 파일들이 경로 에러를 뱉는데요
Writer/Excel2007 하위에 있는 모든 파일을 열어
Excel2007.php 을 PHPExcel_Writer_Excel2007.php 로 변경했습니다

그리고 ZipArchive 에러가 뜨는데 윈도우 환경이든 리눅스 환경이든 php_zip 모듈이 활성화 안되어있으면 뜨네요
php.ini 를 열어서 주석풀고 하니 됩니다

소스는
// < Excel 2003 
		//$objWriter = $this->excelwriterloader->load("PHPExcel_Writer_Excel5", $exObj);
		//$file_path = "/files/excel/";
		//$file_name = "name_".date('YmdHis', time()).".xls";
		
		// > Excel 2007
		$objWriter = $this->excelwriterloader->load("PHPExcel_Writer_Excel2007", $exObj);
		$file_path = "/files/excel/";
		$file_name = "name_".date('YmdHis', time()).".xlsx";
입니다..





대마불사 / 2012/04/13 14:25:28 / 추천 0
저는 위 설명처럼 했는데 잘 안되더군요...
포럼에서 찾은 방법으로 하니 되네요..
혹시 안되시는 분들 참고하세요~

 1) Downloaded and installed CI 2.0 (welcome screen ok)

2) Downloaded PHPExcel 1.7.6
3) Created “pxl” folder to libraries (/application/libraries/pxl)
4) Copied PHPExcel classes to this folder, both PHPExcel.php and PHPExcel-folder (/application/libraries/pxl/PHPExcel.php & /application/libraries/pxl/PHPExcel/)
5) Created pxl.php to libraries folder with this data:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/** PHPExcel */
class Pxl
{
   
function __construct()
  
{
      
require_once APPPATH.'/libraries/pxl/PHPExcel.php';
      require_once 
APPPATH.'/libraries/pxl/PHPExcel/IOFactory.php';
  
}

6) Added function excel1 to welcome.php controller

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class 
Welcome extends CI_Controller {

    
function __construct()
    
{
        parent
::__construct();
    
}

    
function index()
    
{
        $this
->load->view('welcome_message');
    
}
    
     
function excel1()
      
{
 
      $this
->load->library("pxl");
//    $this->load->library(“pxl/PHPExcel/iofactory”);

      
$objPHPExcel = new PHPExcel();
      
$objPHPExcel->getProperties()->setTitle("title")
                  ->
setDescription("description");

  
// Assign cell values
      
$objPHPExcel->setActiveSheetIndex(0);
      
$objPHPExcel->getActiveSheet()->setCellValue("A1""cell value here 111");

      
$objPHPExcel->createSheet();
      
$objPHPExcel->setActiveSheetIndex(1);
      
$objPHPExcel->getActiveSheet()->setCellValue("A1""cell value here 222");
   
// Save it as an excel 2003 file
      
$objWriter IOFactory::createWriter($objPHPExcel"Excel5");
      
$objWriter->save("reports/nameoffile.xls");
      
$this->index(); //CALL DISPLAY
      

      

7) Tried to call function as http://localhost/index.php/welcome/excel1