让我先说明这个问题,我已经知道excel 2007文件本身就是一个.zip文件,重命名为.xlsx。
好的,既然你知道这就是交易。我正在尝试从内存中的.zip存档中提取Excel 2007文件。我不能(而是真的不想)将整个存档提取到磁盘,然后从那里使用.xlsx文件。
问题是我们读取excel 2007文件的方法需要ReadAt方法(例如io.ReaderAt定义的方法)。遗憾的是,存档/ zip包公开了zip file entries的界面,该界面仅返回io.ReadCloser。
有没有办法解决这种情况?同样,我想在内存中完成所有操作,而根本不用刷新到磁盘。
答案 0 :(得分: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)