diff --git a/application/admin/controller/Order.php b/application/admin/controller/Order.php index d160404..e2fcc4c 100644 --- a/application/admin/controller/Order.php +++ b/application/admin/controller/Order.php @@ -1139,7 +1139,7 @@ class Order extends Backend return $result->getData()['rows'] ?? []; }; - $this->exportExcelByStream($columns, $fetchData, '订单导出_' . date('Ymd_His') . '.xlsx'); + $this->exportCsvByStream($columns, $fetchData, '订单导出_' . date('Ymd_His') . '.xlsx'); } diff --git a/application/common/controller/Backend.php b/application/common/controller/Backend.php index 56745ff..1357357 100755 --- a/application/common/controller/Backend.php +++ b/application/common/controller/Backend.php @@ -5,7 +5,7 @@ namespace app\common\controller; use app\admin\library\Auth; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; -use PhpOffice\PhpSpreadsheet\Writer\Xlsx; +use PhpOffice\PhpSpreadsheet\Writer\Csv; use think\Config; use think\Controller; use think\Db; @@ -766,12 +766,10 @@ class Backend extends Controller return $res; } - protected function exportExcelByStream(array $columns, callable $fetchData, string $filename = '导出.xlsx', int $limit = 1000) + protected function exportCsvByStream(array $columns, callable $fetchData, string $filename = '导出.csv', int $limit = 1000) { $page = 1; $rowIndex = 2; - if (ob_get_level()) ob_end_clean(); - ob_clean(); ini_set('memory_limit', '512M'); set_time_limit(0); @@ -786,8 +784,11 @@ class Backend extends Controller $spreadsheet->setActiveSheetIndex(0); $sheet = $spreadsheet->getActiveSheet(); - $writer = new Xlsx($spreadsheet); - $writer->setPreCalculateFormulas(false); + $writer = new Csv($spreadsheet); + $writer->setDelimiter(','); // 可改为 \t 导出为 TSV + $writer->setEnclosure('"'); + $writer->setLineEnding("\r\n"); + $writer->setSheetIndex(0); // 获取字段映射 $titles = array_column($columns, 'title'); @@ -818,15 +819,19 @@ class Backend extends Controller $page++; } while ($count === $limit); - // 输出为下载流 - $filename = $filename ?: ('导出_' . date('Ymd_His') . '.xlsx'); - header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + // 输出为 CSV 下载流 + $filename = $filename ?: ('导出_' . date('Ymd_His') . '.csv'); + + header('Content-Type: text/csv; charset=UTF-8'); header('Content-Disposition: attachment;filename="' . $filename . '"'); header('Cache-Control: max-age=0'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Pragma: public'); + // 输出 UTF-8 BOM 防止 Excel 乱码 + echo "\xEF\xBB\xBF"; + $writer->save('php://output'); $spreadsheet->disconnectWorksheets(); unset($spreadsheet);