내가 한 노력들

PhpSpreadSheet를 이용하여, Excel파일 일기 / 쓰기 본문

IT 공부/PHP

PhpSpreadSheet를 이용하여, Excel파일 일기 / 쓰기

JONGI-N CHOI 2022. 11. 2. 17:57

환경은 codeigniter 4에서, excel 파일에대해 읽기 쓰기를 하기위한 코드입니다. 

 

 

public function import() {
    $file       = $this->request->getFile('file');
    $extension  = $file->getClientExtension();
    $randomName = $file->getRandomName();

    $file->move($randomName);

    $reader    = '';
    switch ($extension) {
    
        case "xlsx":
            $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
            break;

        case "xls":
            $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
            break;
    }       

    $reader->setReadDataOnly(TRUE);

    $spreadsheet = $reader->load($randomName);
    $sheetData   = $spreadsheet->getSheet(0)->toArray();
}

Excel파일을 읽어, Spreadsheet객체 생성

$reader      = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load(file);

switch문을 이용해서, 확장자에 따라 다른 Reader를 통해서 파일을 load하도록 하는 과정

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);

IOFactory를 사용하면, 자동적으로 확장자에 맞는 spreadsheet를 만드는 것도 가능합니다.

 

 

sheet의 데이터를 읽기 

$sheetData   = $spreadsheet->getSheet(0)->toArray();

getSheet(0) 를 통해서, 첫 번째 sheet를 가르키게 됩니다. 

 

getActiveSheet()를 사용하면, 활성화된 sheet를 선택하게 됩니다. (활성화된 sheet는, Excel 저장시에 선택된 sheet)

 

getSheetByName()를 사용하면, sheet의 이름으로 선택이 가능합니다. 

 

그 밖에도, setActiveSheetIndex() 및 setActiveSheetIndexByName()등이 존재

 

 

새로운 sheet 생성

$sheet = $spreadsheet->createSheet();

데이터를 작성하기 위한, 새로운 sheet를 생성

 

sheet 이름 설정

$spreadsheet->setTitle('new sheet');

sheet의 이름을 지정하는 것도 가능 ( 지정하지 않으면 Worksheet가 디폴트)

 

cell에 데이터 쓰기 

$sheet->setCellValue("A1", "value");

 

setCellValue()를 사용하여, 원하는 셀에 데이터를 입력할 수 있습니다. 

첫 번째, 파라미터로는 셀의 위치 (A1)

두 번째, 파라미터로는 입력 데이터 (value)

 

cell에 데이터와 데이터 타입 설정

$sheet->getCell("A1")->setValueExplicit("0123457", DataType::TYPE_STRING);

원하는 셀에 데이터와 데이터 타입을 설정하고 싶은 경우에 사용합니다.

왜 굳이 데이터의 타입을 설정해야하냐면, 위와같이 데이터가 숫자형식인 경우에는 excel이 자동적으로 데이터 타입을 숫자로 인식하여 맨 앞에 "0"가 있는 경우 자동적으로 삭제가 됩니다. 그러한 경우를 막기위해서 string타입이라는 것을 명시합니다. 

 

여러가지 스타일 변경

수평정렬

$sheet->getStyle('A:D')->getAlignment()->setHorizontal('center');

수직정렬

$sheet->getStyle('A:D')->getAlignment()->setVertical('center');

행 너비

$sheet->getColumnDimension('A')->setWidth(120, 'pt');

원하는 행의 너비를 지정할 수 있고, 값과 단위*를 지정할 수 있습니다.

 

*단위 

pt (points), px (pixels), pc (pica), in (inches), cm (centimeters) and mm (millimeters)

 

열 높이

$sheet->getDefaultRowDimension()->setRowHeight(20);

각 열의 높이를 지정할 수 있습니다.

 

sheet 줌

$sheet->getSheetView()->setZoomScale(125);

확대 / 축소를 할 수 있고, 125% 확대를 의미

 

폰트 지정

$spreadsheet->getDefaultStyle()->getFont()->setName('Meiryo');

원하는 폰트를 지정할 수 있습니다 .

 

셀 배경색 변경

$sheet->getStyle("A1:C1")
      ->getFill()
      ->setFillType(Fill::FILL_SOLID)
      ->getStartColor()
      ->setARGB(FFFF0000);

getStyle()를 통해서 원하는 구역을 설정하고,

배경색은 ARGB로써 입력, 즉 FFFF0000는 alpha값이 255, R 255, G 0, B 0으로 빨강색의 배경색이 됩니다.