1.Web 頁(yè)面導(dǎo)出數(shù)據(jù)到文件由后臺(tái)實(shí)現(xiàn)還是前端實(shí)現(xiàn)?
Web 頁(yè)面導(dǎo)出表數(shù)據(jù)到 Excel(或其他格式)可以由前端或后臺(tái)來(lái)實(shí)現(xiàn),具體的實(shí)現(xiàn)方式取決于你的應(yīng)用需求和架構(gòu)。以下是一些考慮因素:
(1)前端實(shí)現(xiàn)。
-
如果你的數(shù)據(jù)導(dǎo)出不涉及復(fù)雜的數(shù)據(jù)處理、數(shù)據(jù)權(quán)限控制或數(shù)據(jù)來(lái)源的保護(hù),你可以考慮在前端實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出。
-
前端實(shí)現(xiàn)通常意味著使用JavaScript庫(kù)或框架來(lái)生成Excel文件,例如使用開源庫(kù)如SheetJS的xlsx.js或者使用瀏覽器內(nèi)置的API,如Blob對(duì)象和FileSaver.js來(lái)生成Excel文件。
-
前端實(shí)現(xiàn)具有即時(shí)性,用戶可以在瀏覽器中直接進(jìn)行數(shù)據(jù)導(dǎo)出操作,不需要等待后臺(tái)處理。
(2)后臺(tái)實(shí)現(xiàn)。
-
如果你需要處理大量數(shù)據(jù)、進(jìn)行復(fù)雜的數(shù)據(jù)操作、實(shí)施數(shù)據(jù)權(quán)限控制、或者需要從數(shù)據(jù)庫(kù)或其他后端數(shù)據(jù)源提取數(shù)據(jù),通常更適合在后臺(tái)實(shí)現(xiàn)。
-
后臺(tái)實(shí)現(xiàn)可以使用服務(wù)器端腳本,如 PHP、Node.js、Python 等,來(lái)生成 Excel文件。這可以確保數(shù)據(jù)的一致性和安全性。
-
后臺(tái)實(shí)現(xiàn)還可以允許對(duì)大型數(shù)據(jù)集進(jìn)行分頁(yè)、篩選、排序等操作,以提供更強(qiáng)大的導(dǎo)出功能。
一種常見的做法是,前端觸發(fā)數(shù)據(jù)導(dǎo)出請(qǐng)求,將請(qǐng)求發(fā)送到后臺(tái),后臺(tái)處理數(shù)據(jù)生成Excel文件,然后將生成的Excel文件發(fā)送回前端以供用戶下載。這種方法結(jié)合了前后端的優(yōu)勢(shì),可以提供數(shù)據(jù)處理和安全性。
2.Golang Excel 庫(kù)選型
目前開源 Golang Excel 庫(kù)流行的有兩個(gè):
- excelize
Excelize 是一個(gè)功能強(qiáng)大的 Go 語(yǔ)言 Excel 庫(kù),你可以使用 Excelize 創(chuàng)建和編輯工作簿、工作表、單元格等內(nèi)容。
GitHub 倉(cāng)庫(kù):https://github.com/qax-os/excelize
- xlsx
xlsx 是一個(gè)簡(jiǎn)單的Golang庫(kù),用于讀寫 XLSX 文件。它提供了創(chuàng)建、編輯工作簿、工作表和單元格的功能。
GitHub 倉(cāng)庫(kù):https://github.com/tealeg/xlsx
因?yàn)?xlsx 較為輕量,所以下面以 xlsx 為例,給出實(shí)現(xiàn)。
3.后臺(tái)實(shí)現(xiàn)示例
在 Web 框架 Gin 中生成 Excel 文件并在接口返回。
func ExportHandler(c *gin.Context) {
file := xlsx.NewFile()
sheet, _ := file.AddSheet("InsuranceActive")
// Add titles.
titles := []string{
"Id",
"CreatedAt",
"UpdatedAt",
"CreatorId",
"UpdaterId",
"CompanyName",
}
row := sheet.AddRow()
for _, title := range titles {
cell := row.AddCell()
cell.Value = title
}
// Add rows just like add titles.
...
// Return the excel file.
c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
filename := fmt.Sprintf("IndustryInfos_%v.xlsx", time.Now().Format("2006-01-02T15:04:05"))
c.Header("Content-Disposition", "attachment; filename="+filename)
if err := file.Write(c.Writer); err != nil {
c.JSON(http.StatusOK, "failed")
return
}
c.JSON(http.StatusOK, "suceess")
}
// 設(shè)置路由
engine.GET("/xlsx/export", ExportHandler)
注意回包 Header 的設(shè)置:
(1)Content-Type 設(shè)為:
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
關(guān)于其他類型文件的 MIME 可以參考:What is a correct MIME type for .docx, .pptx, etc.? - Stack Overflow。
(2)還需要設(shè)置 “Content-Disposition” 表示回包是一個(gè)附件,并需要指定附件名稱。
4.xlsx 庫(kù)的問題
通過(guò)瀏覽器下載庫(kù) tealeg/xlsx 生成的 Excel 文件后,打開時(shí)會(huì)報(bào)下面的錯(cuò)誤。
點(diǎn)擊“是”后可正常打開文件,說(shuō)明文件內(nèi)容是正確的。
該警告在 v1 就已經(jīng)出現(xiàn),且?guī)斓淖髡咴缫阎獣?,但目前最新版?v3 仍未解決該問題。可能因?yàn)椴挥绊?Excel 文件內(nèi)容的正確性,所以拖到現(xiàn)在仍未解決。
詳細(xì)討論,請(qǐng)參見 XLSX files produced by this library need repair by Excel. #53。
奇怪地是通過(guò)func (*File) Save
直接保存至本地的 Excel 文件沒有這個(gè)問題。
5.小結(jié)
綜上所述,前端或后臺(tái)的選擇取決于你的具體需求、性能、安全性以及數(shù)據(jù)處理的復(fù)雜性。一些應(yīng)用可能會(huì)同時(shí)在前端和后臺(tái)實(shí)現(xiàn)導(dǎo)出功能,以提供更靈活的選項(xiàng)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-739565.html
參考文獻(xiàn)
The tealeg/xlsx Tutorial: Reading and writing xlsx files with Go
What is a correct MIME type for .docx, .pptx, etc.? - Stack Overflow
XLSX files produced by this library need repair by Excel. #53文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-739565.html
到了這里,關(guān)于Golang Gin 接口返回 Excel 文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!