我正在尝试从Dropbox流式传输100 MB的Excel文件并写入SQL数据库。
我创建了一个Dropbox API应用程序,并使用C#代码创建了Dropbox客户端。 与Dropbox的连接正常,但是尝试解析Excel文档流时出现错误。
从本地计算机流式传输时,相同的excel文件可以正常工作。
====
using System;
using System.Data;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Dropbox.Api;
using ExcelDataReader;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
var task = Task.Run((Func<Task>)Program.Run);
task.Wait();
}
static async Task Run()
{
using (var dbx = new DropboxClient("Access Key"))
{
var full = await dbx.Users.GetCurrentAccountAsync();
Console.WriteLine("{0} - {1}", full.Email, full.Name.DisplayName);
var list = await dbx.Files.ListFolderAsync(string.Empty);
var response = await dbx.Files.DownloadAsync("/Input Files/SampleInputExcelFile.xlsx");
// This Http stream doesn't work
Stream stream1 = await response.GetContentAsStreamAsync();
// This stream does work
Stream stream = File.Open("C:\\<PATH>\\Input Files\\SampleInputExcelFile.xlsx", FileMode.Open, FileAccess.Read);
// This line of code throws the error..
IExcelDataReader reader = ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader(stream1);
DataSet result = reader.AsDataSet();
//reader.IsFirstRowAsColumnNames = true;
DataTable dt = result.Tables[0];
string text = "'" + dt.Rows[10][0].ToString() + "'" + "," + dt.Rows[10][1].ToString() + "," + dt.Rows[10][2].ToString() + "," + dt.Rows[10][3].ToString();
// SQL steps start from here...
}
}
}
未处理的异常:System.AggregateException:发生一个或多个错误。 (不支持指定的方法。)---> System.NotSupportedException:不支持指定的方法。 在System.Net.Http.HttpContentStream.Seek(Int64偏移量,SeekOrigin的来源) 在C:\ projects \ exceldatareader \ src \ ExcelDataReader \ ExcelReaderFactory.cs
中的ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader(Stream fileStream,ExcelReaderConfiguration配置)处将感谢您的帮助! 提前致谢! P.S我是C#中的绝对菜鸟,请原谅我的代码天真。
答案 0 :(得分:0)
根据您的错误消息,您得到NotSupportedException
。因此不支持某些功能。查看错误堆栈,您可以看到CreateOpenXmlReader
在Seek
上调用HttpContentStream
,而Seek
在抛出NotSupportedException
。因此不支持的是Seek
。
流可以是“可搜索的”或“不可搜索的”。 “搜索”流是跳到该流中的特定位置。文件流是可搜索的,因为它们表示磁盘上的文件。网络流不可取,因为它们代表传输中的数据。
解决此问题的最简单方法是先在本地保存文件,然后 使用ExcelReaderFactory
打开文件。
答案 1 :(得分:0)
我能够通过首先将Http流复制到内存流中来使其工作。 解决方案如下:
Stream StreamFromDropbox = await response.GetContentAsStreamAsync();
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
MemoryStream StreamFromDropboxCopyAsync = new MemoryStream();
await StreamFromDropbox.CopyToAsync(StreamFromDropboxCopyAsync);
StreamFromDropboxCopyAsync.Seek(offset: 0, loc: SeekOrigin.Begin);
IExcelDataReader reader = ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader(StreamFromDropboxCopyAsync, new ExcelReaderConfiguration() { FallbackEncoding = System.Text.Encoding.GetEncoding(1252) });
DataSet result = reader.AsDataSet();