一尘不染

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

go

让我以我已经知道excel 2007文件本身就是.zip文件(已重命名为.xlsx)的事实为开头。

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

问题在于,我们读取excel
2007文件的方法需要ReadAt方法(例如io.ReaderAt定义的方法)。不幸的是,archive
/
zip包公开了一个zip文件条目的接口,该接口仅返回io.ReadCloser

有什么办法可以解决这种情况?同样,我想在内存中完成所有操作,而无需刷新到磁盘。


阅读 164

收藏
2020-07-02

共1个答案

一尘不染

因为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)
2020-07-02