/** * 导出excel文件 * * @param string $excelFileName 导出的文件名 * @param array $title excel的标题列 * @param array $data 导出的数据 */ public function exportExcel($excelFileName, $title, $data) { $str = "<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\nxmlns:x=\"urn:schemas-microsoft-com:office:excel\"\r\nxmlns=\"http://www.w3.org/TR/REC-html40\">\r\n<head>\r\n<meta http-equiv=Content-Type content=\"text/html; charset=utf-8\">\r\n</head>\r\n<body>"; $str .="<table border=1 align=center cellpadding=0 cellspacing=0>"; // 拼接标题行 $str .= '<tr style="height:25px;font-size:13px;font-weight: bold;">'; foreach ($title as $key => $val) { $str .= '<td>'.$val.'</td>'; } $str .= '</tr>'; // 拼接数据 foreach ($data as $key => $val) { $str .= '<tr style="text-align: left;height:25px;font-size:13px;">'; foreach ($val as $v) { if (is_numeric($v) && $v > 100000000) { $str .= "<td style='vnd.ms-excel.numberformat:@'>".$v."</td>"; } elseif (is_numeric($v) && preg_match('/^[0-9]+(\.[0-9]{2})+$/', $v)) { // 是两位小数的保留2位显示 $str .= "<td style='vnd.ms-excel.numberformat:0.00'>".$v."</td>"; } elseif (preg_match('/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (0[0-9]|1[0-9]|2[0-4]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])$/', $v)) { // 是日期 $str .= "<td style='vnd.ms-excel.numberformat:yyyy-mm-dd\ hh\:mm\:ss'>".$v."</td>"; } else { $str .= "<td>".$v."</td>"; } } $str .= "</tr>\n"; } $str .= "</table></body></html>"; // 实现文件下载 header("Content-Type: application/vnd.ms-excel; name='excel'"); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=" . $excelFileName); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); header("Expires: 0"); exit($str); }
Der obige Export weist mehrere häufige Probleme auf: td
的样式来控制单元格。
导出伪代码如下:
/** * 导出CSV标准文件 * * @param string $fileName 导出的文件名 * @param array $title 标题列 * @param array $data 导出的数据 */ function exportCsv($fileName, $title, $data) { // 清空输出流,防止有别的信息 ob_end_clean(); // 打开一个输出流 ob_start(); // 设置header信息 header("Content-Type: text/csv"); header("Content-Disposition:filename=". $fileName); // 打开文件流 $fileHandle = fopen('php://output', 'w'); //转码 防止乱码 fwrite($fileHandle, chr(0xEF).chr(0xBB).chr(0xBF)); // 先把标题写进去 fputcsv($fileHandle, $title); $index = 0; foreach ($data as $item) { // 每2000条释放一次资源 if ($index == 2000) { $index = 0; ob_flush(); flush(); } $index++; fputcsv($fileHandle, $item); } // 释放资源 ob_flush(); flush(); ob_end_clean(); }
其中我简单写了些样式和一些正则校验,不用可以删除。主要说一下一些单元格的格式化说明。
以上的导出会有几个常见的问题:
1.对于身份证号,手机号等过大的数字 显示的时候会用科学计数法显示。如果不介意字符串显示的话可以通过设置 td
的样式来控制 style='vnd.ms-excel.numberformat:@'
这样表示用文本的方式来显示
2.对于数字如果需要保留小数位可以设置 style='vnd.ms-excel.numberformat:0.00'
需要保留几位小数就写几个0,需要注意一点如果你传入的值比保留的小数位多,那么值会被四舍五入。比如传入的是 87.98 而设置的保留小数位是 vnd.ms-excel.numberformat:0.0
那么会显示成 88.0
3.对于日期格式设置 style='vnd.ms-excel.numberformat:yyyy-mm-dd hh:mm:ss'
其中空格、冒号等都需要转义。如果使用的是HTML里的空格字符表辅助出来会有些不一样,上面是常用的格式组合,可以自己做转换。还有一些别的转换 style='vnd.ms-excel.numberformat:"Short Date"'
这个会显示成 2019/7/1
; style='vnd.ms-excel.numberformat:"Medium Date"'
会显示成 1-Jul-19
4.百分比显示。 要显示百分比的话 可以使用格式 style='vnd.ms-excel.numberformat:0%'
有一点需要注意显示的时候会把你的值放大100倍。也就是说假如你想显示成 2%
你传递进来的值需要是 0.02
5.千位分隔符。如果需要数字显示带千位分隔符可以设置 style='vnd.ms-excel.numberformat:#,###'
比如 123456
就会显示成 123,456
常用的也就上面这些了 这里还有个 常用列表 不过他使用的关键字是 mso-number-format
我尝试了下 style
中使用 mso-number-format
和 vnd.ms-excel.numberformat
td
style='vnd.ms-excel.numberformat:@'
festlegen bedeutet, dass es als Text angezeigt wird. style='vnd.ms-excel.numberformat:0.00'
festlegen Um mehrere Dezimalstellen beizubehalten, schreiben Sie einfach ein paar Nullen. Bitte beachten Sie, dass der Wert gerundet wird, wenn der eingegebene Wert mehr Dezimalstellen aufweist, als beibehalten werden können. Wenn die Eingabe beispielsweise 87,98 ist und die Dezimalstelleneinstellung vnd.ms-excel.numberformat:0.0
ist, wird sie als 88,0style='vnd. ms-excel.numberformat:yyyy-mm-dd hh:mm:ss'
Leerzeichen, Doppelpunkte usw. müssen maskiert werden. Wenn Sie die Leerzeichentabelle in HTML verwenden, sieht es etwas anders aus. Bei den oben genannten Formatkombinationen handelt es sich um häufig verwendete Formatkombinationen, und Sie können die Konvertierung selbst durchführen. Es gibt einige andere Konvertierungen style='vnd.ms-excel.numberformat:"Short Date"'
, die als 2019/7/1
angezeigt werden; ='vnd.ms-excel.numberformat:"Medium Date"' wird als 1-Jul-19
4 angezeigt. Um einen Prozentsatz anzuzeigen, können Sie das Format style='vnd.ms-excel.numberformat:0%'
verwenden. Beachten Sie, dass Ihr Wert bei der Anzeige um das Hundertfache verstärkt wird. Das heißt, wenn Sie es als 2%
anzeigen möchten, muss der übergebene Wert 0,02
5 sein. Wenn Sie Zahlen mit Tausendertrennzeichen anzeigen müssen, können Sie style='vnd.ms-excel.numberformat:#,###'
festlegen. Beispielsweise wird 123456
verwendet angezeigt werden als 123.456
Die oben genannten sind die am häufigsten verwendeten. Hier gibt es auch eine häufig verwendete Liste, aber das von ihm verwendete Schlüsselwort ist mso-number-format
. Ich habe style ausprobiert. Sowohl <code>mso-number-format
als auch vnd.ms-excel.numberformat
können im Code verwendet werden.
Das obige ist der detaillierte Inhalt vonIn einem Artikel wird erläutert, wie Sie PHP nativ zum Exportieren von Excel- und CSV-Dateien verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!