Как для потоковой передачи файла Excel из Dropbox с помощью C #? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь передать файл Excel объемом 100 МБ из Dropbox и записать в базу данных SQL.

Я создал приложение Dropbox API и создал клиент Dropbox в коде C #. Связь с 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) в ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader (поток fileStream, конфигурация ExcelReaderConfiguration) в C: \ projects \ exceldatareader \ src \ ExcelDataReader \ ExcelReaderFactory.cs

Буду признателен за любую помощь! Заранее спасибо! P.S. Я абсолютный нуб в C #, поэтому, пожалуйста, простите за наивность в моем коде.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Мне удалось заставить его работать, сначала скопировав поток 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();
0 голосов
/ 14 июня 2019

Согласно вашему сообщению об ошибке вы получаете NotSupportedException. Так что что-то не поддерживается. Глядя на ваш стек ошибок, вы видите, что CreateOpenXmlReader вызывает Seek на HttpContentStream, а Seek выбрасывает NotSupportedException. Таким образом, Seek не поддерживается.

Потоки могут быть «доступными» или «не доступными». «Искать» поток - значит переходить к определенной позиции в этом потоке. Файловые потоки доступны для поиска, поскольку они представляют файл на диске; сетевые потоки недоступны для поиска, поскольку они представляют данные в пути.

Самый простой способ решить эту проблему - сначала сохранить файл локально и , а затем открыть его, используя ExcelReaderFactory.

...