2014-12-05 4 views
3

У меня есть WebApi, который получит файл excel, загруженный пользователем как multipart/form-data. Мне нужно прочитать содержимое этого файла, чтобы обновить базу данных. Я думал об использовании EPPlus, но я не могу получить доступ к файлу. Вот кодC# Web Api - Загрузка и чтение данных из файла excel без сохранения файла

public class MyController : APIController 
{ 
    [Route("import")] 
    [HttpPost] 
    public async Task<HttpResponseMessage> importFile() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "ERROR"); 

     Stream stream = await Request.Content.ReadAsStreamAsync(); 

     var excel = new ExcelPackage(stream); 
     var workbook = excel.Workbook; 

     var sheet = excel.Workbook.Worksheets.First(); 

     ... 

} 

Ошибка на var sheet = excel.Workbook.Worksheets.First(), поскольку Рабочая тетрадь не имеет лист (но физический файл имеет 2).

Что я делаю неправильно? Это поток?

Я пытаюсь иметь отдельную библиотеку для каждого типа файла Excel (.xls или .xlsx), но я не могу сделать эту работу с файлами .xls. Я использую ExcelDataReader и код теперь так:

public async Task<HttpResponseMessage> importFile() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "NOT MULTIPART"); 

     Stream stream = await Request.Content.ReadAsStreamAsync(); 

     //open xlsx file    
     var excel = new ExcelPackage(stream); 
     var workbook = excel.Workbook; 
     try 
     { 
      var sheet = excel.Workbook.Worksheets.First(); 

      //working fine with EPPlus for .xlsx files 
      return Request.CreateResponse(HttpStatusCode.OK, errors);     

     }catch(Exception)//open xls file 
     { 
      //if its a .xls file it will throw an Exception    
     } 

     //using ExcelDataReader to open .xls file 
     IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream); 
     DataSet result = excelReader.AsDataSet(); 

     // the DataSet is null, stream is setted as ReadOnlyStream and stream.length is throwing an ObjectDisposedException 
     return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "erro");    
    } 
+0

ли загруженный файл первенствует 2007/2010? – Kami

+0

вы можете объяснить формат файла, это '.XLS, .CSV и т. Д.' Вы считали 'Microsoft.Interop.Excel' Lib – MethodMan

+0

Это 97/2003 excel (.XLS) – NunoRibeiro

ответ

1

Вы можете использовать Microsoft.Interop.Excel для чтения XLS файлов, но даже Microsoft disaproved эту технику, потому что это очень медленный процесс, и он не предназначен для запуска на серверах. Более того, их поддержка только что закончилась.

В качестве альтернативы вы можете использовать библиотеку EasyXLS. Вы можете использовать его для чтения файлов XLS.

Посмотрите на этот пример кода, который объясняет, как импортировать файл Excel в SQL таблице: http://www.easyxls.com/manual/FAQ/import-excel-to-sql.html

+0

, так как EasyXLS это не бесплатно, я попробую сначала бесплатные библиотеки – NunoRibeiro

Смежные вопросы