我有阅读Excel文件的主要功能。我使用excelize。这个main函数是使用goroutine调用函数A并传递所需的通道。这个函数A使用goroutine两次调用函数B,但使用不同的参数读取不同的表。我想让第一个goroutine先完成,然后去第二个goroutine。但我得到了错误not a valid zip file
我的主要功能
main.go
func main(){
f, _ := os.Open("./report.xlsx")
defer f.Close()
filename := f.Name()
data := make(chan string, 2)
errors := make(chan error)
go BuildData(f, data, errors)
}
字符串
build_data.go
func BuildData(f io.Reader, datac chan string, errorc chan error) {
sheet1 := make(chan []string, 2)
sheet1err := make(chan error)
var sheet1ct [][]string
sheet1Name := "Sheet1"
go ReadExcel(f, sheet1, sheet1err, sheet1Name)
for {
select {
case data, cl := <-sheet1:
if !cl {
done = true
break
}
sheet1ct = append(sheet1ct, data)
case erru = <-sheet1err:
if erru != nil {
errorc <- erru
done = true
}
}
if done {
break
}
}
// wait for sheet 1 finish reading
for !done {
continue
}
sheet2 := make(chan []string, 2)
sheet2err := make(chan error)
sheet2Name := "Sheet2"
go ReadExcel(f, sheet2, sheet2err, sheet2Name)
for {
select {
case data, cl := <-sheet2:
if !cl {
done = true
break
}
validRecord := makeValidRecord(data, sheet1ct)
datac <- validRecord
case erru = <-sheet2err:
if erru != nil {
errorc <- erru
done = true
}
}
if done {
break
}
}
}
func makeValidRecord(data []string, sheet1 [][]string) string {
// make valid record, return a string
}
型
read_excel.go
func ReadExcel(file io.Reader, rowChan chan []string, errChan chan error, sheetName string) {
f, err := excelize.OpenReader(file)
if err != nil {
errChan <- err
return
}
rows, _ := f.GetRows(sheetName)
for _, row := range rows {
rowChan <- row
}
}
型
从我生成的日志中,它实际上可以读取第1页并将所有数据放入var sheet1ct [][]string
中。但当它来到表2,我得到了错误not a valid zip file
,即使它是相同的excel文件。
我需要你的帮助。谢谢你,谢谢
1条答案
按热度按时间omhiaaxx1#
一个简单的解决方案是:
字符串
也就是说,不要传递文件引用,读取所有的字节,并在需要时从它们中生成
bytes.NewReader
。