golang操作excel的高性能库——excelize/v2

news2024/11/20 8:47:36

目录

  • 介绍
  • 文档与源码
  • 安装
  • 快速开始
    • 创建 Excel 文档
    • 读取 Excel 文档
    • 打开数据流
    • 流式写入
  • [相关 Excel 开源类库性能对比](https://xuri.me/excelize/zh-hans/performance.html)

介绍

Excelize是一个纯Go编写的库,提供了一组功能,允许你向XLAM / XLSM / XLSX / XLTM / XLTX文件写入和读取。支持读取和写入由Microsoft Excel™ 2007及更高版本生成的电子表格文档。通过高度兼容性支持复杂组件,并提供了流式API,用于生成或从包含大量数据的工作表中读取数据。此库需要Go版本1.16或更高版本。可以使用Go的内置文档工具查看完整文档,也可以在go.dev和文档引用中在线查阅。

另外还有另外一个库:github.com/360EntSecGroup-Skylar/excelize/v2,不过它已经没了,或者说它和github.com/xuri/excelize/v2是一个东西,用法功能都完全一样。。。。

文档与源码

Github源码:https://github.com/qax-os/excelize

中文文档:https://xuri.me/excelize/zh-hans/

安装

go get github.com/xuri/excelize/v2

快速开始

创建 Excel 文档

package main

import (
    "fmt"

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

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // 创建一个工作表
    index, err := f.NewSheet("Sheet2")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 设置单元格的值
    f.SetCellValue("Sheet2", "A2", "Hello world.")
    f.SetCellValue("Sheet1", "B2", 100)
    // 设置工作簿的默认工作表
    f.SetActiveSheet(index)
    // 根据指定路径保存文件
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

读取 Excel 文档

package main
import (
    "fmt"
    "github.com/xuri/excelize/v2""
)
func main() {
    f, err := excelize.OpenFile("Book1.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 获取工作表中指定单元格的值
    cell, err := f.GetCellValue("Sheet1", "B2")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 获取 Sheet1 上所有单元格
    rows, err := f.GetRows("Sheet1")
    for _, row := range rows {
        for _, colCell := range row {
            fmt.Print(colCell, "\t")
        }
        fmt.Println()
    }
}

打开数据流

OpenReader 从 io.Reader 读取数据流。、

创建一个简单的 HTTP 服务器接收上传的电子表格文档,向接收到的电子表格文档添加新工作表,并返回下载响应:

package main
import (
    "fmt"
    "net/http"
    "github.com/xuri/excelize/v2""
)
func process(w http.ResponseWriter, req *http.Request) {
    file, _, err := req.FormFile("file")
    if err != nil {
        fmt.Fprintf(w, err.Error())
        return
    }
    defer file.Close()
    f, err := excelize.OpenReader(file)
    if err != nil {
        fmt.Fprintf(w, err.Error())
        return
    }
    f.NewSheet("NewSheet")
    w.Header().Set("Content-Disposition", "attachment; filename=Book1.xlsx")
    w.Header().Set("Content-Type", req.Header.Get("Content-Type"))
    if _, err := f.WriteTo(w); err != nil {
        fmt.Fprintf(w, err.Error())
    }
    return
}
func main() {
    http.HandleFunc("/process", process)
    http.ListenAndServe(":8090", nil)
}

流式写入

func (f *File) NewStreamWriter(sheet string) (*StreamWriter, error)

NewStreamWriter 通过给定的工作表名称返回流式写入器,用于向已存在的空白工作表写入大规模数据。请注意通过此方法按行向工作表写入数据后,必须调用 Flush 函数来结束流式写入过程,并需要确保所写入的行号是递增的,普通函数不能与流式函数混合使用在工作表中写入数据。写入过程中内存数据超过 16MB 时,流写入器将尝试使用磁盘上的临时文件来减少内存使用,此时您无法获取单元格值。例如,向工作表流式按行写入 102400 行 x 50 列带有样式的数据:

f := excelize.NewFile()
defer func() {
    if err := f.Close(); err != nil {
        fmt.Println(err)
    }
}()
sw, err := f.NewStreamWriter("Sheet1")
if err != nil {
    fmt.Println(err)
    return
}
styleID, err := f.NewStyle(&excelize.Style{Font: &excelize.Font{Color: "777777"}})
if err != nil {
    fmt.Println(err)
    return
}
// 流式设置单元格的公式和值:
if err := sw.SetRow("A1",
    []interface{}{
        excelize.Cell{StyleID: styleID, Value: "Data"},
        []excelize.RichTextRun{
            {Text: "Rich ", Font: &excelize.Font{Color: "2354e8"}},
            {Text: "Text", Font: &excelize.Font{Color: "e83723"}},
        },
    },
    // 流式设置单元格的值和行样式:
    excelize.RowOpts{Height: 45, Hidden: false}); err != nil {
    fmt.Println(err)
    return
}
for rowID := 2; rowID <= 102400; rowID++ {
    row := make([]interface{}, 50)
    for colID := 0; colID < 50; colID++ {
        row[colID] = rand.Intn(640000)
    }
    cell, err := excelize.CoordinatesToCellName(1, rowID)
    if err != nil {
        fmt.Println(err)
        break
    }
    if err := sw.SetRow(cell, row); err != nil {
        fmt.Println(err)
        break
    }
}
if err := sw.Flush(); err != nil {
    fmt.Println(err)
    return
}
if err := f.SaveAs("Book1.xlsx"); err != nil {
    fmt.Println(err)
}

SetRow 通过给定的起始坐标和指向数组类型“切片”的指针将数据按行流式写入工作表中。请注意,在设置行之后,必须调用 Flush 函数来结束流式写入过程,并需要确所保写入的行号是递增的。

相关 Excel 开源类库性能对比

在这里插入图片描述
下图展示了 Go, Python, Java, PHP 和 NodeJS 语言中典型 Excel 开源基础库,基于普通个人计算机 (2.6 GHz 6-Core Intel Core i7, 16 GB 2667 MHz DDR4, 500GB SSD, macOS Monterey 12.3.1) 生成 50 列 102400 行纯文本单元格的性能表现。
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis主从复制、哨兵服务、持久化、数据类型

Top NSD DBA DAY10 案例1&#xff1a;配置主从复制案例2&#xff1a;配置带验证的主从复制案例3&#xff1a;哨兵服务案例4&#xff1a;使用RDB文件恢复数据案例5&#xff1a;AOF案例6&#xff1a;字符类型案例7&#xff1a;列表类型案例8&#xff1a;散列类型案例9&#xff…

服务管理|反弹shell|计划任务|救援启动级别

服务管理 systemctl cd /usr/lib/systemd/system systemd这个服务管理的后续服务&#xff0c;都是有配置⽂件的 systemd是linux系统第一个运行的进程&#xff0c;用来创建系统的守护进程来管理整个linux系统。systemd取代init的一个优势就是他集合了丰富的功能&#xff0c;同…

如何通过观测云的RUM找到前端加载的瓶颈--可观测性入门篇

声明与保证 本文写作于2023年6月&#xff0c;性能优化的评价标准和优化方式仅适用于当前观测云控制台&#xff0c;当然随着产品迭代及技术更新&#xff0c;本文也会应要求适当更新。 创建、修订时间创建修改人版本2023/6/24观测云***v1.0.0 1.网站性能评价的发展史&#xff…

2023/8/16总结

这几天完成了私信的功能点&#xff0c;用websocket做的。 这是大概的界面&#xff0c;参考的是微信 用户可以搜索好友&#xff1a; 如果不存在是下面这样&#xff0c;存在就会在左边的聊天里面显示有这个人选项 发送消息 接下来需要把推荐算法给做了

Dynamic Web TWAIN Crack,支持向图像添加彩色矩形

Dynamic Web TWAIN Crack,支持向图像添加彩色矩形 Dynamic Web TWAIN用于快速部署 Web 应用程序的文档扫描 SDK&#xff0c;文档扫描SDK&#xff0c;&#xff0c;超过 5300 家公司信任 Dynamic Web TWAIN &#xff0c;因其稳健性和安全性而受到超过 5300 家公司的信赖&#xff…

VS重新生成之后Debug文件夹中无lib文件,错误提示:无法打开~.cu.obj

情况&#xff1a; 改动代码后程序运行依旧为更新&#xff0c;之后变重新生成&#xff0c; 多个项目 问题&#xff1a; case1. 当重新生成单个改动的项目时&#xff0c;错误提示&#xff1a;错误 716 error LNK1181: 无法打开输入文件“F:\。。。。。。。\Debug\LSVM_generat…

excel隔行取数求和/均值

问题描述 如图有好多组数据&#xff0c;需要求每组数据对应位置的平均值 解决方法 SUM(IF(MOD(ROW(C$2:C$81), 8) MOD(ROW(C2), 8), C$2:C$81, 0))/10然后下拉右拉扩充即可&#xff0c;其中需要根据自身需要修改一些数据 SUM(IF(MOD(ROW(起始列$起始行:结束列$结束行), 每…

成集云 | 电子签署集成腾讯云企业网盘 | 解决方案

源系统成集云目标系统 方案介绍 电子签署是通过电子方式完成合同、文件或其他文件的签署过程。相较于传统的纸质签署&#xff0c;电子签署具有更高效、更便捷、更安全的优势。 在电子签署过程中&#xff0c;使用电子签名技术来验证签署者的身份并确保签署文件的完整性。电子…

【k8s、云原生】基于metrics-server弹性伸缩

第四阶段 时 间&#xff1a;2023年8月17日 参加人&#xff1a;全班人员 内 容&#xff1a; 基于metrics-server弹性伸缩 目录 一、Kubernetes部署方式 &#xff08;一&#xff09;minikube &#xff08;二&#xff09;二进制包 &#xff08;三&#xff09;Kubeadm 二…

【电源专题】案例:充电芯片规格书写过压保护6V,为什么测试结果却是6.6V

本案例是在指导新人在新标准测试过程中产生的。新的测试标准里有测试USB口的输入有效电压,其中要求设置稳压源从4.2V以0.1V进行步进增加到USB口的OVP电压。 这其实就是变向的测试充电芯片的OVP电压。因为USB充电最后接入的是充电芯片的VIN脚,USB输入电压过高时,充电芯片会自…

每日一题——二叉树的镜像

题目 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 数据范围&#xff1a;二叉树的节点数 0≤n≤1000 &#xff0c; 二叉树每个节点的值 0≤val≤1000 要求&#xff1a; 空间复杂度 O(n) 。本题也有原地操作&#xff0c;即空间复杂度 O(1) 的解法&#xff0c;时间…

网络通信原理TCP字段解析(第四十七课)

字段含义Source Port(源端口号)源端口,标识哪

酒店管理系统哪家好?的修设备售后服务管理系统有什么用?

随着人们的生活水平不断提升&#xff0c;越来越多的人开始对五星级酒店的品质提出更高的要求。这些规模宏大、设施齐全的酒店&#xff0c;需要日常进行复杂的维护工作才能保持正常运转。然而&#xff0c;传统的人工维保早已无法满足信息化管理的需求。为了更好地管理这些设备设…

SQL Monitor Crack,PostgreSQL监控的传入复制图表

SQL Monitor Crack,PostgreSQL监控的传入复制图表  现在&#xff0c;您可以在从Estate页面导出的Microsoft Excel报告的摘要标题中看到UTC偏移量。 添加了PostgreSQL监控的传入复制图表。 Microsoft PowerShell API现在支持将使用New-SqlMonitorWindowsHost和New-SqlMonitorin…

ATFX汇评:新西兰联储维持基准利率不变,3%仍是通胀调控目标

ATFX汇评&#xff1a;新西兰联储8月利率决议结果&#xff1a;维持5.5%基准利率不变&#xff1b;委员会认为&#xff0c;在可预见的未来&#xff0c;官方现金利率需要保持在限制性水平&#xff0c;以确保年消费通胀率回到1-3%的目标区间。7月初&#xff0c;澳洲联储利率决议宣布…

fiddler抓包问题记录,支持https、解决 tunnel to 443

fiddler下载安装步骤及基本配置 fiddler抓包教程&#xff0c;如何抓取HTTPS请求&#xff0c;详细教程 可能遇到的问题及解决方案 1. 不能正常访问页面&#xff08;所有https都无法访问&#xff09; 解决方案&#xff1a;查看下面配置是否正确 Rules-customization 找到 OnB…

自动化安装系统(一)

系统安装过程 加载boot loader加载启动安装菜单加载内核和initrd文件加载根系统运行anaconda的安装向导 安装光盘中与安装相关的文件 安装autofs启动后会自动出现/misc目录。 在虚拟机设置中添加CD/DVD&#xff0c;使用系统ISO文件&#xff0c;登录系统后mount /dev/cdrom …

【Docker】Docker使用之容器技术发展史

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0…

【腾讯云 Cloud Studio 实战训练营】Hexo 框架 Butterfly 主题搭建个人博客

什么是Cloud Studio Cloud Studio 是基于浏览器的集成式开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能在线编程。 ​ Hexo 博客成品展示 本人博客如下&…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、论证逻辑——解释

真题&#xff08;2018-39&#xff09;-解释-圈出矛盾点-简单题&#xff1a;矛盾点易找&#xff0c;无干扰项 39.我国中原地区如果降水量比往年偏低&#xff0c;该地区的河流水会下降&#xff0c;流速会减缓。这有利于河流中的水草生长&#xff0c;河流中的水草总量通常也会随之…