让我以我已经知道excel 2007文件本身就是.zip文件(已重命名为.xlsx)的事实为开头。
好的,现在您知道这是交易。我正在尝试从内存中的.zip存档中提取Excel 2007文件。我不能(而是,我 真的 不想)将整个存档提取到磁盘,然后从那里使用.xlsx文件。
问题在于,我们读取excel 2007文件的方法需要ReadAt方法(例如io.ReaderAt定义的方法)。不幸的是,archive / zip包公开了一个zip文件条目的接口,该接口仅返回io.ReadCloser。
有什么办法可以解决这种情况?同样,我想在内存中完成所有操作,而无需刷新到磁盘。
因为ZIP格式不允许在不首先解压缩整个文件的情况下实现ReadAt,所以您需要精确地做到这一点。
这并不意味着您必须将其保存到磁盘上,而是可以将其解压缩到内存中并Reader在bytes软件包中使用它来进行处理:
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)