A、1=>B、26=>AA...以此類推) function num2alpha($n) { for ($r = ""; $n >= 0; $n = intval($n / 26) - 1) $r = chr($n % 26 + 0x41) . $r; return $r; } //英文轉數字(A=>0、B=>1、AA=>26...以此類推) function alpha2num($a) { $l = strlen($a); $n = 0; for ($i = 0; $i < $l; $i++) $n = $n * 26 + ord($a[$i]) - 0x40; return $n - 1; } try { $department_id = isset($_REQUEST['department_id']) ? $_REQUEST['department_id'] : ''; $user_id = isset($_REQUEST['user_id']) ? $_REQUEST['user_id'] : ''; $search = isset($_REQUEST['search']) ? $_REQUEST['search'] : ''; $sql_str = " SELECT sm.system_name AS '序號', fm.flow_name AS '系統名稱', f.form_key AS '流程名稱', sf.current_assigner AS '當前簽核者', a.name AS '姓名', d.depart_name AS '所屬部門', sf.update_date AS '接收日期' FROM flow AS f LEFT JOIN system_main as sm ON f.system_id = sm.system_id LEFT JOIN flow_main as fm ON f.flow_id = fm.flow_id LEFT JOIN ( SELECT form_key, current_assigner, IF(update_date IS NULL,create_date,update_date) AS update_date, MAX(seq) AS seq FROM subflow WHERE 1 = 1 GROUP BY form_key, current_assigner, update_date ) AS sf ON f.form_key = sf.form_key LEFT JOIN account AS a ON sf.current_assigner = a.accountid LEFT JOIN ( SELECT DISTINCT department_id, name AS depart_name FROM department ) AS d ON a.department_id = d.department_id WHERE 1 =1 AND f.flow_code != 'Z' AND sf.form_key != '' AND sf.form_key IS NOT NULL AND sf.current_assigner != '' AND sf.current_assigner IS NOT NULL "; $sql_str .= !empty($department_id) ? " AND a.department_id = :department_id " : ""; $sql_str .= !empty($user_id) ? " AND sf.current_assigner = :user_id " : ""; if (!empty($search)) { $sql_str .= " AND ( sm.system_name LIKE :search OR fm.flow_name LIKE :search OR f.form_key LIKE :search OR sf.current_assigner LIKE :search OR a.name LIKE :search OR d.department_id LIKE :search OR d.depart_name LIKE :search OR sf.update_date LIKE :search ) "; } $stmt = $conn->prepare($sql_str); !empty($department_id) ? $stmt->bindParam(':department_id', $department_id) : ''; !empty($user_id) ? $stmt->bindParam(':user_id', $user_id) : ''; !empty($search) ? $stmt->bindValue(':search', '%' . $search . '%') : ''; $stmt->execute(); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->execute(); $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setTitle('部門逾期待簽'); // 設定標題 $colTitleArr = []; for ($i = 0; $i < $stmt->columnCount(); $i++) { $columnMeta = $stmt->getColumnMeta($i); $colTitleArr[] = $columnMeta['name']; } // 標題寫入 excel 第一列 for ($i = 0; $i < count($colTitleArr); $i++) $sheet->setCellValue(num2alpha($i) . '1', $colTitleArr[$i]); // 設定內容 $data = $stmt->fetchAll(PDO::FETCH_NUM); $i = 2; foreach ($data as $row) { for ($j = 0; $j < count($row); $j++) { $sheet->setCellValue(num2alpha($j) . $i, $row[$j]); } $i++; } $writer = new Xlsx($spreadsheet); $file_path = dirname(dirname(dirname(__DIR__))) . '/wms/excel/' . 'signed_overdue_date.xlsx'; $writer->save($file_path); try { $writer->save($file_path); // 回傳檔案路徑給 JavaScript echo json_encode(['data' => $file_path]); } catch (Exception $e) { echo 'Error: ' . $e->getMessage(); } exit(); } catch (PDOException $e) { die("ERROR!!!: " . $e->getMessage()); }