需要来自zip存档条目的io.ReaderAt(该条目是嵌套的.xlsx文件)

mdw*_*ott 5 zip excel-2007 go

让我先说明这个问题,我已经知道excel 2007文件本身就是一个.zip文件,重命名为.xlsx.

好的,既然你知道这就是交易.我正在尝试从内存中的.zip存档中提取Excel 2007文件.我不能(而且,我真的不想)将整个存档提取到磁盘,然后从那里使用.xlsx文件.

问题是我们读取excel 2007文件的方法需要一个ReadAt方法(例如io.ReaderAt定义的方法).不幸的是,archive/zip包暴露了一个只提供io.ReadCloser的zip文件条目的接口.

有没有办法解决这种情况?再一次,我想在内存中完成所有操作,而不需要刷新到磁盘.

ANi*_*sus 13

因为ZIP格式不允许在不首先解压缩整个文件的情况下实现ReadAt,所以您需要做到这一点.

这并不意味着你必须将它保存到磁盘,而是你可以将它解压缩到内存并Readerbytes包中使用它来处理它:

// ReadAll reads from readCloser until EOF and returns the data as a []byte
b, err := ioutil.ReadAll(readCloser) // The readCloser is the one from the zip-package
if err != nil {
    panic(err)
}

// bytes.Reader implements io.Reader, io.ReaderAt, etc. All you need!
readerAt := bytes.NewReader(b)
Run Code Online (Sandbox Code Playgroud)