最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用?Go?和?Excelize?構(gòu)建電子表格

 更新時(shí)間:2022年09月30日 11:29:02   作者:pxr007  
這篇文章主要介紹了如何使用Go和Excelize構(gòu)建電子表格,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

分析任何規(guī)模的數(shù)據(jù)的重要性怎么強(qiáng)調(diào)都不為過(guò)。 我們?nèi)粘I畹膸缀趺總€(gè)部分都是數(shù)據(jù)驅(qū)動(dòng)的,作為開發(fā)人員,在構(gòu)建任何合理大小的應(yīng)用程序時(shí),首要考慮的因素之一是使用什么數(shù)據(jù)庫(kù)以及如何構(gòu)建數(shù)據(jù)。

但是,它不僅限于存儲(chǔ)數(shù)據(jù),您還需要通過(guò)提取并以任何非技術(shù)人員都能理解的格式呈現(xiàn)這些數(shù)據(jù)來(lái)理解這些數(shù)據(jù)。 例如,電子商務(wù)企業(yè)每天都會(huì)產(chǎn)生大量數(shù)據(jù),這意味著我們需要跟蹤產(chǎn)品庫(kù)存、月收入、財(cái)務(wù)報(bào)表等信息。 目前,有許多服務(wù)提供這些類型的解決方案,但快速提取和呈現(xiàn)數(shù)據(jù)的最簡(jiǎn)單方法之一是生成電子表格或 CSV 文件。

在本文中,我們將探索如何在 Go 中創(chuàng)建電子表格,方法是構(gòu)建一個(gè)簡(jiǎn)單的費(fèi)用報(bào)告并使用 Excelize 庫(kù)將其導(dǎo)出為 CSV 格式。 中找到本教程的完整代碼 您可以在 GitHub 存儲(chǔ)庫(kù) 。 讓我們開始吧!

  • 生成費(fèi)用報(bào)告
  • 創(chuàng)建工作表
  • 添加數(shù)據(jù)和創(chuàng)建樣式
  • 保存工作表
  • 導(dǎo)出為 CSV

生成費(fèi)用報(bào)告

費(fèi)用報(bào)告是一份詳細(xì)的清單,盡可能詳細(xì)地顯示公司在一段時(shí)間內(nèi)的支出。 我們將構(gòu)建一個(gè)類似于下圖中的報(bào)告:

創(chuàng)建工作表

要開始使用,請(qǐng)確保您已安裝 Go ≥v1.15 并創(chuàng)建一個(gè)新的項(xiàng)目文件夾。

在項(xiàng)目目錄中,創(chuàng)建一個(gè) main.go文件并使用以下代碼初始化 Go 模塊:

$ mkdir <project-name>
$ cd <project-name>
$ touch main.go
$ go mod init github.com/<your-username>/<project-name>

The main.go file is the entry point of our Go application, and we use the generated go.mod file for dependency management. Next, install the Excelize library by running the command below:

$ go get github.com/xuri/excelize/v2

Excelize is a Go library with no dependencies that provides primitives for reading and writing to XLSX files and other supported spreadsheet file formats. In your main.go file, import Excelize, create a new file, create a new worksheet, and set the active sheet to the worksheet you just created:

package main
import "github.com/xuri/excelize/v2"
const (
   SheetName = "Expense Report"
)
func main() {
   var err error
   f := excelize.NewFile()
   index := f.NewSheet("Sheet1")
   f.SetActiveSheet(index)
   f.SetSheetName("Sheet1", SheetName)
}

添加數(shù)據(jù)和創(chuàng)建樣式

創(chuàng)建工作表后,我們可以開始構(gòu)建報(bào)告。 首先,我們將設(shè)置一些尺寸以適應(yīng)我們想要的結(jié)構(gòu),如下圖所示。

將以下代碼塊添加到您的 main功能:

//main.go
//...
   err = f.SetColWidth(SheetName, "A", "A", 6)
   err = f.SetColWidth(SheetName, "H", "H", 6)
   err = f.SetColWidth(SheetName, "B", "B", 12)
   err = f.SetColWidth(SheetName, "C", "C", 16)
   err = f.SetColWidth(SheetName, "D", "D", 13)
   err = f.SetColWidth(SheetName, "E", "E", 15)
   err = f.SetColWidth(SheetName, "F", "F", 22)
   err = f.SetColWidth(SheetName, "G", "G", 13)

我們只需要列 A至 G對(duì)于報(bào)告,所以我們使用 SetColWidth調(diào)整列的寬度以滿足我們的要求。 你會(huì)注意到我們已經(jīng)定義了一個(gè) error變量到頂部 main函數(shù),我們只是將這些函數(shù)返回的任何錯(cuò)誤分配給它。 理想情況下,您應(yīng)該正確處理每個(gè)錯(cuò)誤,因?yàn)樗?Go 中是慣用的,但保持代碼最少也是可以的。

Over 200k developers use LogRocket to create better digital experiences Learn more →

報(bào)告的第一部分包含靜態(tài)信息,因此我們將對(duì)其進(jìn)行硬編碼。 將以下代碼塊添加到您的 main 函數(shù)中:

//main.go
//...
   err = f.SetRowHeight(SheetName, 1, 12)
   err = f.MergeCell(SheetName, "A1", "H1")
?
   err = f.SetRowHeight(SheetName, 2, 25)
   err = f.MergeCell(SheetName, "B2", "D2")
?
   style, err := f.NewStyle(&excelize.Style{Font: &excelize.Font{Size: 20, Color: "6d64e8"}})
   err = f.SetCellStyle(SheetName, "B2", "D2", style)
   err = f.SetSheetRow(SheetName, "B2", &[]interface{}{"Gigashots Inc."})
   err = f.MergeCell(SheetName, "B3", "D3")
   err = f.SetSheetRow(SheetName, "B3", &[]interface{}{"3154 N Richardt Ave"})
?
   err = f.MergeCell(SheetName, "B4", "D4")
   err = f.SetSheetRow(SheetName, "B4", &[]interface{}{"Indianapolis, IN 46276"})
?
   style, err = f.NewStyle(&excelize.Style{Font: &excelize.Font{Color: "666666"}})
   err = f.MergeCell(SheetName, "B5", "D5")
   err = f.SetCellStyle(SheetName, "B5", "D5", style)
   err = f.SetSheetRow(SheetName, "B5", &[]interface{}{"(317) 854-0398"})
?
   style, err = f.NewStyle(&excelize.Style{Font: &excelize.Font{Size: 32, Color: "2B4492", Bold: true}})
   err = f.MergeCell(SheetName, "B7", "G7")
   err = f.SetCellStyle(SheetName, "B7", "G7", style)
   err = f.SetSheetRow(SheetName, "B7", &[]interface{}{"Expense Report"})
?
   style, err = f.NewStyle(&excelize.Style{Font: &excelize.Font{Size: 13, Color: "E25184", Bold: true}})
   err = f.MergeCell(SheetName, "B8", "C8")
   err = f.SetCellStyle(SheetName, "B8", "C8", style)
   err = f.SetSheetRow(SheetName, "B8", &[]interface{}{"09/04/00 - 09/05/00"})
?
   style, err = f.NewStyle(&excelize.Style{Font: &excelize.Font{Size: 13, Bold: true}})
   err = f.SetCellStyle(SheetName, "B10", "G10", style)
   err = f.SetSheetRow(SheetName, "B10", &[]interface{}{"Name", "", "Employee ID", "", "Department"})
   err = f.MergeCell(SheetName, "B10", "C10")
   err = f.MergeCell(SheetName, "D10", "E10")
   err = f.MergeCell(SheetName, "F10", "G10")
?
   style, err = f.NewStyle(&excelize.Style{Font: &excelize.Font{Color: "666666"}})
   err = f.SetCellStyle(SheetName, "B11", "G11", style)
   err = f.SetSheetRow(SheetName, "B11", &[]interface{}{"John Doe", "", "#1B800XR", "", "Brand & Marketing"})
   err = f.MergeCell(SheetName, "B11", "C11")
   err = f.MergeCell(SheetName, "D11", "E11")
   err = f.MergeCell(SheetName, "F11", "G11")
?
   style, err = f.NewStyle(&excelize.Style{Font: &excelize.Font{Size: 13, Bold: true}})
   err = f.SetCellStyle(SheetName, "B13", "G13", style)
   err = f.SetSheetRow(SheetName, "B13", &[]interface{}{"Manager", "", "Purpose"})
   err = f.MergeCell(SheetName, "B13", "C13")
   err = f.MergeCell(SheetName, "D13", "E13")
?
   style, err = f.NewStyle(&excelize.Style{Font: &excelize.Font{Color: "666666"}})
   err = f.SetCellStyle(SheetName, "B14", "G14", style)
   err = f.SetSheetRow(SheetName, "B14", &[]interface{}{"Jane Doe", "", "Brand Campaign"})
   err = f.MergeCell(SheetName, "B14", "C14")
   err = f.MergeCell(SheetName, "D14", "E14")

這段代碼中有很多內(nèi)容,所以讓我們分解一下。

如前所述,Excelize 提供了一組原始函數(shù)來(lái)操作電子表格。 您需要的每個(gè)功能只需要在文件對(duì)象上調(diào)用一個(gè)方法,該方法接受一些參數(shù)。

在這種情況下,我們使用了五種主要方法:

  • SetRowHeight
  • MergeCell
  • NewStyle
  • SetCellStyle
  • SetSheetRow

SetRowHeight調(diào)整給定行的高度,以及 MergeCell將一行中的多個(gè)單元格合并為一個(gè)單元格。 要編寫樣式,我們可以使用 excelize.Stylestruct,它提供了定義自定義樣式所需的屬性。 這 NewStyle方法只是采用 Style對(duì)象并返回表示樣式的索引。

定義您的自定義樣式后,我們可以使用 SetCellStyle將樣式應(yīng)用于單個(gè)單元格或一系列單元格。 我們用 SetSheetRow將數(shù)據(jù)添加到單行中的一個(gè)單元格或一系列單元格。 它接受一個(gè)接口切片,它是任何原始數(shù)據(jù)類型的容器。 切片是位置的,每個(gè)元素將從提供的軸開始放置在相應(yīng)的單元格中。 因此,在合并多個(gè)單元格的某些情況下,我們使用了空字符串。

報(bào)告的第二部分是一個(gè)包含任意長(zhǎng)度的動(dòng)態(tài)數(shù)據(jù)的表格,這意味著我們不能像以前那樣只定義每一行的內(nèi)容。 表中表示的數(shù)據(jù)遵循定義的結(jié)構(gòu),因此我們可以循環(huán)傳入數(shù)據(jù)并動(dòng)態(tài)創(chuàng)建每一行。

讓我們定義一些代表費(fèi)用列表的任意數(shù)據(jù)。

在您的頂部 main.go文件,在 main函數(shù),添加以下變量:

//main.go
//...
var (
   expenseData = [][]interface{}{
      {"2022-04-10", "Flight", "Trip to San Fransisco", "", "", "$3,462.00"},
      {"2022-04-10", "Hotel", "Trip to San Fransisco", "", "", "$1,280.00"},
      {"2022-04-12", "Swags", "App launch", "", "", "$862.00"},
      {"2022-03-15", "Marketing", "App launch", "", "", "$7,520.00"},
      {"2022-04-11", "Event hall", "App launch", "", "", "$2,080.00"},
   }
)
//...

現(xiàn)在,將以下代碼塊添加到您的 main 函數(shù)中:

//main.go
//...
   style, err = f.NewStyle(&excelize.Style{
      Font:      &excelize.Font{Size: 13, Bold: true, Color: "2B4492"},
      Alignment: &excelize.Alignment{Vertical: "center"},
   })
   err = f.SetCellStyle(SheetName, "B17", "G17", style)
   err = f.SetSheetRow(SheetName, "B17", &[]interface{}{"Date", "Category", "Description", "", "Notes", "Amount"})
   err = f.MergeCell(SheetName, "D17", "E17")
   err = f.SetRowHeight(SheetName, 17, 32)
?
   startRow := 18
   for i := startRow; i < (len(expenseData) + startRow); i++ {
      var fill string
      if i%2 == 0 {
         fill = "F3F3F3"
      } else {
         fill = "FFFFFF"
      }
      style, err = f.NewStyle(&excelize.Style{
         Fill:      excelize.Fill{Type: "pattern", Pattern: 1, Color: []string{fill}},
         Font:      &excelize.Font{Color: "666666"},
         Alignment: &excelize.Alignment{Vertical: "center"},
      })
      err = f.SetCellStyle(SheetName, fmt.Sprintf("B%d", i), fmt.Sprintf("G%d", i), style)
      err = f.SetSheetRow(SheetName, fmt.Sprintf("B%d", i), &expenseData[i-18])
      err = f.SetCellRichText(SheetName, fmt.Sprintf("C%d", i), []excelize.RichTextRun{
         {Text: expenseData\[i-18\][1].(string), Font: &excelize.Font{Bold: true}},
      })
?
      err = f.MergeCell(SheetName, fmt.Sprintf("D%d", i), fmt.Sprintf("E%d", i))
      err = f.SetRowHeight(SheetName, i, 18)
   }

我們?nèi)匀皇褂孟嗤姆椒▉?lái)組合樣式和添加數(shù)據(jù)。 但是,我們正在循環(huán) expenseData列出并將每個(gè)項(xiàng)目添加到當(dāng)前行。 我們開始循環(huán) 18,這是電子表格中的當(dāng)前行。 為了使表格的行更加清晰易讀,我們通過(guò)使用 modulo手術(shù)。

導(dǎo)出為 CSV

到目前為止,我們已經(jīng)探索了使用 XLSX 文件,但是,還有其他格式適合呈現(xiàn)這種數(shù)據(jù)。 CSV 文件是一個(gè)文本文件,其中包含由逗號(hào)分隔的數(shù)據(jù)行,主要用于導(dǎo)入和導(dǎo)出數(shù)據(jù)。

考慮一種情況,我們希望將費(fèi)用報(bào)告中的表存儲(chǔ)在某個(gè)自托管數(shù)據(jù)庫(kù)中。 我們可以將這個(gè)表格提取為 CSV 格式,然后通過(guò)幾個(gè)步驟將其導(dǎo)入數(shù)據(jù)庫(kù)。

首先,在主函數(shù)之外創(chuàng)建一個(gè)名為 generateCSV并在下面添加代碼塊:

//main.go
//...
type Axis struct {
   row int
   col string
}
?
func generateCSV(f *excelize.File, start, end Axis) error {
   var data [][]string
?
   for i := start.row; i <= end.row; i++ {
      row := []string{}
      for j := []rune(start.col)[0]; j <= []rune(end.col)[0]; j++ {
         value, err := f.GetCellValue(SheetName, fmt.Sprintf("%s%d", string(j), i), excelize.Options{})
         if err != nil {
            return err
         }
         row = append(row, value)
      }
      data = append(data, row)
   }
?
   file, err := os.Create("expenses.csv")
   if err != nil {
      return err
   }
   defer f.Close()
?
   writer := csv.NewWriter(file)
   return writer.WriteAll(data)
}

這 generateCSV函數(shù)接受一個(gè) excelize.File類型、起始軸和結(jié)束軸。 軸只是構(gòu)成單元格的行和列的組合。 我們循環(huán)遍歷每一行,對(duì)于每一行,我們循環(huán)遍歷開始軸和結(jié)束軸邊界內(nèi)的每一列。

然后我們使用 f.GetCellValue提取每個(gè)單元格的當(dāng)前值。 因?yàn)榱斜硎緸樽帜缸址?,所以我們將它們轉(zhuǎn)換為符文以獲取底層的 unicode 十進(jìn)制。 最后,我們將提取的數(shù)據(jù)保存到 .csv文件 使用標(biāo)準(zhǔn)庫(kù)中的 CSV 包 。

我們可以在保存工作表并傳遞文件句柄后調(diào)用此函數(shù)。

在你的 main函數(shù),添加以下代碼塊:

//main.go
///...
   err = f.SaveAs("expense-report.xlsx")
   err = generateCSV(f, Axis{17, "B"}, Axis{22, "G"})
?
   if err != nil {
      log.Fatal(err)
   }

我們提供了我們之前為工作表創(chuàng)建的文件和表示表格范圍的軸。

如果你運(yùn)行 main.go文件,您應(yīng)該會(huì)看到生成的 XLSX 文件和 CSV 文件:

$ go run main.go

結(jié)論

以電子表格兼容的格式呈現(xiàn)數(shù)據(jù)有很多用例,包括分析、轉(zhuǎn)換和驗(yàn)證。 在本文中,我們學(xué)習(xí)了如何使用 Go 和 Excelize 包通過(guò)生成費(fèi)用報(bào)告來(lái)處理電子表格。

當(dāng)您考慮 Excelize 開箱即用的其他功能時(shí),我們只是觸及了皮毛。 您可以添加圖像、創(chuàng)建圖表、迷你圖、形狀、數(shù)據(jù)透視表等。 我希望你學(xué)到了一些新的東西,如果你有任何問(wèn)題,請(qǐng)發(fā)表評(píng)論。 快樂(lè)編碼!

LogRocket 主動(dòng)顯示和診斷您的應(yīng)用程序和網(wǎng)站中最重要的問(wèn)題

成千上萬(wàn)的工程和產(chǎn)品團(tuán)隊(duì)使用 LogRocket 來(lái)減少了解技術(shù)和可用性問(wèn)題的根本原因所需的時(shí)間。 使用 LogRocket,您將減少與客戶來(lái)回對(duì)話的時(shí)間,并消除無(wú)休止的故障排除過(guò)程。 LogRocket 讓您可以花更多時(shí)間構(gòu)建新事物,而減少修復(fù)錯(cuò)誤的時(shí)間。

到此這篇關(guān)于如何使用 Go 和 Excelize 構(gòu)建電子表格的文章就介紹到這了,更多相關(guān)Go 與 Excelize 構(gòu)建表格內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go?for-range?的?value值地址每次都一樣的原因解析

    Go?for-range?的?value值地址每次都一樣的原因解析

    循環(huán)語(yǔ)句是一種常用的控制結(jié)構(gòu),在?Go?語(yǔ)言中,除了?for?關(guān)鍵字以外,還有一個(gè)?range?關(guān)鍵字,可以使用?for-range?循環(huán)迭代數(shù)組、切片、字符串、map?和?channel?這些數(shù)據(jù)類型,這篇文章主要介紹了Go?for-range?的?value值地址每次都一樣的原因解析,需要的朋友可以參考下
    2023-05-05
  • 一文帶你搞懂Golang如何正確退出Goroutine

    一文帶你搞懂Golang如何正確退出Goroutine

    在Go語(yǔ)言中,Goroutine是一種輕量級(jí)線程,它的退出機(jī)制對(duì)于并發(fā)編程至關(guān)重要,下午就來(lái)介紹幾種Goroutine的退出機(jī)制,希望對(duì)大家有所幫助
    2023-06-06
  • GOLang?IO接口與工具使用方法講解

    GOLang?IO接口與工具使用方法講解

    這篇文章主要介紹了GOLang?IO接口與工具使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-03-03
  • golang?日志庫(kù)ZAP[uber-go?zap]示例詳解

    golang?日志庫(kù)ZAP[uber-go?zap]示例詳解

    ZAP是由Uber開源的高性能Go語(yǔ)言日志庫(kù),支持多種日志級(jí)別及基本信息打印,雖然ZAP本身不支持日志分割,但可以結(jié)合lumberjack進(jìn)行日志切割,實(shí)現(xiàn)日志按文件大小、時(shí)間或間隔切割等功能,ZAP提供Logger和SugaredLogger兩種日志記錄器
    2024-10-10
  • Go 如何批量修改文件名

    Go 如何批量修改文件名

    這篇文章主要介紹了Go 批量修改文件名的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • golang并發(fā)ping主機(jī)的方法

    golang并發(fā)ping主機(jī)的方法

    今天小編就為大家分享一篇golang并發(fā)ping主機(jī)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • golang?RPC包原理和使用詳細(xì)介紹

    golang?RPC包原理和使用詳細(xì)介紹

    golang的rpc支持三個(gè)級(jí)別的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是獨(dú)一無(wú)二的RPC,它和傳統(tǒng)的RPC系統(tǒng)不同,它只支持Go開發(fā)的服務(wù)器與客戶端之間的交互,因?yàn)樵趦?nèi)部,它們采用了Gob來(lái)編碼
    2022-09-09
  • GoLang中拼接字符串性能優(yōu)化方法詳解

    GoLang中拼接字符串性能優(yōu)化方法詳解

    最近在做性能優(yōu)化,有個(gè)函數(shù)里面的耗時(shí)特別長(zhǎng),看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其實(shí)有很多種實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Golang語(yǔ)言如何高效拼接字符串的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Go語(yǔ)言中Map的神奇操作小結(jié)

    Go語(yǔ)言中Map的神奇操作小結(jié)

    Map是一個(gè)強(qiáng)大而又有趣的工具,它可以幫助我們高效地存儲(chǔ)和操作鍵值對(duì)數(shù)據(jù),本文主要介紹了Go語(yǔ)言中Map的各種操作,包括增加、查找、刪除、遍歷等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • go語(yǔ)言通過(guò)反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對(duì)應(yīng)的操作

    go語(yǔ)言通過(guò)反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對(duì)應(yīng)的操作

    這篇文章主要介紹了go語(yǔ)言通過(guò)反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對(duì)應(yīng)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論

太仆寺旗| 沭阳县| 巢湖市| 北流市| 锡林郭勒盟| 泗阳县| 美姑县| 长宁区| 彭州市| 哈密市| 玉门市| 乌鲁木齐县| 湖北省| 辉南县| 铜山县| 乐亭县| 大埔区| 阳原县| 两当县| 华阴市| 磴口县| 乌鲁木齐县| 民丰县| 浦北县| 苍南县| 都安| 介休市| 涿鹿县| 渝中区| 弥勒县| 武鸣县| 海淀区| 监利县| 陕西省| 咸宁市| 阿瓦提县| 边坝县| 保德县| 麻江县| 广灵县| 县级市|