Есть ли способ просто прочитать файл excel с помощью MemoryStream в С#? В настоящее время я использую родную библиотеку Microsoft Microsoft.Office.Interop.Excel. Есть ли способ прочитать файл excel с помощью этой библиотеки?

Открытие файла Excel

using Microsoft.Office.Interop.Excel; // using this namespace

public ExcelHelper(string path)
{
   _xlApp = new Application();
   _xlWorkbook = _xlApp.Workbooks.Open(path);
}

Помощник

public static MemoryStream DownloadFile(FtpHandler handler, FtpDirectoryOrFileDetail detail)
{
    var fileByte = handler
    .Download
    .FileByPath(detail.FilePart.Filename, detail.SubFolderPath + "/", false)?.Data;
    if (fileByte is null) return stream;

    using (var fileStream = new MemoryStream(fileByte))
       return fileStream;

    return null;
}

Проблема в том, что расширение Open использует только параметр string и не имеет опции для MemoryStream. Кто-нибудь сталкивается с этой проблемой и может это исправить? Я очень открыт для любого предложения.

0
Alvin Quezon 26 Окт 2019 в 20:33
Не уверен, что вы действительно пытаетесь здесь сделать, но как загрузить файл довольно хорошо документировано. Также оператор using удаляет одноразовый объект, когда код выходит из блока использования. Итак, здесь вы возвращаете удаленный поток. Я не думаю, что это никогда не сработает
 – 
Steve
26 Окт 2019 в 20:46
Ну, ты прав, @Steve, но я могу найти обходной путь для этого. Более того, меня больше всего беспокоит то, как я могу прочитать файл excel с потоком памяти? У вас есть идеи, как это сделать?
 – 
Alvin Quezon
26 Окт 2019 в 20:49
2
"Я открыт для любых предложений" Если вам не нужна поддержка старых форматов Excel (xls), я бы посоветовал вам использовать любую стороннюю библиотеку, основанную на OpenXML. Вы получите больше гибкости, и вашим пользователям даже не потребуется устанавливать Office. Например, проверьте ClosedXML. Он позволяет открыть файл Excel, используя путь или с помощью потока.
 – 
41686d6564 stands w. Palestine
26 Окт 2019 в 21:17
1
Если вам нужно использовать библиотеку объектов Excel, лучшим вариантом будет запись потока на диск, а затем передача пути к файлу методу WorkBooks.Open().
 – 
41686d6564 stands w. Palestine
26 Окт 2019 в 21:23
2
Возможно, см. ответ от VDWWD здесь: stackoverflow. com/questions/560435/… — библиотека EPPlus может читать Excel из потока. Если вы считаете, что у этого квестона есть хорошие релевантные ответы, возможно, отметьте этот квест как его дубликат.
 – 
Caius Jard
26 Окт 2019 в 21:41

1 ответ

Below is tested solution which writing Excel workbook to memory stream and returning _objectstream which can be used to write to blob and anywhere else.



 using (var fs = new FileStream(fileName, FileMode.Append, FileAccess.Write))
            {
                IWorkbook workbook = new XSSFWorkbook();
                logic goes here......
                
                workbook.Write(obj_stream);
                using (MemoryStream tempStream = new MemoryStream())
                {
                    workbook.Write(tempStream);
                    var byteArray = tempStream.ToArray();
                    stream = new MemoryStream(byteArray);
                    obj_stream = stream;
    
                }
          } 
     return obj_stream    

       
1
Techiemanu 19 Мар 2021 в 09:31