Я думаю, проблема в том, что вы используете GetBuffer
на первом MemoryStream
для создания второго. Из документации :
Замечания
Обратите внимание, что буфер содержит выделенные байты, которые могут быть неиспользованными. Например, если строка «test» записана в объект MemoryStream
, длина буфера, возвращаемого из GetBuffer
, равна 256, а не 4, при этом 252 байта не используются. , Чтобы получить только данные в буфере, используйте метод ToArray
; однако ToArray
создает копию данных в памяти.
Вероятно, что вы получаете нежелательные дополнительные нулевые байты в конце потока из буфера. Excel не знает, что делать с дополнительными байтами, поэтому объявляет, что рабочая книга повреждена. Поскольку XLSX является сжатым форматом, вполне возможно, что размер файла будет таким же с дополнительными нулями, что и без них, поэтому вы не сможете определить это, просто взглянув на это.
Короче говоря, вы Вместо этого следует использовать ToArray
, чтобы предотвратить повреждение.
Чтобы исправить, измените эту строку:
var buffer = ms.GetBuffer();
На это:
var buffer = ms.ToArray();