go 查询采购单设备事项[小示例]V2-两种模式{严格,包含模式}

news2024/9/28 23:28:20

 第一版:

https://mp.csdn.net/mp_blog/creation/editor/131979385

 第二版:

优化内容:

检索数据的两种方式:

1.严格模式--找寻名称是一模一样的内容,在上一个版本实现了

2.包含模式,也就是我输入检索关键字“语音配线架”【原来名称为‘50对语音配线架’】,这样可以快速找到同类别的内容

 

 代码:

package main

import (
	"fmt"
	"github.com/xuri/excelize/v2"
	"strings"
)

//eve sheet name的内容

// InSlice 判断字符串是否在 slice 中。
func InSlice(items []string, item string) bool {
	for _, eachItem := range items {
		if eachItem == item {
			return true
		}
	}
	return false
}

// InSlice 判断字符串是否在 slice 中。
func includeSlice(items []string, item string) bool {
	for _, eachItem := range items {
		//字符串包含函数,判断表格中名字是否包含我的列表中的内容
		//这样我的找寻字符串中写入关键字就可以了
		if strings.Contains(item, eachItem) {
			return true
		}
	}
	return false
}

// 我需要检索的信息
// var devicelists []string = []string{"50对语音配线架", "24口网络配线架", "24口网络理线架", "4口终端盒", "光纤收发器", "96芯光纤配线架"}
var devicelists = []string{"50对语音配线架", "24口网络配线架", "24口网络理线架", "4口终端盒", "光纤收发器", "96芯光纤配线架"}

var keydevicelists = []string{"语音配线架", "网络配线架", "网络理线架", "终端盒", "光纤收发器", "光纤配线架"}

func sheet(sheetname string, f *excelize.File, format int) {
	//fmt.Println("+++++++++++++++++++++++++")
	// 获取 Sheet1 上所有单元格
	rows, err := f.GetRows(sheetname)
	if err != nil {
		fmt.Println(err)
		return
	}
	//fmt.Println(rows)

	for _, row := range rows {
		//fmt.Println(row, "========", index)
		//判断每行的里的字段长度,如果是小于6 那就是不获取设备名字和设备价格
		if len(row) < 6 {
			continue
		}
		//获取excel中,设备的名称
		kindname := row[1]
		//获取excel中,设备的数量
		kcount := row[4]

		//如果表格中 kcount没有内容,那就是给复制一个“0”字符串
		if kcount == "" {
			kcount = "0"
		}

		//fmt.Printf("固定列名字是:%s,类别是%T", kindname, kindname)
		//fmt.Println()
		//调用函数  用来判断 设备名称是否是我需要寻找的内容
		//如果是我需要寻找的内容就是返回对应表的名称以及 设备名称和 对应数量
		//if InSlice(devicelists, kindname) {
		//	//fmt.Println(sheetname, kindname, "=====++++++=======》", kcount)
		//	fmt.Printf("获取信息:sheet表:%s;设备名称:%s;设备数量:%s\n;", sheetname, kindname, kcount)
		//	//fmt.Println()
		//}

		//判断模式,可以进行采用 不同的检索方式
		//1.包含模式,我检索的都是“关键字”  2.严格模式 ,内容必须得一模一样的查找
		if format == 1 {
			//fmt.Println("你匹配的模式为包含模式")

			//包含的调用
			if includeSlice(keydevicelists, kindname) {
				//fmt.Println(sheetname, kindname, "=====++++++=======》", kcount)
				fmt.Printf("获取信息:sheet表:%s;设备名称:%s;设备数量:%s\n;", sheetname, kindname, kcount)
				//fmt.Println()
			}

		} else {
			//fmt.Println("你匹配的模式为严格模式")
			if InSlice(devicelists, kindname) {
				//fmt.Println(sheetname, kindname, "=====++++++=======》", kcount)
				fmt.Printf("获取信息:sheet表:%s;设备名称:%s;设备数量:%s\n;", sheetname, kindname, kcount)
				//fmt.Println()
			}

		}

	}
	//fmt.Println("+++++++++++++++++++++++++")
	//指定单元格的值,查询
	//value, _ := f.GetCellValue(sheetname, "B7")
	//fmt.Println(value)
	//for _, row := range rows {
	//	for _, colCell := range row {
	//		fmt.Print(colCell, "\t")
	//	}
	//	fmt.Println()
	//}

}

func sheetv2(sheetname string, f *excelize.File) {
	//fmt.Println("+++++++++++++++++++++++++")
	// 获取 Sheet1 上所有单元格
	rows, err := f.GetRows(sheetname)
	if err != nil {
		fmt.Println(err)
		return
	}
	//fmt.Println(rows)

	for _, row := range rows {
		//fmt.Println(row, "========", index)
		//判断每行的里的字段长度,如果是小于6 那就是不获取设备名字和设备价格
		if len(row) < 6 {
			continue
		}
		//获取excel中,设备的名称
		kindname := row[1]
		//获取excel中,设备的数量
		kcount := row[4]

		//如果表格中 kcount没有内容,那就是给复制一个“0”字符串
		if kcount == "" {
			kcount = "0"
		}

		//fmt.Printf("固定列名字是:%s,类别是%T", kindname, kindname)
		//fmt.Println()
		//调用函数  用来判断 设备名称是否是我需要寻找的内容
		//如果是我需要寻找的内容就是返回对应表的名称以及 设备名称和 对应数量
		//if InSlice(devicelists, kindname) {
		//	//fmt.Println(sheetname, kindname, "=====++++++=======》", kcount)
		//	fmt.Printf("获取信息:sheet表:%s;设备名称:%s;设备数量:%s\n;", sheetname, kindname, kcount)
		//	//fmt.Println()
		//}

		//包含的调用
		if includeSlice(devicelists, kindname) {
			//fmt.Println(sheetname, kindname, "=====++++++=======》", kcount)
			fmt.Printf("获取信息:sheet表:%s;设备名称:%s;设备数量:%s\n;", sheetname, kindname, kcount)
			//fmt.Println()
		}
	}
	//fmt.Println("+++++++++++++++++++++++++")
	//指定单元格的值,查询
	//value, _ := f.GetCellValue(sheetname, "B7")
	//fmt.Println(value)
	//for _, row := range rows {
	//	for _, colCell := range row {
	//		fmt.Print(colCell, "\t")
	//	}
	//	fmt.Println()
	//}

}
func sheet_bak(sheetname string, f *excelize.File) {
	// 获取 Sheet1 上所有单元格
	rows, err := f.GetRows(sheetname)
	if err != nil {
		fmt.Println(err)
		return
	}
	for _, row := range rows {
		for _, colCell := range row {
			fmt.Print(colCell, "\t")
		}
		fmt.Println()
	}

}

// 读取Excel表格
func main() {
	//选择的匹配模式:1-包含模式,2-严格模式
	var mode int
	f, err := excelize.OpenFile("by.xlsx")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer func() {
		if err := f.Close(); err != nil {
			fmt.Println(err)
		}
	}()

	sheetnames := f.GetSheetList()
	//fmt.Printf("本excel表格的sheetnames:%s", sheetnames)
	//fmt.Println("===============")
	for {
		fmt.Println("请输入你需要的匹配模式:1-包含模式,2-严格模式,输入 1 或者 2 :")
		fmt.Scan(&mode)
		//退出内容
		if mode == 88 {
			break
		}

		//遍历所有的表格sheet,调用处理函数
		for _, sheetname := range sheetnames {
			//fmt.Println(sheetname)
			sheet(sheetname, f, mode)
		}

	}

}

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

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

相关文章

ps 给衣服换色

可以通过色相饱和度来改变颜色 但如果要加强对比 可以通过色阶或曲线来调整 针对整体 调整图层-色相/饱和度 着色 给整个画面上色 选区-遮罩-取出来 然后调整图层-色相/饱和度也可以 或者以有图层-色相饱和度后 选区 按ctrli使其遮罩 同时按alt鼠标左键单机 ctrli反相…

【SSM—SpringMVC】 问题集锦(持续更新)

目录 1.Tomcat启动&#xff0c;部署工件失败 1.Tomcat启动&#xff0c;部署工件失败 解决&#xff1a;使用SpringMVC&#xff0c;添加Web支持&#xff0c;要将项目结构进行添加WEB-INF下添加lib目录&#xff0c;将依赖添进去

解锁 Kotlin 中密封类(Seal Class)的能力:设计模式与代码组织的优化

解锁 Kotlin 中密封类(Seal Class)的能力&#xff1a;设计模式与代码组织的优化 多年来&#xff0c;我参与了多个项目&#xff0c;深知编写清晰、易维护代码的价值。最近在一个涉及大量数据类型处理的项目中&#xff0c;我发现使用密封类极大地提高了数据的组织和管理效率。此…

推动中小企业数字化转型,开利网络签约

随着数字经济的发展&#xff0c;大数据、区块链、物联网、AI等新兴数字化技术已成为一种趋势&#xff0c;对于产业园区而言&#xff0c;结合数字化技术形成的“数字园区”理念正逐渐出现在公众视野中。什么是“数字园区”&#xff1f;简单来说&#xff0c;通过对产业园区进行数…

<C语言> 动态内存管理

1.动态内存函数 为什么存在动态内存分配&#xff1f; int main(){int num 10; //向栈空间申请4个字节int arr[10]; //向栈空间申请了40个字节return 0; }上述的开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的。数组在申明的时候&#xff0c;必须指定数组的…

使用RunnerGo来简化测试流程

在软件开发过程中&#xff0c;测试是一个重要的环节&#xff0c;需要投入大量时间和精力来确保应用程序或网站的质量和稳定性。但是&#xff0c;随着应用程序变得更加复杂和庞大&#xff0c;传统的测试工具在面对比较繁琐的项目时非常费时费力。这时&#xff0c;一些自动化测试…

MAC电脑设置charles,连接手机的步骤说明(个人实际操作)

目录 一、charles web端设置 1. 安装charles之后&#xff0c;先安装证书 2. 设置 Proxy-Proxy Settings 3. 设置 SSL Proxying 二、手机的设置 1. 安卓 2. ios 资料获取方法 一、charles web端设置 1. 安装charles之后&#xff0c;先安装证书 Help-SSL Proxying-Inst…

高压放大器模块的作用是什么呢

高压放大器模块是一种集成了高压放大器芯片、控制电路、保护电路等多种元件和功能的模块化设备。它可以将输入信号进行放大处理&#xff0c;并输出到负载上&#xff0c;具有高性能、高可靠性、高稳定性等优点。下面安泰电子将详细介绍高压放大器模块的作用&#xff1a; 信号放大…

【LLM】浅析chatglm的sft+p-tuning v2

note GLM将针对不同类型下游任务的预训练目标统一为了自回归填空&#xff0c;结合了混合的注意力机制和新的二维位置编码。本文浅析sft&#xff0c;并基于GLM在广告描述数据集上进行sftp-tuning代码的数据流讲解 文章目录 note零、ChatGLM2模型一、Supervised fine-tuning1. 数…

位图和布隆过滤器+哈希切分思想

文章目录 一.位图(bitset)底层实现: 二.布隆过滤器(bloomFilter)底层实现: 三.哈希切分思想 一.位图(bitset) 位图是一种以一个比特位为数据记录单元的哈希表 ,以无符号整数为key值,采用直接定址法(不存在哈希冲突的问题),其哈希映射函数为 f ( k e y ) k e y ( k e y 的存在…

有关合泰BA45F5260中断的思考

最近看前辈写的代码&#xff0c;发现这样一段代码&#xff1a; #ifdef SUPPORT_RF_NET_FUNCTION if(UART_INT_is_L()) { TmrInsertTimer(eTmrHdlUartRxDelay,TMR_PERIOD(2000),NULL); break; } #endif 其中UART_INT_is_L&am…

【lesson6】Linux下:第一个小程序,进度条代码

文章目录 准备工作sleep问题fflush回车与换行的区别 进度条代码 准备工作 sleep问题 首先我们来看一段代码&#xff1a; 这时候有个 问题这个代码是输出“hello world”还是先sleep三秒&#xff1f; 再来一段代码 这个代码是先sleep三秒还是先输出“hello world”&#xff…

「乐天世界」NFT 作品集

进入「乐天世界」NFT 作品集的迷人世界&#xff0c;这里仿佛就是乐天世界探险主题公园里充满活力的礼品店。 准备好随着想象力的飞跃而沉浸其中吧&#xff0c;因为主题公园里的普通物品已经变得非凡。沉浸在游乐园美食的魔力中&#xff0c;如香脆的玉米热狗、令人垂涎的巧克力蛋…

立创EDA学习

学习树莓派3B的板子发现有个扩展板比较好&#xff0c;自己最好画一个&#xff0c;反正免费。 学习视频&#xff1a;立创EDA&#xff08;专业版&#xff09;电路设计与制作快速入门。 下载专业版&#xff0c;并激活。【分专业版和标准版&#xff0c;专业版也是免费的】 手机…

基于物联网技术的能耗在线监测平台的架构设计与应用

安科瑞 华楠 摘要&#xff1a;围绕工业生产等领域节能降耗实际需求&#xff0c;提出基于物联网的能耗在线监测平台总体方案&#xff0c;面向政府、行业、企业提供能耗管理信息化管理与服务;研究设计能耗监测终端&#xff0c;支持多种工业总线及工业协议&#xff0c;实现电表、…

jenkins执行jmeter时,报Begin size 1 is not equal to fixed size 5

jenkins执行jmeter脚本的时候一直提示如下错误&#xff1a; Tidying up ... Fri Jul 28 17:03:53 CST 2023 (1690535033178) Error generating the report: org.apache.jmeter.report.dashboard.GenerationException: Error while processing samples: Consumer failed wi…

this关键字和同步异步宏认为微任务理解

目录 js面试常见问题&#xff1a;1.this指向 2.闭包定义和作用 3.原型链 4.异步协程 this关键字 this主要有以下几个使用场合。 1&#xff09;全局环境 &#xff08;2&#xff09;构造函数 &#xff08;3&#xff09;对象的方法 避免多层this 避免数组处理方法中的 this 避免回…

RabbitMQ 教程 | RabbitMQ 入门

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

VS CODE 20230728

VSCode添加至右键菜单 2.Visual Studio Code(VS Code)中文显示乱码的解决方法 1.按 快捷键 ctrl, 在搜索栏中输入“files:auto Guess Encoding” 勾选 还是乱码