【问题标题】:Read excel file with MemoryStream使用 MemoryStream 读取 excel 文件
【发布时间】:2021-03-19 14:31:37
【问题描述】:

有没有办法在 C# 中使用 MemoryStream 简单地读取为 excel 文件?我目前正在使用本机微软库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 的选项。有没有人遇到这个问题并且能够解决这个问题?我非常愿意接受任何建议。

【问题讨论】:

  • 不确定您在这里真正想要做什么,但是如何下载文件已经有很好的记录了。当代码退出 using 块时,using 语句也会处理一次性对象。所以在这里你要返回一个已处理的流。我认为它永远不会起作用
  • 好吧,@Steve 你有道理,但我可以为此做一个解决方法。此外,我主要关心的是如何使用内存流读取 excel 文件?您对如何做到这一点有任何想法吗?
  • “我非常愿意接受任何建议” 如果您不需要支持较旧的 Excel 格式 (xls),我建议您使用任何 3rd-party 库这是基于 OpenXML 的。您将获得更大的灵活性,您的用户甚至不需要安装 Office。例如,检查ClosedXML。它允许您使用路径或using a stream 打开 Excel 文件。
  • 如果必须使用 Excel 对象库,最好的选择是将流实际写入磁盘,然后将文件路径传递给 WorkBooks.Open() 方法。
  • 也许在这里看到 VDWWD 的答案:stackoverflow.com/questions/560435/… - EPPlus 库可以从流中读取 excel。如果您认为该问题有一些很好的相关答案,可以将此问题标记为它的副本..

标签: c# excel


【解决方案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    

       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多