最近總有一些臨時統計的需求,比如其他團隊生產的一批數據,需要確認這批數據是否入到數倉,提供的列表就是一個excel,我們就需要讀取excel中的所有數據,之后查詢數倉數據庫確認這批數據是否存在,并分別將存在的與不存在的再標記出來。
1、讀取excel文件
首先準備一個excel,內容如下,大概有100條數據:
下面實現對該文檔的讀取,讀取方式包括一次性全部讀取,適合數據量不大的場景,也包括按行讀取,適合數據量大的場景:
func ExcelRead(name string) {f, err := excelize.OpenFile(name)if err != nil {fmt.Println("open file error:", err)return}defer f.Close()// 獲取所有sheet的名稱sheets := f.GetSheetMap()for _, name := range sheets {// 獲取單個sheet的全部內容,正式上線需要考慮內存占用問題rows, err := f.GetRows(name)if err != nil {fmt.Println("get rows error:", err)return}fmt.Println("rows lenth:", len(rows))// 每次讀取一行,減少內存占用for i := 0; i < 200; i++ {st, err := f.GetCellValue(name, fmt.Sprintf("A%v", i+2))if err != nil {fmt.Println("get cell value error:", err)}if st == "" {break}et, err := f.GetCellValue(name, fmt.Sprintf("B%v", i+2))if err != nil {fmt.Println("get cell value error:", err)}sub, err := f.GetCellValue(name, fmt.Sprintf("C%v", i+2))if err != nil {fmt.Println("get cell value error:", err)}fmt.Println(st, et, sub)}}
}
運行記錄:
2、寫excel文件
寫excel,那就把第一步讀取的excel重新寫入到excel中,并寫到兩個sheet中,內容為三列(A/B/C):?
func ExcelWrite(sheet1 [][]string, sheet2 [][]string) {col := []string{"A", "B", "C"}f := excelize.NewFile()defer f.Close()// 創建名為車端挖掘數據的工作表_, err := f.NewSheet("車端挖掘數據")if err != nil {fmt.Println("new sheet error:", err)return}// 設置單元格的值。f.SetCellValue("車端挖掘數據", "A1", "start_time")f.SetCellValue("車端挖掘數據", "B1", "end_time")f.SetCellValue("車端挖掘數據", "C1", "subject")for i, v := range sheet1 {for k, v1 := range v {f.SetCellValue("車端挖掘數據", col[k]+fmt.Sprintf("%v", i+2), v1)}}// 創建名為車端挖掘數據的工作表sheetName := "云端挖掘數據"index, err := f.NewSheet("云端挖掘數據")if err != nil {fmt.Println("new sheet error:", err)return}// 設置默認sheet,打開表格時,默認顯示的sheetf.SetActiveSheet(index)// 設置單元格的值。f.SetCellValue(sheetName, "A1", "start_time")f.SetCellValue(sheetName, "B1", "end_time")f.SetCellValue(sheetName, "C1", "subject")for i, v := range sheet1 {for k, v1 := range v {f.SetCellValue(sheetName, col[k]+fmt.Sprintf("%v", i+2), v1)}}// 將Excel另存為文件if err := f.SaveAs("/Users/liupeng/Downloads/test.xlsx"); err != nil {fmt.Println(err)}
}
運行結果:
3、在excel中生成柱狀圖
假設我們有這樣一組數據:
我們希望將這組數據寫入excel,并生成一個柱狀圖,類似這樣:
?代碼如下:
func CreateChart() {f := excelize.NewFile()defer f.Close()contents := [][]any{{nil, "Apple", "Orange", "Pear"},{"Small", 2, 3, 3},{"Normal", 5, 2, 4},{"Large", 6, 7, 8},}for idx, row := range contents {cell, err := excelize.CoordinatesToCellName(1, idx+1)if err != nil {fmt.Println(err)return}f.SetSheetRow("Sheet1", cell, &row)}if err := f.AddChart("Sheet1", "E1", &excelize.Chart{Type: excelize.Col3DClustered,Series: []excelize.ChartSeries{{Name: "Sheet1!$A$2",Categories: "Sheet1!$B$1:$D$1",Values: "Sheet1!$B$2:$D$2",},{Name: "Sheet1!$A$3",Categories: "Sheet1!$B$1:$D$1",Values: "Sheet1!$B$3:$D$3",},{Name: "Sheet1!$A$4",Categories: "Sheet1!$B$1:$D$1",Values: "Sheet1!$B$4:$D$4",}},Title: []excelize.RichTextRun{{Text: "Fruit Chart",},},}); err != nil {fmt.Println(err)return}// Save spreadsheet by the given path.if err := f.SaveAs("/Users/liupeng/Downloads/Book1.xlsx"); err != nil {fmt.Println(err)}
}
以上就是三個基礎的操作excel的方法,希望對大家有用。
歡迎投身技術的小伙伴們關注交流~~~~~~~~~~~~~~~~~~。
往期推薦:
我在百度的這10年~~
云岡石窟:翻開這本距今1565年、與天地同久長的石頭史書,感受北魏王朝雕刻藝術的巔峰之作。
一個異步架構設計:批量消費RabbitMQ,批量寫入Elasticsearch(golang實現)
歷經滄桑的應縣木塔,在風雨中已等你969年。
從北京到大同,走過600里,跨越1000年。
命令行參數的藝術:Python、Golang、C++技術實現
supervisor,你理應知道。
跑步的第六年,才真正了解運動的意義
微信小程序文章列表煥新顏:從丑小鴨到白天鵝的華麗蛻變
Elasticsearch高級檢索對決:search_after+pit和scroll,誰才是最佳選擇?
李白:為何兩次選擇做了上門女婿?
借助tritonserver完成gpt2模型的本地私有化部署
GRPC開發全攻略:從環境搭建到代碼實現
武漢抗疫英雄汪勇:平凡人的非凡之舉。
趴菜就是趴菜,捯飭3天,才搞出小程序頭部banner,還是個半成品
小程序實現文章列表點擊跳轉公眾號詳情頁
前端小趴菜終于把公眾號和開發的不能再磕磣的小程序首頁關聯上了
【續】開發triton客戶端,訪問clip-vit-large-patch14模型抽取圖片特征。
NVIDIA tritonserver實現CLIP-ViT模型工程化:輕松獲取圖片特征(by grpc or http)
一文揭秘:Golang+Elasticsearch輕松搭建AI時代的圖片搜索服務
輕松搭建Elasticsearch:Mac系統下的安裝指南
Kibana for Mac:極簡安裝教程
RabbitMQ-死信隊列(golang)
項目踩坑記--RabbitMq連接過多導致的內存打滿
elasticsearch查詢語言DSL構建包使用及實現原理(golang)
納蘭性德-我是人間惆悵客,世間唯有『若』字,最難成真
golang操作mysql之利器-gorm
Elasticsearch寫入、讀取、更新、刪除以及批量操作(golang)
抖音視頻批量下載工具
tritonserver學習之六:自定義c++、python custom backend實踐