搜尋
首頁後端開發php教程一文講解如何使用PHP原生來匯出Excel和CSV文件

PHP原生匯出Excel

匯出的原理其實就是透過設定Header頭告訴瀏覽器用excel的格式來解析讀取,然後透過產生HTML表格來輸出內容。對於單元格的合併其實就和操作HTML表格的合併是一樣的了,支援樣式的屬性和字段,同時還可以操作 td 的樣式來控制單元格。

匯出偽程式碼如下:

/**
 * 导出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 .= &#39;<tr style="height:25px;font-size:13px;font-weight: bold;">&#39;;
    foreach ($title as $key => $val) {
        $str .= &#39;<td>&#39;.$val.&#39;</td>&#39;;
    }
    $str .= &#39;</tr>&#39;;
    // 拼接数据
    foreach ($data as $key => $val) {
        $str .= &#39;<tr style="text-align: left;height:25px;font-size:13px;">&#39;;
        foreach ($val as $v) {
            if (is_numeric($v) && $v > 100000000) {
                $str .= "<td style=&#39;vnd.ms-excel.numberformat:@&#39;>".$v."</td>";
            } elseif (is_numeric($v) && preg_match(&#39;/^[0-9]+(\.[0-9]{2})+$/&#39;, $v)) {
                // 是两位小数的保留2位显示
                $str .= "<td style=&#39;vnd.ms-excel.numberformat:0.00&#39;>".$v."</td>";
            } elseif (preg_match(&#39;/^[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])$/&#39;, $v)) {
                // 是日期
                $str .= "<td style=&#39;vnd.ms-excel.numberformat:yyyy-mm-dd\ hh\:mm\:ss&#39;>".$v."</td>";
            } else {
                $str .= "<td>".$v."</td>";
            }
        }
        $str .= "</tr>\n";
    }
    $str .= "</table></body></html>";
    // 实现文件下载
    header("Content-Type: application/vnd.ms-excel; name=&#39;excel&#39;");
    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);
}

其中我簡單寫了些樣式和一些正規校驗,不用可以刪除。主要說一些單元格的格式化說明。

以上的匯出會有幾個常見的問題:

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-formatvnd.ms-excel.numberformat

都可以。

PHP匯出CSV

CSV文件其實是通用的文件,有時也被叫做文字檔。因此匯出的CSV資料封包檔案不能設定儲存格的樣式,而xls屬於二進位的檔案則需要使用Excel之類的工具才能開啟。如果沒有硬性要求導出這種速度更快,我看阿里雲上的一些導出都是CSV格式,但是我們這邊的需要非要excel文件.

偽代碼如下:

/**
 * 导出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(&#39;php://output&#39;, &#39;w&#39;);
    //转码 防止乱码
    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();
}
建議學習:《PHP影片教學》           

                       之後與「  

以上是一文講解如何使用PHP原生來匯出Excel和CSV文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用