在2个goroutines中阅读excel文件时不是有效的zip文件

piv4azn7  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(178)

我有阅读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文件。
我需要你的帮助。谢谢你,谢谢

omhiaaxx

omhiaaxx1#

一个简单的解决方案是:

reportBytes, _ := ioutil.ReadFile("./report.xlsx")
reader := bytes.NewReader(reportBytes) 
excelize.OpenReader(reader)

字符串
也就是说,不要传递文件引用,读取所有的字节,并在需要时从它们中生成bytes.NewReader

相关问题