如何使用 Go 和 Excelize 构建电子表格
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《如何使用 Go 和 Excelize 构建电子表格》,介绍一下构建、excelize、表格,希望对大家的知识积累有所帮助,助力实战开发!
但是,它不仅限于存储数据,您还需要通过提取并以任何非技术人员都能理解的格式呈现这些数据来理解这些数据。 例如,电子商务企业每天都会产生大量数据,这意味着我们需要跟踪产品库存、月收入、财务报表等信息。 目前,有许多服务提供这些类型的解决方案,但快速提取和呈现数据的最简单方法之一是生成电子表格或 CSV 文件。
在本文中,我们将探索如何在 Go 中创建电子表格,方法是构建一个简单的费用报告并使用 Excelize 库将其导出为 CSV 格式。 中找到本教程的完整代码 您可以在 GitHub 存储库 。 让我们开始吧!
- 生成费用报告
- 创建工作表
- 添加数据和创建样式
- 保存工作表
- 导出为 CSV
生成费用报告
费用报告是一份详细的清单,尽可能详细地显示公司在一段时间内的支出。 我们将构建一个类似于下图中的报告:
创建工作表
要开始使用,请确保您已安装 Go ≥v1.15 并创建一个新的项目文件夹。
在项目目录中,创建一个 main.go文件并使用以下代码初始化 Go 模块:
$ mkdir <project-name> $ cd <project-name> $ touch main.go $ go mod init github.com/<your-username>/<project-name></project-name></your-username></project-name></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) }
添加数据和创建样式
创建工作表后,我们可以开始构建报告。 首先,我们将设置一些尺寸以适应我们想要的结构,如下图所示。
将以下代码块添加到您的 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对于报告,所以我们使用 SetColWidth调整列的宽度以满足我们的要求。 你会注意到我们已经定义了一个 error变量到顶部 main函数,我们只是将这些函数返回的任何错误分配给它。 理想情况下,您应该正确处理每个错误,因为它在 Go 中是惯用的,但保持代码最少也是可以的。
Over 200k developers use LogRocket to create better digital experiences Learn more →
报告的第一部分包含静态信息,因此我们将对其进行硬编码。 将以下代码块添加到您的 main 函数中:
//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")
这段代码中有很多内容,所以让我们分解一下。
如前所述,Excelize 提供了一组原始函数来操作电子表格。 您需要的每个功能只需要在文件对象上调用一个方法,该方法接受一些参数。
在这种情况下,我们使用了五种主要方法:
- SetRowHeight
- MergeCell
- NewStyle
- SetCellStyle
- SetSheetRow
SetRowHeight调整给定行的高度,以及 MergeCell将一行中的多个单元格合并为一个单元格。 要编写样式,我们可以使用 excelize.Stylestruct,它提供了定义自定义样式所需的属性。 这 NewStyle方法只是采用 Style对象并返回表示样式的索引。
定义您的自定义样式后,我们可以使用 SetCellStyle将样式应用于单个单元格或一系列单元格。 我们用 SetSheetRow将数据添加到单行中的一个单元格或一系列单元格。 它接受一个接口切片,它是任何原始数据类型的容器。 切片是位置的,每个元素将从提供的轴开始放置在相应的单元格中。 因此,在合并多个单元格的某些情况下,我们使用了空字符串。
报告的第二部分是一个包含任意长度的动态数据的表格,这意味着我们不能像以前那样只定义每一行的内容。 表中表示的数据遵循定义的结构,因此我们可以循环传入数据并动态创建每一行。
让我们定义一些代表费用列表的任意数据。
在您的顶部 main.go文件,在 main函数,添加以下变量:
//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"}, } ) //...
现在,将以下代码块添加到您的 main 函数中:
//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 <p>我们仍然使用相同的方法来组合样式和添加数据。 但是,我们正在循环 expenseData列出并将每个项目添加到当前行。 我们开始循环 18,这是电子表格中的当前行。 为了使表格的行更加清晰易读,我们通过使用 modulo手术。</p> <h2>导出为 CSV</h2> <p>到目前为止,我们已经探索了使用 XLSX 文件,但是,还有其他格式适合呈现这种数据。 CSV 文件是一个文本文件,其中包含由逗号分隔的数据行,主要用于导入和导出数据。</p> <p>考虑一种情况,我们希望将费用报告中的表存储在某个自托管数据库中。 我们可以将这个表格提取为 CSV 格式,然后通过几个步骤将其导入数据库。</p> <p><strong>首先,在主函数之外创建一个名为 generateCSV并在下面添加代码块:</strong></p> <pre class="brush:go;">//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 <p>这 generateCSV函数接受一个 excelize.File类型、起始轴和结束轴。 轴只是构成单元格的行和列的组合。 我们循环遍历每一行,对于每一行,我们循环遍历开始轴和结束轴边界内的每一列。</p> <p>然后我们使用 f.GetCellValue提取每个单元格的当前值。 因为列表示为字母字符串,所以我们将它们转换为符文以获取底层的 unicode 十进制。 最后,我们将提取的数据保存到 .csv文件 使用标准库中的 CSV 包 。</p> <p>我们可以在保存工作表并传递文件句柄后调用此函数。</p> <p><strong>在你的 main函数,添加以下代码块:</strong></p> <pre class="brush:go;">//main.go ///... err = f.SaveAs("expense-report.xlsx") err = generateCSV(f, Axis{17, "B"}, Axis{22, "G"}) if err != nil { log.Fatal(err) }
我们提供了我们之前为工作表创建的文件和表示表格范围的轴。
如果你运行 main.go文件,您应该会看到生成的 XLSX 文件和 CSV 文件:
$ go run main.go
结论
以电子表格兼容的格式呈现数据有很多用例,包括分析、转换和验证。 在本文中,我们学习了如何使用 Go 和 Excelize 包通过生成费用报告来处理电子表格。
当您考虑 Excelize 开箱即用的其他功能时,我们只是触及了皮毛。 您可以添加图像、创建图表、迷你图、形状、数据透视表等。 我希望你学到了一些新的东西,如果你有任何问题,请发表评论。 快乐编码!
LogRocket 主动显示和诊断您的应用程序和网站中最重要的问题
成千上万的工程和产品团队使用 LogRocket 来减少了解技术和可用性问题的根本原因所需的时间。 使用 LogRocket,您将减少与客户来回对话的时间,并消除无休止的故障排除过程。 LogRocket 让您可以花更多时间构建新事物,而减少修复错误的时间。
理论要掌握,实操不能落!以上关于《如何使用 Go 和 Excelize 构建电子表格》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

- 上一篇
- Golangcron定时器和定时任务的使用场景

- 下一篇
- Golang切片Slice功能操作详情
-
- 伶俐的眼神
- 这篇技术贴真是及时雨啊,好细啊,很棒,已收藏,关注大佬了!希望大佬能多写Golang相关的文章。
- 2023-03-30 13:15:29
-
- 负责的小白菜
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢作者大大分享技术贴!
- 2023-01-21 10:11:59
-
- 淡定的帅哥
- 这篇技术文章真是及时雨啊,太全面了,感谢大佬分享,收藏了,关注作者大大了!希望作者大大能多写Golang相关的文章。
- 2023-01-07 13:02:03
-
- Golang · Go教程 | 16小时前 |
- TigervncDebian多用户共享桌面超简单教程
- 482浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Go语言新手必看!切片vs数组,一次搞定这两个核心知识点
- 472浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Docker在Debian上运行超简单教程(保姆级教学)
- 210浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Debian设置hostname踩坑记录:权限问题大揭秘
- 334浏览 收藏
-
- Golang · Go教程 | 1天前 |
- Debian装SQLServer?这些问题你一定要注意!
- 284浏览 收藏
-
- Golang · Go教程 | 2天前 |
- Debian系统下Jenkins自动化部署脚本教学
- 367浏览 收藏
-
- Golang · Go教程 | 2天前 |
- DebianSwap服务器应用实测,这些场景真的用得上!
- 319浏览 收藏
-
- Golang · Go教程 | 2天前 |
- Debian跑TigerVNC实测!真香警告,快来看看性能咋样~
- 171浏览 收藏
-
- Golang · Go教程 | 2天前 |
- 在Debian上玩转SQLServer备份还原,手把手教你一步步操作
- 498浏览 收藏
-
- Golang · Go教程 | 2天前 |
- DebianOverlay不会玩?手把手教你轻松定制化安装
- 258浏览 收藏
-
- Golang · Go教程 | 2天前 |
- Go语言实战:time.Ticker&time.After用法区别及避坑技巧
- 240浏览 收藏
-
- Golang · Go教程 | 2天前 |
- Debian系统如何快速定位&干掉那些讨厌的僵尸进程
- 317浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 18次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 50次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 57次使用
-
- 稿定PPT
- 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
- 53次使用
-
- Suno苏诺中文版
- 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
- 57次使用
-
- Golang如何快速构建一个CLI小工具详解
- 2022-12-22 345浏览
-
- Go语言操作Excel利器之excelize类库详解
- 2023-01-07 116浏览
-
- GoExcelizeAPI源码阅读GetPageLayout及SetPageMargins
- 2022-12-31 270浏览
-
- GoExcelizeAPI源码解读GetSheetViewOptions与SetPageLayout
- 2022-12-30 189浏览
-
- Go Excelize API源码阅读SetSheetViewOptions示例解析
- 2022-12-24 485浏览