0

0

怎样用Golang操作Excel文件 通过excelize库读写电子表格

P粉602998670

P粉602998670

发布时间:2025-08-14 19:25:01

|

370人浏览过

|

来源于php中文网

原创

答案:使用excelize库可高效实现Golang对Excel文件的读写及高级操作。该库提供直观API,支持新建或打开文件、单元格读写、合并单元格、设置列宽等基础功能;通过流式读写优化大型文件处理,降低内存占用;并支持图表、图片、公式、条件格式、数据验证等高级特性,适用于复杂报表生成,具备跨平台、高性能、社区活跃等优势,是Go语言处理Excel的优选方案。

怎样用golang操作excel文件 通过excelize库读写电子表格

用Golang操作Excel文件,特别是借助

excelize
库,这事儿真没想象中那么复杂。它提供了一套非常直观的API,让你能轻松地读写电子表格,无论是简单的数据录入还是复杂的文件解析,都能找到对应的解决方案。可以说,
excelize
是Go语言生态里处理Excel文件的一个非常趁手的工具

解决方案

要用

excelize
库来读写Excel文件,我们首先得把它引入到项目里。这通常通过Go模块来完成:

go get github.com/xuri/excelize/v2

接下来,无论是新建一个Excel文件写入数据,还是打开一个现有文件读取内容,核心逻辑都围绕

excelize.NewFile()
excelize.OpenFile()
展开。

写入Excel文件:

立即学习go语言免费学习笔记(深入)”;

package main

import (
    "fmt"
    "log"

    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile() // 创建一个新的Excel文件
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()

    // 设置单元格的值
    f.SetCellValue("Sheet1", "A1", "你好,世界!")
    f.SetCellValue("Sheet1", "B1", 100)
    f.SetCellValue("Sheet1", "C1", true)

    // 写入多行数据
    rows := [][]interface{}{
        {"姓名", "年龄", "城市"},
        {"张三", 30, "北京"},
        {"李四", 25, "上海"},
    }
    for i, row := range rows {
        startCell, err := excelize.CoordinatesToCellName(1, i+1) // A1, A2, A3...
        if err != nil {
            log.Println(err)
            continue
        }
        if err := f.SetSheetRow("Sheet1", startCell, &row); err != nil {
            log.Println(err)
        }
    }

    // 合并单元格,举个例子
    if err := f.MergeCell("Sheet1", "A5", "C5"); err != nil {
        log.Println(err)
    }
    f.SetCellValue("Sheet1", "A5", "这是一个合并的单元格")

    // 设置列宽
    f.SetColWidth("Sheet1", "A", "C", 20)

    // 保存文件
    if err := f.SaveAs("示例文件.xlsx"); err != nil {
        log.Println(err)
    }
    fmt.Println("Excel文件写入成功:示例文件.xlsx")
}

读取Excel文件:

package main

import (
    "fmt"
    "log"

    "github.com/xuri/excelize/v2"
)

func main() {
    f, err := excelize.OpenFile("示例文件.xlsx") // 打开一个现有的Excel文件
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()

    // 获取指定单元格的值
    cellA1, err := f.GetCellValue("Sheet1", "A1")
    if err != nil {
        log.Println(err)
    }
    fmt.Printf("A1单元格的值: %s\n", cellA1)

    // 遍历工作表中的所有行和单元格
    rows, err := f.GetRows("Sheet1")
    if err != nil {
        log.Println(err)
        return
    }
    fmt.Println("\n遍历所有数据:")
    for rowIndex, row := range rows {
        fmt.Printf("第 %d 行: ", rowIndex+1)
        for colIndex, colCell := range row {
            fmt.Printf("列 %d: %s | ", colIndex+1, colCell)
        }
        fmt.Println()
    }

    // 获取合并单元格的值,会返回合并区域左上角单元格的值
    mergedCellVal, err := f.GetCellValue("Sheet1", "A5")
    if err != nil {
        log.Println(err)
    }
    fmt.Printf("A5单元格(合并区域)的值: %s\n", mergedCellVal)
}

这些代码片段展示了

excelize
最基础也是最常用的读写操作。你会发现它的API设计得相当直观,基本上遵循了Excel本身的逻辑。

为什么选择 Excelize 库进行 Golang Excel 操作?

我个人觉得,在Go语言生态里处理Excel文件,

excelize
确实是一个非常值得信赖的选择。它不仅仅是因为功能全面,更在于它在性能、社区活跃度和易用性上做到了很好的平衡。

从我实际项目中的经验来看,

excelize
xlsx
格式的支持非常到位,这在当今Excel文件普遍采用
xlsx
格式的背景下显得尤为重要。它不依赖COM对象或其他外部库,纯Go实现,这让它在跨平台部署时省去了很多麻烦。比如,你不需要担心在Linux服务器上运行Go程序时,还需要额外安装Office组件。这种纯粹性,对于追求简洁和高效的Go开发者来说,简直是福音。

此外,

excelize
在处理大型文件时表现也相当不错,它提供了流式读写的功能,这对于内存有限但需要处理GB级别Excel文件的场景来说,简直是救命稻草。你不需要一次性把整个文件加载到内存里,这大大降低了OOM(内存溢出)的风险。而且,它的社区非常活跃,遇到问题时,通常能在GitHub Issues里找到类似的讨论或者快速获得帮助,这对于开发者来说,无疑增加了信心。

在实际项目中,使用 Excelize 读写大型 Excel 文件有哪些性能考量和优化策略?

处理大型Excel文件,性能确实是个绕不开的话题。我记得有一次,一个客户需要我们生成一个包含数十万行数据的报表,如果直接用普通写入方式,内存占用会飙升,甚至导致程序崩溃。这时候,

excelize
的流式处理就显得尤为关键了。

核心考量:内存与I/O

大型文件操作,最主要的就是内存消耗和磁盘I/O。

excelize
虽然优化得不错,但如果不注意,仍然可能遇到瓶颈。

  1. 流式写入 (Stream Writer):这是处理大量数据写入的首选。

    excelize
    提供了
    NewStreamWriter
    方法,它允许你逐行写入数据,而不是一次性构建整个工作表结构。这样,每次写入的数据量很小,极大地减少了内存峰值。

    // 示例:流式写入
    f := excelize.NewFile()
    sw, err := f.NewStreamWriter("Sheet1")
    if err != nil {
        log.Fatal(err)
    }
    for rowID := 1; rowID <= 100000; rowID++ { // 写入10万行
        row := make([]interface{}, 10) // 假设每行10列
        for colID := 0; colID < 10; colID++ {
            row[colID] = fmt.Sprintf("单元格_%d_%d", rowID, colID)
        }
        cell, _ := excelize.CoordinatesToCellName(1, rowID)
        if err := sw.SetRow(cell, row); err != nil {
            log.Println(err)
        }
    }
    if err := sw.Flush(); err != nil { // 刷新缓冲区,确保所有数据写入
        log.Println(err)
    }
    if err := f.SaveAs("大文件流式写入.xlsx"); err != nil {
        log.Println(err)
    }

    流式写入的原理是,它不会在内存中完整地构建整个Excel文件的XML结构,而是将数据分批写入一个临时文件,最后再组合成完整的

    xlsx
    文件。这对于内存占用来说是质的飞跃。

  2. 流式读取 (Stream Reader):类似地,当需要读取大型Excel文件时,也应该考虑流式读取。通过

    Rows()
    Rows(sheetName)
    方法获取一个迭代器,可以逐行遍历数据,而不是一次性加载所有行。

    // 示例:流式读取
    f, err := excelize.OpenFile("大文件流式写入.xlsx")
    if err != nil {
        log.Fatal(err)
    }
    rows, err := f.Rows("Sheet1")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close() // 记得关闭迭代器
    
    for rows.Next() {
        row, err := rows.Columns()
        if err != nil {
            log.Println(err)
            continue
        }
        // 处理每一行数据
        // fmt.Println(row)
    }
    if err = rows.Err(); err != nil {
        log.Println(err)
    }

    这种方式可以避免一次性将所有数据加载到内存,尤其是在你只需要处理部分数据或者进行聚合计算时,效果显著。

    Glarity
    Glarity

    Glarity是一款免费开源的AI浏览器扩展,提供YouTube视频总结、网页摘要、写作工具等功能,支持免费的镜像翻译,电子邮件写作辅助,AI问答等功能。

    下载
  3. 避免不必要的样式和合并操作:样式和合并单元格会增加文件的复杂度和内存开销。如果不是必须,尽量减少这些操作。如果你真的需要设置样式,考虑批量设置或者利用

    SetCellStyle
    而不是逐个单元格设置。

  4. 关闭文件句柄:无论是读还是写,操作完成后务必调用

    f.Close()
    。这能确保文件资源被正确释放,避免潜在的内存泄漏或文件锁问题。尤其是在长时间运行的服务中,忘记关闭文件句柄可能会导致资源耗尽。

总的来说,处理大型Excel文件,核心就是“少即是多”——尽量减少内存中的数据量,通过流式处理来分摊压力。

除了基本的读写,Excelize 还能实现哪些高级的 Excel 操作?

excelize
的功能远不止基本的单元格读写那么简单。它在很多方面都提供了相当强大的支持,这让它在处理复杂报表或数据可视化需求时显得游刃有余。

我个人在项目中就用过它来生成带有图表的年度报告,或者为数据设置条件格式来突出显示异常值。这些高级功能,使得生成的Excel文件不仅仅是数据的容器,更是信息传递的有效载体。

  1. 图表(Charts)

    excelize
    支持创建多种类型的图表,比如柱状图、折线图、饼图、散点图等等。你可以指定数据系列、图表标题、轴标签,甚至自定义图表的样式。这对于需要将数据可视化呈现的场景非常有用,比如生成月度销售报告、项目进度图等。

    // 简单示例:添加柱状图
    // ... 前面写入数据的代码 ...
    if err := f.AddChart("Sheet1", "E1", `{
        "type": "col",
        "series": [
            {"name": "Sheet1!$B$2", "categories": "Sheet1!$A$2:$A$3", "values": "Sheet1!$B$2:$B$3"}
        ],
        "title": {"name": "年龄分布"},
        "plotarea": {"show_bubble_size": true}
    }`); err != nil {
        log.Println(err)
    }
    // 保存文件
    // ...

    这里的配置是JSON字符串,你需要根据

    excelize
    的文档来构建正确的图表配置。这部分虽然稍微复杂一点,但一旦掌握,就能生成非常专业的图表。

  2. 图片(Images):你可以在Excel文件中插入图片,这对于品牌logo、产品图片或者图示说明等场景非常实用。你可以控制图片的位置、大小,甚至设置打印属性。

    // 示例:插入图片
    // 假设当前目录下有 logo.png
    if err := f.AddPicture("Sheet1", "D1", "logo.png", nil); err != nil {
        log.Println(err)
    }
    // ...
  3. 合并单元格与拆分(Merge Cells):这个前面已经提到了,它允许你将多个单元格合并成一个大单元格,或者解除合并。这在制作表头、标题或需要跨多列/行显示内容的表格时非常常用。

  4. 公式(Formulas)

    excelize
    支持设置单元格公式,这意味着你可以在Go程序中定义Excel的计算逻辑,而不是在Excel中手动输入。这对于生成动态计算的报表非常有用。

    // 示例:设置公式
    f.SetCellValue("Sheet1", "D2", "=SUM(B2:C2)") // 假设B2和C2有数字
    // ...
  5. 数据验证(Data Validation):你可以为单元格设置数据验证规则,比如限制输入只能是数字、日期,或者从一个列表中选择。这对于确保数据质量非常重要。

  6. 条件格式(Conditional Formatting):根据单元格的值或其他规则,自动应用不同的格式(字体颜色、背景色等)。这能让关键数据一目了然。比如,销售额低于某个阈值的单元格显示为红色。

  7. 冻结窗格(Freeze Panes):在查看大型表格时,冻结行或列可以保持标题可见,提高用户体验。

    excelize
    也提供了相应的方法。

  8. 自定义样式(Custom Styles):除了基本的字体、颜色设置,你还可以创建复杂的样式,包括边框、填充、对齐方式、数字格式等,并将其应用于多个单元格。这使得生成的Excel文件具有高度的定制化和专业性。

这些高级功能的存在,让

excelize
不仅仅是一个数据导入导出的工具,更是一个强大的报表生成和数据呈现引擎。在实际开发中,灵活运用这些功能,能够极大地提升程序的实用性和用户体验。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

230

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

344

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

397

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

282

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

194

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

540

2025.06.17

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.4万人学习

Git 教程
Git 教程

共21课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号