$success]; if ($data !== null) { $response['filename'] = $data; } if ($message !== '') { $response['message'] = $message; } echo json_encode($response); exit; } // 사용자 정의 에러 핸들러 설정 (모든 오류를 예외로 변환) set_error_handler(function($errno, $errstr, $errfile, $errline) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline); }); try { // POST 요청인지 확인 if ($_SERVER['REQUEST_METHOD'] != 'POST') { sendResponse(false, null, '잘못된 요청 방법입니다.'); } // JSON으로 데이터 받기 $data = json_decode(file_get_contents('php://input'), true); // JSON 디코딩 오류 및 데이터 유무 확인 if (json_last_error() !== JSON_ERROR_NONE || empty($data)) { sendResponse(false, null, '유효하지 않은 데이터 형식이거나 데이터가 없습니다.'); } // PHPExcel 라이브러리 포함 (경로 확인 필요) $phpExcelPath = '../PHPExcel_1.8.0/Classes/PHPExcel.php'; if (!file_exists($phpExcelPath)) { sendResponse(false, null, 'PHPExcel 라이브러리가 존재하지 않습니다. 경로를 확인하세요.'); } require $phpExcelPath; // 새로운 PHPExcel 객체 생성 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $sheet = $objPHPExcel->getActiveSheet(); // 헤더 설정 (14개 컬럼) $headers = [ '번호', '출고일', '현장명', '하차업체명', '상차지', '물류업체명', '차량톤수', '금 액', '부가세', '합계', '착/선불', '차량번호', '기사 연락처', '비고' ]; $col = 'A'; foreach ($headers as $header) { $sheet->setCellValue($col . '1', $header); $col++; } // 헤더 행에 음영 처리 추가 (예: 연한 회색 배경) $headerRange = 'A1:N1'; $sheet->getStyle($headerRange)->getFill()->applyFromArray([ 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'startcolor' => [ 'rgb' => 'D3D3D3' // 연한 회색 ], ]); // 각 열의 너비 설정 (한글 문자 수 기준) $columnWidths = [ 'A' => 10, // 번호 'B' => 15, // 출고일 'C' => 30, // 현장명 'D' => 20, // 하차업체명 'E' => 20, // 상차지 'F' => 20, // 물류업체명 'G' => 15, // 차량톤수 'H' => 15, // 금 액 'I' => 15, // 부가세 'J' => 15, // 합계 'K' => 10, // 착/선불 'L' => 20, // 차량번호 'M' => 20, // 기사 연락처 'N' => 30, // 비고 ]; foreach ($columnWidths as $column => $width) { $sheet->getColumnDimension($column)->setWidth($width); } // 전체 데이터 범위를 가운데 정렬으로 설정 $dataRange = 'A1:N' . (count($data) + 1); $sheet->getStyle($dataRange)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); // 특정 열의 데이터 정렬 설정 // 전체 데이터를 좌측 정렬로 설정 $dataRange = 'A2:N' . (count($data) + 1); $sheet->getStyle($dataRange)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); // 금액 관련 열 (H, I, J)만 우측 정렬로 변경 $sheet->getStyle('H2:H' . (count($data) + 1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); $sheet->getStyle('I2:I' . (count($data) + 1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); $sheet->getStyle('J2:J' . (count($data) + 1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); // 데이터 채우기 $rowNumber = 2; foreach ($data as $row) { // 각 필드의 존재 여부 확인 및 기본값 설정 $number = isset($row['번호']) ? $row['번호'] : ''; $releaseDate = isset($row['출고일']) ? $row['출고일'] : ''; $workplacename = isset($row['현장명']) ? $row['현장명'] : ''; $unloadingCompany= isset($row['하차업체명']) ? $row['하차업체명'] : ''; $loadingPlace = isset($row['상차지']) ? $row['상차지'] : ''; $logisticsCompany= isset($row['물류업체명']) ? $row['물류업체명'] : ''; $vehicleTon = isset($row['차량톤수']) ? $row['차량톤수'] : ''; $amount = isset($row['금 액']) ? $row['금 액'] : ''; $tax = isset($row['부가세']) ? $row['부가세'] : ''; $total = isset($row['합계']) ? $row['합계'] : ''; $paymentMethod = isset($row['착/선불']) ? $row['착/선불'] : ''; $vehicleNumber = isset($row['차량번호']) ? $row['차량번호'] : ''; $driverContact = isset($row['기사 연락처']) ? $row['기사 연락처'] : ''; $remarks = isset($row['비고']) ? $row['비고'] : ''; // 데이터 삽입 $sheet->setCellValue("A{$rowNumber}", $number); $sheet->setCellValue("B{$rowNumber}", $releaseDate); $sheet->setCellValue("C{$rowNumber}", $workplacename); $sheet->setCellValue("D{$rowNumber}", $unloadingCompany); $sheet->setCellValue("E{$rowNumber}", $loadingPlace); $sheet->setCellValue("F{$rowNumber}", $logisticsCompany); $sheet->setCellValue("G{$rowNumber}", $vehicleTon); $sheet->setCellValue("H{$rowNumber}", $amount); $sheet->setCellValue("I{$rowNumber}", $tax); $sheet->setCellValue("J{$rowNumber}", $total); $sheet->setCellValue("K{$rowNumber}", $paymentMethod); $sheet->setCellValue("L{$rowNumber}", $vehicleNumber); $sheet->setCellValue("M{$rowNumber}", $driverContact); $sheet->setCellValue("N{$rowNumber}", $remarks); $rowNumber++; } // 엑셀 파일 저장 경로 설정 $filename = 'deliveryfee_' . date('YmdHis') . '.xlsx'; $filePath = '../excelsave/' . $filename; // PHPExcel Writer 설정 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); // 엑셀 파일 저장 $objWriter->save($filePath); // 파일이 정상적으로 저장되었는지 확인 if (file_exists($filePath)) { sendResponse(true, $filePath, ''); } else { sendResponse(false, null, '엑셀 파일을 저장하지 못했습니다.'); } } catch (Exception $e) { // 에러 로그에 기록 error_log($e->getMessage()); // JSON 응답으로 에러 메시지 전송 sendResponse(false, null, '엑셀 파일 생성 중 오류가 발생했습니다: ' . $e->getMessage()); } ?>