【go】Excelize处理excel表 带数据校验的文件导出

news2024/11/18 11:45:44

文章目录

  • 1 Excelize介绍
  • 2 相关需求与实现
    • 2.1 数据的excel文件导出
    • 2.2 带数据校验的excel文件导出

1 Excelize介绍

  • Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库。官方文档:https://xuri.me/excelize/zh-hans/

  • 引入方法

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

2 相关需求与实现

2.1 数据的excel文件导出

  • 需求:入参是一个map,其键是每个sheet页的名字,其值是一个二维切片。在每个sheet页中依次写入切片中的数据。返回文件名和错误信息。
  • 代码:
// 写入数据到export/*.xlsx
// datas: map[sheet]每个sheet页的数据
// return: 文件名, error

func WriteExcel(datas map[string][][]string) (string, error) {
	file := excelize.NewFile()

	for sheetName, data := range datas {
		index, _ := file.NewSheet(sheetName)
		for i, row := range data {
			for j, val := range row {
				// 列行数字索引转excel坐标索引
				cellName, _ := excelize.CoordinatesToCellName(j+1, i+1)
				//fmt.Println("cellName:", cellName)
				// 设置,写入
				file.SetCellValue(sheetName, cellName, val)
			}
		}
		// 创建表格
		file.SetActiveSheet(index)
	}
	filename := "aaa" + ".xlsx"

	_, err := os.ReadDir("aaa/")
	if err != nil {
		// 不存在就创建
		err = os.MkdirAll("aaa/", fs.ModePerm)
		if err != nil {
			fmt.Println(err)
		}
	}
	// 删除默认工作表
	file.DeleteSheet("Sheet1")
	err = file.SaveAs("aaa/" + filename)
	if err != nil {
		return "", err
	}
	return filename, nil
}

func main() {
	datas := make(map[string][][]string)
	datas["xxx"] = [][]string{{"A1", "B1", "C1", "d1", "E1", "G1", "H1", "I1"}, {"A2", "B2", "C2"}, {"A3", "B3", "C3"}}
	datas["yyy"] = [][]string{{"X1", "Y1", "Z1"}, {"X2", "Y2", "Z2"}, {"X3", "Y3", "Z3"}}
	fileName, err := WriteExcel(datas)
	if err != nil {
		fmt.Println("Write excel error: ", err)
		return
	}

	fmt.Println("Write excel success, file name is: ", fileName)
  • 输出文件:
    在这里插入图片描述
    在这里插入图片描述

2.2 带数据校验的excel文件导出

  • 需求:入参是一个map,其键是每个sheet页的名字,其值是一个二维切片。在每个sheet页中依次写入切片中的数据。返回文件名和错误信息。
    数据校验:A列只能输入a,aa,aaa,aaaa;B列只能输入b,bb;C列只能输入c,cc,ccc。
  • 代码:
func WriteExcelValidation(datas map[string][][]string, validations map[string][]string) (string, error) {
	file := excelize.NewFile()

	for sheetName, data := range datas {

		// 创建sheet
		index, _ := file.NewSheet(sheetName)

		// 有效性校验
		for col, validation := range validations {
			dv := excelize.NewDataValidation(true)
			dv.SetSqref(col + "2:" + col + "1048576")
			err := dv.SetDropList(validation)
			if err != nil {
				return "", err
			}
			file.AddDataValidation(sheetName, dv)
		}

		for i, row := range data {
			for j, val := range row {
				// 列行数字索引转excel坐标索引
				cellName, _ := excelize.CoordinatesToCellName(j+1, i+1)
				// 设置,写入
				file.SetCellValue(sheetName, cellName, val)
			}
		}

		// 创建表格
		file.SetActiveSheet(index)
	}
	filename := "bbb" + ".xlsx"

	// 创建目录
	_, err := os.ReadDir("aaa/")
	if err != nil {
		// 不存在就创建
		err = os.MkdirAll("aaa/", fs.ModePerm)
		if err != nil {
			return "", err
		}
	}

	file.DeleteSheet("Sheet1")
	err = file.SaveAs("aaa/" + filename)
	if err != nil {
		return "", err
	}
	return filename, nil
}

func main() {
	validations := make(map[string][]string)
	validations["A"] = []string{"a", "aa", "aaa", "aaaa"}
	validations["B"] = []string{"b", "bb"}
	validations["E"] = []string{"c", "cc", "ccc"}

	datas := make(map[string][][]string)
	datas["xxx"] = [][]string{{"A1", "B1", "C1", "d1", "E1", "G1", "H1", "I1"}, {"A2", "B2", "C2"}, {"A3", "B3", "C3"}}
	datas["yyy"] = [][]string{{"X1", "Y1", "Z1"}, {"X2", "Y2", "Z2"}, {"X3", "Y3", "Z3"}}
	fileName, err := WriteExcelValidation(datas, validations)
	if err != nil {
		fmt.Println("Write excel error: ", err)
		return
	}

	fmt.Println("Write excel success, file name is: ", fileName)
}
  • 输出文件:
    在这里插入图片描述

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

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

相关文章

Linux——进程控制:创建、终止、等待、替换

进程创建 fork #include <unistd.h> pid_t fork(void);操作系统做了什么&#xff1f; 调用fork之后&#xff0c;内核的工作&#xff1a; 分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回&#xff0c…

一个简单案例理解为什么在多线程的应用中要使用锁

需求:使用10个线程,同时对一个值count进行加一操作,每个线程对count加100000次,最终使得count1000000 第一版代码:不加锁 ​​​lock.c #include<stdio.h> #include<pthread.h>#define THREAD_COUNT 10void *thread_callback(void *arg){int *pcount(int*)arg;in…

计算机网络--网络传输基本概念

什么是IP地址&#xff1f; 在计算机出厂的时候&#xff0c;有一个唯一标识的物理地址。但是因为厂商不同等各种原因&#xff0c;用来标识一台计算机在网络中是比较麻烦的&#xff0c;于是出现了IP地址&#xff0c;IP地址是互联网协议地址的意思&#xff0c;是“Internet Protoc…

【Matlab】数字图像的 SVD 分解

奇异值分解 (SVD, Singular Value Decomposition) 是线性代数中一种重要的矩阵变换方法&#xff0c;对矩阵进行 SVD 分解&#xff0c;可以把复杂的矩阵简化&#xff0c;从而提取出重要的信息。数字图像的 SVD 分解是对数字图像建模的一种方法与工具&#xff0c;可以应用于图像压…

操作系统01-导论

一、概述 操作系统&#xff1a;英文是operating system&#xff0c;OS 它的作用运行用户程序&#xff08;核心目标&#xff09;高效使用计算机&#xff08;面向系统&#xff09;方便使用计算机&#xff08;面向用户&#xff09; 二、内容 2.1 现代计算机系统 一个或多个CPU和…

机器学习:self supervised learning

340M 参数 BERT 自监督学习的目标跟目标越接近越好。 一个任务&#xff1a;预测句子中被mask的词&#xff1a; BERT通过Masking Input来获得训练数据 mask有两种做法&#xff1a; 将某个字token换成一个特殊符号&#xff08;代表盖住&#xff09; 随机把某个字换成另外一个…

chatgpt赋能python:Python程序怎么打包

Python程序怎么打包 Python作为一种功能强大的编程语言&#xff0c;它的很多应用都需要打包成可执行文件或者可以方便部署的代码。本篇文章将介绍Python程序打包的方法及步骤。 为什么需要打包&#xff1f; 分享代码或程序&#xff1a;当你编写了一个Python程序并且想要分享给…

【⑥MySQL多表查询】:让你的数据检索更高效

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL中多表查询相关知识的讲解 目录 前言一、多表关系二、多表查询1、交叉连接2、内连接3、外连接 三、集合运算四、七种JOINS实现五、多表查询练习六、总结 一、多表关系 ✨项目开发中&#xff0c;在进行数据库表结…

MySQL生产环境高可用架构详解

一、MySQL高可用集群介绍 1、数据库主从架构与分库分表 随着现在互联网的应用越来越大&#xff0c;数据库会频繁的成为整个应用的性能瓶颈。而 我们经常使用的MySQL数据库&#xff0c;也会不断面临数据量太大、数据访问太频繁、数据 读写速度太快等一系列的问题。所以&#xf…

记录分享在10年老的商务本Dell E6230上安装Debian 12的过程,遇到的问题和解决方法

原先在笔记本上安装的是Debian 9&#xff0c;最近发现无法更新了&#xff0c;查一下发现&#xff0c;所有的“源”只支持deb10&#xff0c;11 和 12&#xff0c;所以特意订了一块新的硬盘来安装新系统&#xff0c;前后倒腾了两天多。 在此记录这个过程中遇到的问题和解决的方法…

Mysql主从复制和读写分离(期望日子清静,抬头皆是温柔)

文章目录 一、读写分离1.什么是读写分离?2.为什么要读写分离呢?3.什么时候要读写分离?4.读写分离原理5.读写分离方式&#xff08;1&#xff09;基于程序代码内部实现&#xff08;2&#xff09;基于中间代理层实现 二、主从复制1.主从复制与读写分离的关系2.mysql支持的复制类…

langchain源码阅读系列(一)之LLM输入输出管理

原文首发于博客文章OpenAI 文档解读 LangChain 主体分为 6 个模块&#xff0c;分别是对&#xff08;大语言&#xff09;模型输入输出的管理、外部数据接入、链的概念、&#xff08;上下文记忆&#xff09;存储管理、智能代理以及回调系统&#xff0c;通过文档的组织结构&#x…

如何编写一个最简单的 udp 版本的 echo server 和 echo client(小白也懂!)

目录 目的 第一步 编写Server(服务器) 第二步 创建Server的各类参数 第三步 实现具体的Server内容 第四步 编写Client(客户端) 实现具体的Client内容 总流程 总代码 源码下载 目的 我们编写一个udp 版本的 echo server 和 echo client 实现在自己电脑上通过客户端…

open【部署、使用教程】

目录 【1】创建证书 【2】安装openVPN-Server端并配置 【3】将证书移动到相对路径 【4】开启内核转发功能&#xff0c;否则会无法启动openVPN 【5】启动服务&#xff0c;加入开机自启 【6】启动后服务端会生成一个tun0的虚拟网卡&#xff0c;用于不同网段之间相互通信 【…

VUE2.0集成 Markdown 编辑器

Markdown编辑器的使用 这是一款基于Vue的markdown编辑器。既可以用来编辑Markdown语法&#xff0c;又可以用来解析 效果图,mavonEditor实现了Markdown集成 Markdown是一种标记语言&#xff0c;相较于word文档更加清晰方便&#xff0c;适合进行笔记等。将Markdown集成进入自己项…

Matlab使用S函数

什么是S函数&#xff1f; S-函数是系统函数&#xff08;System Function&#xff09;的简称&#xff0c;在 Simulink 中用非图形化的方式来描述一个模块。一个完整的S-函数结构体系包含了描述一个动态系统所需要的全部能力。使用S-函数用户可以向 Simulink 模型中添加自己的模块…

【PCB专题】Allegro中设置泪滴

PCB绘制完成后有时按需要对PCB进行添加泪滴的操作是非常必要的。 添加泪滴的作用主要是: 信号传输时平滑阻抗,减少阻抗的急剧跳变,避免高频信号传输时由于线宽突然变小而造成反射。 焊接时可以保护焊盘,避免多次焊接时焊盘的脱落,生产时可以避免蚀刻不均,以及过孔偏位出…

一键安装和导出当前Python项目的依赖包总结

创建python环境&#xff0c;配置一个python运行项目。在项目可以运行的环境下&#xff0c;导出该项目所依赖包到一个requirements.txt文档中。在另一个纯净环境中&#xff0c;快速批量安装项目所依赖的包&#xff0c;便于快速进行项目迁移 一、导出当前Python项目的依赖包1、方…

【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问

目录 一、虚拟头节点二、数组的随机访问三、动态数组、链表复杂度分析四、动态数组 add(E element) 复杂度分析五、动态数组的缩容 一、虚拟头节点 &#x1f33c; 为了让代码更加精简&#xff0c;统一所有节点的处理逻辑&#xff0c;可以在最前面增加一个虚拟的头节点&#xf…

2023 年最佳 C++ IDE

文章目录 前言1. Visual Studio2. Code::Blocks3. CLion4. Eclipse CDT&#xff08;C/C 开发工具&#xff09;5. CodeLite6. Apache NetBeans7. Qt Creator8. Dev C9. C Builder10. Xcode11. GNAT Programming Studio12. Kite总结 前言 要跟踪极佳 IDE&#xff08;集成开发环境…