GO下载ZIP解压ZIP读取EXCEL,CSV操作(中文乱码)

在网络操作,或者日常软件开发中,经常要与office 的相关软件打交道,就比如:EXCEL的读取写入等。之前我们用PHP、Python等操作过EXCEL,今天我们使用GO来初识EXCEL的操作。

在网络操作,或者日常软件开发中,经常要与office 的相关软件打交道,就比如:EXCEL的读取写入等。之前我们用PHP、Python等操作过EXCEL,今天我们使用GO来初识EXCEL的操作。


CSV的操作,是可以直接通过OS模块操作的。EXCEL需要通过excelize 模块来操作。


我们直接上代码:

导入包 

import (
"archive/zip"
"bytes"
"flag"
"fmt"
"io"
"io/ioutil"
"os"
"strings"
"time"
"github.com/360EntSecGroup-Skylar/excelize"
"encoding/csv"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
)

//获取出ZIP包中文件...
func getexcelbyzip() {

rootpath := utils.AppPath() + "/runtime/"
zipfilepath := rootpath + "20882317753440620156_20201121.csv.zip"
zipf, err := zip.OpenReader(zipfilepath)
if err != nil {
fmt.Printf(err.Error())
}
defer zipf.Close()
for _, f := range zipf.File {

fnamebyte, _ := GbkToUtf8([]byte(f.Name))
fnamestr := string(fnamebyte)
if strings.Contains(fnamestr, "_账务明细(汇总)") == true {
continue
}

fmt.Printf("文件名: %s\n", fnamestr)

unzipFile, err := f.Open()
if err != nil {
fmt.Printf("文件名: %s 打开 err:%v\n", fnamestr, err.Error())
continue
}
defer unzipFile.Close()

fnewpath := rootpath + "ttt999.csv"
outFile, outerr := os.OpenFile(fnewpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)

if outerr != nil {
fmt.Printf("文件名: %s 创建 err:%v\n", fnewpath, outerr.Error())
continue
}
_, err = io.Copy(outFile, unzipFile)
if err != nil {
fmt.Printf("文件名: %s 复制解压错误 err:%v\n", fnamestr, err.Error())
continue
}
outFile.Close()

time.Sleep(time.Second * 1)

csvfile, err3 := os.Open(fnewpath)
if err3 != nil {
fmt.Printf("文件名: %s 打开 err:%v\n", fnewpath, err3.Error())
continue
}
defer csvfile.Close()

//CSV读取...
csvread := csv.NewReader(csvfile)
for {
reader.FieldsPerRecord = -1
record, err5 := r.Read()
if err == io.EOF {
break
}
if err5 != nil {
fmt.Printf("文件名: %s 打开 err:%v\n", fnewpath, err5.Error())
break
}
val, _ := GbkToUtf8([]byte(record[0]))
fmt.Printf("%s\n", val)
//fmt.Printf("Record has %d columns.\n", len(record))

//fmt.Printf("%s %s %s \n", record[0], record[1])
}
}
}

func readexcel(fnewpath string){

excelf, err := excelize.OpenFile(fnewpath)
if err != nil {
fmt.Printf("文件名: %s OpenReader err:%v\n", fnewpath, err.Error())
continue
}

sheet := "Sheet1"
rows := excelf.GetRows(sheet)
for rowi, row := range rows {

for coli, colCell := range row {

fmt.Printf("第: %s行 -- 第%s列\n", rowi, coli)

fmt.Print(colCell, "\n")
}
fmt.Println()
}
}

//下载zip包
func rundowloadalipayexcel() {

url1 := `http://xxxx.com`

req := httplib.Get(url1)
zipurl, err1 := req.String()
if err1 != nil {
fmt.Print("get url err " + err1.Error())
return
}

//下载保存原端文件...
req2 := httplib.Get(zipurl)
filepath := utils.AppPath() + "/runtime/tt.zip"
err2 := req2.ToFile(filepath)
if err2 != nil {
fmt.Print("write err " + err2.Error())
return
}
}

通过以上代码能操作EXCEL,但是我们可能处理中文之类的字符,此时就会出现中文乱码,我们需要转换一下,将GBK转为UTF8(因为go默认为UTF8编码的)

//GBK转UTF8
func GbkToUtf8(s []byte) ([]byte, error) {
reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewDecoder())
d, e := ioutil.ReadAll(reader)
if e != nil {
return nil, e
}
return d, nil
}