141 lines
4.6 KiB
PHP
141 lines
4.6 KiB
PHP
<?php
|
||
|
||
namespace app\admin\controller;
|
||
|
||
use think\Controller;
|
||
use think\Db;
|
||
use app\bj\controller\Common;
|
||
use think\Log;
|
||
use \think\Validate;
|
||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
||
use PhpOffice\PhpSpreadsheet\Style\Border;
|
||
use PhpOffice\PhpSpreadsheet\Style\Fill;
|
||
use PhpOffice\PhpSpreadsheet\Style\Alignment;
|
||
|
||
class Download extends Controller{
|
||
|
||
protected $ceshiyong_token = 'caadd1be045a65f30b92aa805f1de54a';
|
||
|
||
// // 测试后端判断是否微信环境
|
||
// function is_wechat() {
|
||
// // 获取 User-Agent 字符串
|
||
// $userAgent = $_SERVER['HTTP_USER_AGENT'];
|
||
|
||
// // 检查 User-Agent 字符串中是否包含 "MicroMessenger"
|
||
// if (strpos($userAgent, 'MicroMessenger') !== false) {
|
||
// echo "是微信浏览器";
|
||
// }else{
|
||
// echo "不是微信浏览器";
|
||
// }
|
||
// }
|
||
|
||
/**
|
||
* 下载 Excel 文件
|
||
*
|
||
* @param array $data 要导出的数据
|
||
* @param string $filename 文件名
|
||
* @return void
|
||
*/
|
||
public function downloadExcel($ceshiyong_data, $filename = 'data.xlsx')
|
||
{
|
||
// 创建一个新的 Spreadsheet 对象
|
||
$spreadsheet = new Spreadsheet();
|
||
$sheet = $spreadsheet->getActiveSheet();
|
||
|
||
// 获取列数
|
||
$columnCount = count($ceshiyong_data[0]);
|
||
|
||
// 添加标题到工作表中
|
||
$titles = $ceshiyong_data[0];
|
||
for ($colIndex = 0; $colIndex < $columnCount; $colIndex++) {
|
||
$sheet->setCellValueByColumnAndRow($colIndex + 1, 1, $titles[$colIndex]);
|
||
}
|
||
|
||
// 添加数据到工作表中
|
||
$data = array_slice($ceshiyong_data, 1);
|
||
foreach ($data as $rowIndex => $rowData) {
|
||
for ($colIndex = 0; $colIndex < $columnCount; $colIndex++) {
|
||
$sheet->setCellValueByColumnAndRow($colIndex + 1, $rowIndex + 2, $rowData[$colIndex]);
|
||
}
|
||
}
|
||
|
||
// 设置表头样式
|
||
$headerStyle = [
|
||
'font' => [
|
||
'bold' => true,
|
||
],
|
||
'fill' => [
|
||
'fillType' => Fill::FILL_SOLID,
|
||
'startColor' => [
|
||
'argb' => 'FFFFC000', // 橙色
|
||
],
|
||
],
|
||
'alignment' => [
|
||
'horizontal' => Alignment::HORIZONTAL_CENTER,
|
||
],
|
||
'borders' => [
|
||
'allBorders' => [
|
||
'borderStyle' => Border::BORDER_THIN,
|
||
],
|
||
],
|
||
];
|
||
$sheet->getStyle('A1:' . $this->getExcelColumnName($columnCount) . '1')->applyFromArray($headerStyle);
|
||
|
||
// 设置所有内容居中
|
||
$allContentStyle = [
|
||
'alignment' => [
|
||
'horizontal' => Alignment::HORIZONTAL_CENTER,
|
||
],
|
||
'borders' => [
|
||
'allBorders' => [
|
||
'borderStyle' => Border::BORDER_THIN,
|
||
],
|
||
],
|
||
];
|
||
$sheet->getStyle('A1:' . $this->getExcelColumnName($columnCount) . (count($ceshiyong_data) + 1))->applyFromArray($allContentStyle);
|
||
|
||
// 设置斑马纹效果
|
||
$rowCount = count($ceshiyong_data) - 1; // 数据行数
|
||
for ($rowIndex = 1; $rowIndex <= $rowCount; $rowIndex++) {
|
||
$row = $rowIndex + 1; // 数据行从第二行开始
|
||
$rowStyle = [
|
||
'fill' => [
|
||
'fillType' => Fill::FILL_SOLID,
|
||
'startColor' => [
|
||
'argb' => ($rowIndex % 2 == 0) ? 'FFDDDDDD' : 'FFFFFFFF', // 偶数行浅灰色,奇数行白色
|
||
],
|
||
],
|
||
];
|
||
$sheet->getStyle('A' . $row . ':' . $this->getExcelColumnName($columnCount) . $row)->applyFromArray($rowStyle);
|
||
}
|
||
|
||
// 设置响应头以触发文件下载
|
||
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
|
||
header('Content-Disposition: attachment;filename="' . $filename . '"');
|
||
header('Cache-Control: max-age=0');
|
||
|
||
// 保存并输出 Excel 文件
|
||
$writer = new Xlsx($spreadsheet);
|
||
$writer->save('php://output');
|
||
|
||
exit;
|
||
}
|
||
|
||
/**
|
||
* 获取 Excel 列名
|
||
*
|
||
* @param int $index 列索引(从1开始)
|
||
* @return string Excel 列名
|
||
*/
|
||
private function getExcelColumnName($index)
|
||
{
|
||
$columnName = '';
|
||
while ($index > 0) {
|
||
$remainder = ($index - 1) % 26;
|
||
$columnName = chr(65 + $remainder) . $columnName;
|
||
$index = intval(($index - 1) / 26);
|
||
}
|
||
return $columnName;
|
||
}
|
||
} |