B
B
bullock2017-10-24 16:07:24
excel
bullock, 2017-10-24 16:07:24

How to make changes to an Open XML file that is in memory and save the changes without using disk?

The task is to load the reference xlsx file into memory, make changes to it and save the changes in memory (not on disk).

FileInfo f = new FileInfo("File.xlsx");
// Создаем массив байт для хранения фала в памяти
// +50000 на случай если изменения будут больше чем исходный файл, это можно так делать или я гоню?
byte[] newFile = new byte[f.Length+50000];
// Переносим файл с диска на память
File.WriteAllBytes("File.xlsx", newFile);
// Создаем поток из байтового массива что бы можно было использовать его в SpreadsheetDocument.Open
streamNewFile = new MemoryStream(newFile, true);
// Пытаемся открыть xlsx находящийся в памяти
SpreadsheetDocument document = SpreadsheetDocument.Open(streamNewFile, true); // ошибка происходит тут
// что то делаем с таблицей
// закрываем таблицу
 document.Close();
// возвращаем массив байтов с сохраненной таблицей
return streamNewFile.ToArray();

Maybe I'm using the wrong approach? Advise what to do?
59ef39efaca3d644928218.png

Answer the question

In order to leave comments, you need to log in

2 answer(s)
R
Roman, 2017-10-25
@yarosroman

Most likely, due to the fact that you allocate more memory for the buffer, the file cannot be unpacked (after all, these are zip archives), the exception clearly indicates this, allocate for the buffer exactly the size of the file. when saving, then create a new buffer, or most likely a new buffer will be returned to you.

B
bullock, 2017-10-26
@bullock

Solved the problem:

var ms = new MemoryStream();

var originalStream = File.Open(...));

originalStream.CopyTo(ms);

var document =  SpreadsheetDocument.Open(ms, true);

document.Close();

var blob = ms.ToArray();

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question