前端时间遇到一个需求,系统实现的功能是查询对账单列表,查询后每一行有个链接,点击可以下载excel格式(xls格式,2003格式的)的对账单文件,对账单excel文件里面有对应客户对应期间的对账单余额。但是有个财务有需求,需要把600多个客户的对账单余额,进行统计。由于客户数量多,不可能一个个查询、下载excel文件,并统计,因此用golang开发了如下格式的,进行数据取数。

对账单excel格式的,数据区域大概如下图所示:

 

如下示例代码,读取的就是黄色背景的两个单元格的数据

package main

import (

"bufio"

"fmt"

"github.com/extrame/xls"

"io"

"log"

"net/http"

"net/url"

"os"

)

// DownFile 通过Http下载文件

func DownFile(excelUrl string, fileSaveName string) (string, error) {

params := url.Values{}

parseURL, err := url.Parse(excelUrl)

if err != nil {

log.Println("err")

}

params.Set("id", "=qlpVQlfx0ZX7TvcpNe**************************==")

//如果参数中有中文参数,这个方法会进行URLEncode

parseURL.RawQuery = params.Encode()

urlPathWithParams := parseURL.String()

//res, httpErr := http.Get(urlPathWithParams)

req, err := http.NewRequest(http.MethodGet, urlPathWithParams, nil)

if err != nil {

log.Println("err")

}

// 添加请求头

req.Header.Add("Content-type", "accept: application/json, text/plain, */*")

req.Header.Add("accept-encoding", "gzip, deflate, br")

req.Header.Add("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")

req.Header.Add("authorization", "bearer 5519266a-*******-*****-****-****")

// 添加cookie

/*cookie1 := &http.Cookie{

Name: "aaa",

Value: "aaa-value",

}

req.AddCookie(cookie1)*/

client := http.Client{}

//HTTP代理

/*proxy := "http://127.0.0.1:8080/"

proxyAddress, _ := url.Parse(proxy)

client := &http.Client{

Transport: &http.Transport{

Proxy: http.ProxyURL(proxyAddress),

},

}*/

// 发送请求

res, httpErr := client.Do(req)

if httpErr != nil {

return "Http Error", httpErr

}

defer res.Body.Close()

reader := bufio.NewReaderSize(res.Body, 64*1024) // 获得reader对象

file, createErr := os.Create(fileSaveName)

if createErr != nil {

return "Create Error", createErr

}

writer := bufio.NewWriter(file) // 获得writer对象

_, copyErr := io.Copy(writer, reader)

if copyErr != nil {

return "Copy Error", copyErr

}

return fileSaveName, nil

}

// 请求 URL: https://**.**.**.**/customerReconciliation?page=0&size=10&companyCode=****&custCode=ZT****&statementMonth=&statementStatus=&saleOrgCode=&beginDateScope=&productLineCodeList=&startDate=&endDate=&label=*****%E5%8F%B8

func main() {

filePath := "E:\\WorkDocument\\temp\\file111.xls"

//DownFile("https://**.**.**.**/customerReconciliation/exportException", filePath)

fmt.Println("download excel finished")

/*

//xlsx read

file, err := excelize.OpenFile(filePath)

if err != nil {

log.Fatalf("open excel file err, error:%+v\n", err)

}

sheetName := file.GetSheetName(0)

rows, err := file.GetRows(sheetName)

for index, row := range rows {

// 跳过第一行标题

if index <= 7 {

continue

}

fmt.Println("row data: " + row[1])

}

*/

xlsFile, err := xls.Open(filePath, "utf-8")

if err != nil {

log.Fatal(err)

}

// 获取xls文件的第一个sheet

sheet := xlsFile.GetSheet(0)

// 从第9行开始,遍历xls文件,然后按行调用insertRowFromXls函数

// 如下根据自己的实际需要进行具体的实现,即可

for j := 8; j < int(sheet.MaxRow)+1; j++ {

xlsRow := sheet.Row(j)

cusNameRow := sheet.Row(3)

cusName := cusNameRow.Col(2)

//rowColCount := xlsRow.LastCol()

//insertRowFromXls(xlsxSheet, xlsRow, rowColCount)

//fmt.Println("row count: " + strconv.Itoa(rowColCount))

col1Data := xlsRow.Col(1)

//fmt.Println("row col1 data: " + col1Data)

if col1Data == "合计" {

xlsRowInit := sheet.Row(j + 3)

initAmount := xlsRowInit.Col(2)

fmt.Println(cusName + ": " + initAmount + ", " + xlsRow.Col(9))

}

}

}

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。