public function BillDownload($data){
$this->RequestData['list_rows']=self::$maxDataLength;
$result = $data;
$map=['charge_code'=>"Charge","curr_type"=>"Units","unit_rate"=>"Price","unit_num"=>'Quantity',
"amount"=>"Amount"];
$priceFunc = function($v){return number_format($v, 2, '.', '');};
$this->width = [20,20,20,20,30];
$callableList = ['unit_rate'=>$priceFunc];
$this->createBillFile('Bill'.toDate(null,"Y-m-d").'.xlsx',$result??[],$map,$callableList);
}
/**
* @param $fileName 文件名
* @param $data 导出的数据
* @param $field 字段
* @param array $callback 过滤函数
* @throws \PhpOffice\PhpSpreadsheet\Exception
* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
*/
protected function createBillFile($fileName,$data,$field,$callback=[]){
ini_set("memory_limit",'256M');
ini_set('max_execution_time','300s');
Header("Content-Type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Content-Disposition: attachment; filename=".$fileName);
header("Access-Control-Allow-Origin:*");
header("Access-Control-Allow-Methods:GET,POST,OPTIONS");
header("Access-Control-Allow-Credentials:true");
$sheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
//设置列宽
if(isset($this->width) && is_array($this->width)){
$char = chr(65+ count($this->width));
if($char<='Z'){
$pos ="A";
foreach ($this->width as $v){
$sheet->getActiveSheet()->getStyle("{$pos}1")->getFont()->setBold(true);
$sheet->getActiveSheet()->getColumnDimension($pos)->setWidth($v);
$pos++;
}
}
}
$sheetField = array_flip(array_keys($field));
$convertData=[];
array_walk($data,function($item,$key) use(&$convertData,$callback,$sheetField){
$item = array_filter($item,function($k)use($sheetField){return isset($sheetField[$k]);},ARRAY_FILTER_USE_KEY);
$item = array_merge($sheetField,$item);
$convertData[$key]=$item;
foreach($callback as $name=>$func) {
if (array_key_exists($name, $item)) {
$convertData[$key][$name] = $func($item[$name]);
}
}
});
unset($data);
$sheet->getActiveSheet()->fromArray(array_values($field),null,'A1');
$sheet->getActiveSheet()->fromArray($convertData, null, 'A2');
//设置居中
$sheet->getActiveSheet()->getPageSetup()->setHorizontalCentered(true);
$max = $sheet->getActiveSheet()->getHighestRowAndColumn();
$styleArray = [
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
],
];
$sheet->getActiveSheet()->getStyle('A1:'.$max['column'].$max['row'])->applyFromArray($styleArray);
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($sheet, "Xlsx");
$writer->save("php://output");
$sheet->disconnectWorksheets();
unset($sheet);
exit;
}