如何使用 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教程 | 33分钟前 |
- Golang反射详解:基础到高级用法全解析
- 150浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang读写Excel教程:Excelize使用指南
- 401浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go语言new与make区别详解
- 143浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang跨进程通信优化:共享内存与Unix套接字对比
- 494浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang模块打包与仓库上传指南
- 433浏览 收藏
-
- Golang · Go教程 | 1小时前 | 相对路径 GoModules go.mod 模块路径 internal目录
- Golang模块引用方法与路径设置技巧
- 163浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang集成BoltDB实现本地KV存储方案
- 417浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go语言匿名函数详解:实现Lambda表达式
- 212浏览 收藏
-
- Golang · Go教程 | 1小时前 | golang 依赖注入
- Golang依赖注入:反射与生成方案详解
- 441浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golangstrings库常用方法全解析
- 372浏览 收藏
-
- Golang · Go教程 | 1小时前 | 反射 结构体 reflect.Type reflect.Value 动态赋值
- Golang反射实现动态类型赋值与创建方法
- 116浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Golang微服务监控实现方法
- 441浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 514次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- AI Mermaid流程图
- SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
- 481次使用
-
- 搜获客【笔记生成器】
- 搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
- 472次使用
-
- iTerms
- iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
- 502次使用
-
- TokenPony
- TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
- 537次使用
-
- 迅捷AIPPT
- 迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
- 471次使用
-
- 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浏览