ExcelReaderFactory,从SftpFileStream读取

时间:2019-01-11 11:41:15

标签: c# .net sftp ssh.net exceldatareader

使用where order_date = (Select CASE WHEN (1 + TRUNC (SYSDATE) - TRUNC (SYSDATE, 'IW')) < 5 THEN TRUNC (SYSDATE) + 1 ELSE TRUNC ((SYSDATE + 4), 'IW') END from dual); 读取.xlsx文件时出现错误,并且流阅读器是ExcelReaderFactory.CreateOpenXmlReader(streamReader)SftpFileStream)。

我收到的错误消息是

  

Renci.SshNet.Common.SshException:常规故障

我无法遍历第一行代码。

SftpClient.OpenRead(filePath)

但是当我使用using (var reader = ExcelReaderFactory.CreateOpenXmlReader(streamReader)) { //Get reader as DataSet var result = reader.AsDataSet(new ExcelDataSetConfiguration() { ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration() { UseHeaderRow = true } }); ....... } 使用代码时,它就可以正常工作。

堆栈:

System.IO.File.Open

1 个答案:

答案 0 :(得分:0)

SftpFileStream.Seek代码中显然存在一个错误。当用SeekOrigin.End调用时,它从文件末尾的位置减去offset,而不是添加它。

如果可以修改SSH.NET代码,请在SftpFileStream.Seek中更改此语句的两个实例:

newPosn = attributes.Size - offset;

newPosn = attributes.Size + offset;

我已经向SSH.NET存储库提交了pull request with this fix


如果无法更改SSH.NET代码,则必须解决该问题。

  1. SftpFileStream的内容复制到临时MemoryStream并将其与ExcelReaderFactory一起使用。

    using (var memoryStream = new MemoryStream())
    {
        sftpFileStream.CopyTo(memoryStream);
        memoryStream.Position = 0;
        using (var reader = ExcelReaderFactory.CreateOpenXmlReader(memoryStream))
        {
            // ...
        }
    }
    
  2. 或者,如果您不想浪费内存来保存文件的另一个副本,则可以在Stream周围实现自己的SftpFileStream包装器,将SeekOrigin.End转换为{{1 }}和适当的SeekOrigin.Begin


请注意,offsetZipArchive内部使用)将ExcelReaderFactoryStream.Seek一起使用,因为ZIP中央目录位于ZIP文件的末尾。 -XLSX文件基本上是具有特定结构的ZIP文件。