193 lines
6.6 KiB
PHP
193 lines
6.6 KiB
PHP
|
|
<?php
|
||
|
|
// 에러 표시 설정 (개발 중에는 활성화, 배포 시 비활성화 권장)
|
||
|
|
ini_set('display_errors', 0);
|
||
|
|
ini_set('log_errors', 1);
|
||
|
|
ini_set('error_log', '../error_log.txt'); // 에러 로그 파일 저장 경로
|
||
|
|
error_reporting(E_ALL);
|
||
|
|
|
||
|
|
// JSON 응답 헤더 설정
|
||
|
|
header('Content-Type: application/json');
|
||
|
|
|
||
|
|
// JSON 응답을 생성하는 함수
|
||
|
|
function sendResponse($success, $data = null, $message = '') {
|
||
|
|
$response = ['success' => $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 {
|
||
|
|
// 요청 방식 확인
|
||
|
|
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();
|
||
|
|
|
||
|
|
// 엑셀 1행(A1:F1) 병합 및 스타일 설정
|
||
|
|
$sheet->mergeCells('A1:F1');
|
||
|
|
foreach ($data as $row) {
|
||
|
|
$dateStr = $row['등록일자'];
|
||
|
|
}
|
||
|
|
|
||
|
|
$sheet->setCellValue('A1', $dateStr . ' 경동화물');
|
||
|
|
$sheet->getStyle('A1:F1')->applyFromArray([
|
||
|
|
'font' => [
|
||
|
|
'bold' => true,
|
||
|
|
'size' => 28 // 글씨 크기 2배
|
||
|
|
],
|
||
|
|
'alignment' => [
|
||
|
|
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER
|
||
|
|
]
|
||
|
|
]);
|
||
|
|
|
||
|
|
// 엑셀 1행(G1:K1) 병합 및 세로 정렬 (텍스트 회전)
|
||
|
|
$sheet->mergeCells('G1:K1');
|
||
|
|
$sheet->setCellValue('G1', "(김포양촌누산1108 영업소 전 983 0406 팩 984 1964)");
|
||
|
|
$sheet->getStyle('G1:K1')->applyFromArray([
|
||
|
|
'alignment' => [
|
||
|
|
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
|
||
|
|
'vertical' => PHPExcel_Style_Alignment::VERTICAL_BOTTOM,
|
||
|
|
'textRotation' => 90 // 텍스트 90도 회전
|
||
|
|
],
|
||
|
|
'font' => [
|
||
|
|
'bold' => true,
|
||
|
|
'size' => 10
|
||
|
|
]
|
||
|
|
]);
|
||
|
|
|
||
|
|
// 엑셀 헤더 설정
|
||
|
|
$headers = [
|
||
|
|
'번호', '받을 분', '연락처', '도착지 주소',
|
||
|
|
'보내는 사람', '품명/현장명', '포장', '수량', '운임',
|
||
|
|
'운임구분', '물품가액'
|
||
|
|
];
|
||
|
|
|
||
|
|
// 헤더 삽입 (2행부터 시작)
|
||
|
|
$col = 'A';
|
||
|
|
foreach ($headers as $header) {
|
||
|
|
$sheet->setCellValue($col . '2', $header);
|
||
|
|
$col++;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 헤더 행 스타일 설정 (배경색 + 테두리 추가)
|
||
|
|
$headerStyle = [
|
||
|
|
'fill' => [
|
||
|
|
'type' => PHPExcel_Style_Fill::FILL_SOLID,
|
||
|
|
'startcolor' => ['rgb' => 'D3D3D3'] // 연한 회색
|
||
|
|
],
|
||
|
|
'alignment' => [
|
||
|
|
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER
|
||
|
|
],
|
||
|
|
'borders' => [
|
||
|
|
'allborders' => [
|
||
|
|
'style' => PHPExcel_Style_Border::BORDER_THIN,
|
||
|
|
'color' => ['rgb' => '000000'] // 검정색 테두리
|
||
|
|
]
|
||
|
|
]
|
||
|
|
];
|
||
|
|
$sheet->getStyle('A2:K2')->applyFromArray($headerStyle);
|
||
|
|
|
||
|
|
// 각 열 너비 설정
|
||
|
|
$columnWidths = [
|
||
|
|
'A' => 7, // 번호
|
||
|
|
'B' => 15, // 받을 분
|
||
|
|
'C' => 15, // 연락처
|
||
|
|
'D' => 45, // 도착지 주소
|
||
|
|
'E' => 15, // 보내는 사람
|
||
|
|
'F' => 25, // 품명/현장명
|
||
|
|
'G' => 8, // 포장
|
||
|
|
'H' => 5, // 수량
|
||
|
|
'I' => 8, // 운임
|
||
|
|
'J' => 12, // 운임구분
|
||
|
|
'K' => 12 // 물품가액
|
||
|
|
];
|
||
|
|
foreach ($columnWidths as $column => $width) {
|
||
|
|
$sheet->getColumnDimension($column)->setWidth($width);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 데이터 삽입 (3행부터 시작)
|
||
|
|
$rowNumber = 3;
|
||
|
|
foreach ($data as $row) {
|
||
|
|
$sheet->setCellValue("A{$rowNumber}", $row['번호'] ?? '');
|
||
|
|
$sheet->setCellValue("B{$rowNumber}", $row['받을 분'] ?? '');
|
||
|
|
$sheet->setCellValue("C{$rowNumber}", $row['연락처'] ?? '');
|
||
|
|
$sheet->setCellValue("D{$rowNumber}", $row['도착지 주소'] ?? '');
|
||
|
|
$sheet->setCellValue("E{$rowNumber}", $row['보내는 사람'] ?? '');
|
||
|
|
$sheet->setCellValue("F{$rowNumber}", $row['품명/현장명'] ?? '');
|
||
|
|
$sheet->setCellValue("G{$rowNumber}", $row['포장'] ?? '');
|
||
|
|
$sheet->setCellValue("H{$rowNumber}", $row['수량'] ?? '');
|
||
|
|
|
||
|
|
// 운임 및 물품가액은 오른쪽 정렬
|
||
|
|
$sheet->setCellValue("I{$rowNumber}", $row['운임'] ?? '');
|
||
|
|
$sheet->setCellValue("J{$rowNumber}", $row['운임구분'] ?? '');
|
||
|
|
$sheet->setCellValue("K{$rowNumber}", $row['물품가액'] ?? '');
|
||
|
|
|
||
|
|
$rowNumber++;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 데이터 범위의 테두리 추가
|
||
|
|
$dataRange = 'A2:K' . ($rowNumber - 1);
|
||
|
|
$sheet->getStyle($dataRange)->applyFromArray([
|
||
|
|
'borders' => [
|
||
|
|
'allborders' => [
|
||
|
|
'style' => PHPExcel_Style_Border::BORDER_THIN,
|
||
|
|
'color' => ['rgb' => '000000'] // 검정색 테두리
|
||
|
|
]
|
||
|
|
]
|
||
|
|
]);
|
||
|
|
|
||
|
|
// 운임 및 물품가액 열 오른쪽 정렬 적용
|
||
|
|
$sheet->getStyle("I3:I$rowNumber")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
|
||
|
|
$sheet->getStyle("K3:K$rowNumber")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
|
||
|
|
|
||
|
|
// 엑셀 파일 저장 경로 설정
|
||
|
|
$filename = 'delivery_fee_' . 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());
|
||
|
|
sendResponse(false, null, '엑셀 파일 생성 중 오류: ' . $e->getMessage());
|
||
|
|
}
|
||
|
|
?>
|