Go语言 解析Excel csv/xls/xlsx格式

news/2024/11/29 13:29:28/

Go语言 解析Excel csv/xls/xlsx格式

  • 解析不同格式的excel,并统一返回值
    • 解析csv
    • 解析xls
    • 解析xlsx
    • 代码块

解析不同格式的excel,并统一返回值

解析csv

相关包:“encoding/csv”

解析xls

相关包:“github.com/extrame/xls”

解析xlsx

相关包:“github.com/tealeg/xlsx”

代码块

package utilsimport ("encoding/csv""fmt""os""strings""github.com/extrame/xls""github.com/forging2012/gogb2312""github.com/tealeg/xlsx"
)func ReadCsv(file_path string) (res [][]string) {file, err := os.Open(file_path)if err != nil {Logger.Errorf("open_err:", err)return}defer file.Close()// 初始化csv-readerreader := csv.NewReader(file)// 设置返回记录中每行数据期望的字段数,-1 表示返回所有字段reader.FieldsPerRecord = -1// 允许懒引号(忘记遇到哪个问题才加的这行)reader.LazyQuotes = true// 返回csv中的所有内容record, read_err := reader.ReadAll()if read_err != nil {Logger.Errorf("read_err:", read_err)return}for i, value := range record {record_utf := valueif !ValidUTF8([]byte(record_utf)) {record_utf, _, _, _ = gogb2312.ConvertGB2312String(record_utf)}record_utf = strings.TrimSpace(record_utf)record[i] = record_utf}return record
}func ReadXls(file_path string) (res [][]string) {if xlFile, err := xls.Open(file_path, "utf-8"); err == nil {fmt.Println(xlFile.Author)//第一个sheetsheet := xlFile.GetSheet(0)if sheet.MaxRow != 0 {temp := make([][]string, sheet.MaxRow)for i := 0; i < int(sheet.MaxRow); i++ {row := sheet.Row(i)data := make([]string, 0)if row.LastCol() > 0 {for j := 0; j < row.LastCol(); j++ {col := row.Col(j)data = append(data, col)}temp[i] = data}}res = append(res, temp...)}} else {Logger.Errorf("open_err:", err)}return res
}func ReadXlsx(file_path string) (res [][]string) {if xlFile, err := xlsx.OpenFile(file_path); err == nil {for index, sheet := range xlFile.Sheets {//第一个sheetif index == 0 {temp := make([][]string, len(sheet.Rows))for k, row := range sheet.Rows {var data []stringfor _, cell := range row.Cells {data = append(data, cell.Value)}temp[k] = data}res = append(res, temp...)}}} else {Logger.Errorf("open_err:", err)}return res
}// 校验中文编码
func ValidUTF8(buf []byte) bool {nBytes := 0for i := 0; i < len(buf); i++ {if nBytes == 0 {if (buf[i] & 0x80) != 0 { //与操作之后不为0,说明首位为1for (buf[i] & 0x80) != 0 {buf[i] <<= 1 //左移一位nBytes++     //记录字符共占几个字节}if nBytes < 2 || nBytes > 6 { //因为UTF8编码单字符最多不超过6个字节return false}nBytes-- //减掉首字节的一个计数}} else { //处理多字节字符if buf[i]&0xc0 != 0x80 { //判断多字节后面的字节是否是10开头return false}nBytes--}}return nBytes == 0
}

http://www.ppmy.cn/news/812451.html

相关文章

用ExcelVBA下载可转债历史数据

先看结果&#xff0c;视频演示送上&#xff1a;https://www.bilibili.com/video/BV1Q3411d7gt/ 制作思路的话&#xff0c;基本还是从“找数据源--设计表格结构--网抓实现---数据处理”这个逻辑来做。 数据源方面&#xff0c;东方财富这里还不错&#xff0c;http://quote.east…

EXCEL01:excel与数据格式

目录 1.数据缘何而来 1.1 了解excel 1.2 excel的存储格式 2.excel数据格式 2.1 单元格数据格式 2.1.1数字 2.1.2 日期 2.2 单元格格式 2.2.1 数值格式 2.2.2 文本格式 2.2.3 日期格式 2.3 转换单元格数据 3.练习 1.数据缘何而来 excel文件格式&#xff1a;xls或xlsx…

Kafka生产者概述

【Kafka】Kafka生产者概述 文章目录 【Kafka】Kafka生产者概述1. 生产者1.1 生产者消息发送流程1.1.1 发送原理1.1.2 生产者重要参数列表 1.2 异步发送 API1.2.1 普通异步发送1.2.2 带回调函数的异步发送 1.3 同步发送 Api 2. 生产者分区2.1 分区的好处2.2 分区策略2.3 自定义分…

Python微实践 - 布莱切利庄园的秘密

二战时期&#xff0c;英国数学家、计算机科学之父Alan Turing在布莱切利庄园成功破译了德军密码&#xff0c;为赢得世界反法西斯战争的胜利做出了重大贡献。为了表达对前辈先贤的敬意&#xff0c;本微实践取名为“布莱切利庄园的秘密”。 本文引用自作者编写的下述图书; 本文允…

JavaSE学习笔记 基于Socket的TCP网络编程

网络编程 1.网络编程的基本知识回顾1.1 C/S与B/S结构1.2 网络编程的三要素解析1.2.1 IP地址1.2.2 端口号1.2.3 网络协议 2.Socket通信简述3.基于TCP协议的网络编程3.1 基于TCP协议的网络通信程序结构3.2 案例&#xff1a;一个客户端与服务器单次通信3.3 案例&#xff1a;多个客…

web渗透a

Nmap namp 192.168.1.1 namp -A -T4 -V 192.168.1.1 -A &#xff1a;开启操作系统识别和版本识别功能 -T &#xff1a;0-6档&#xff0c;设置扫描的快慢 0最慢&#xff0c;6最快&#xff1b; //级别越高你&#xff0c;对网络宽带要求越高&#xff0c;另外扫描太快&#xf…

PowerShell攻击指南

文章目录 一&#xff1a;PowerShell简介1.1&#xff1a;基本概念1.2&#xff1a;执行策略与绕过1.3&#xff1a;常用命令 二&#xff1a;PowerSploit2.1&#xff1a;PowerSploit安装2.2&#xff1a;PowerSploit攻击实战2.2.1&#xff1a;直接shellcode反弹meterpreter shell2.2…

嵌入式Linux C笔试题积累

http://blog.csdn.NET/h_armony/article/details/6764811 1. 嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分&#xff0c;这导致了很 多编译开发商提供一种扩展—让标准C支持中断。具代表事实是&#xff0c;产生了一个新的关键字 __interrupt。下面的代码…