6

让我以我已经知道 excel 2007 文件本身就是一个 .zip 文件,重命名为 .xlsx 的事实作为这个问题的开头。

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

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

有没有办法解决这种情况?同样,我想在内存中完成这一切,根本不刷新到磁盘。

4

1 回答 1

13

因为 ZIP 格式不允许在没有首先解压缩整个文件的情况下实现 ReadAt,所以您需要完全这样做。

这并不意味着您必须将其保存到磁盘,而是您可以将其解压缩到内存并从那里使用包Reader中的内容进行处理bytes

// 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)
于 2013-10-28T19:43:42.470 回答