2016-11-24 1 views
2

У меня есть ASP.Net сайт. Следующим является мой метод записи потока в excel.Индекс находился за пределами массива при экспорте данных в excel в C#

public void JsonToExcel(string jsonData, HttpResponseBase response) 
    { 
     try 
     { 
      ExcelPackage excel = new ExcelPackage(); 
      var worksheet = excel.Workbook.Worksheets.Add("Sheet1"); 
      //below line is throwing the error 
      worksheet.Cells[1, 1].LoadFromCollection(jsonData, true); 
      using (MemoryStream swObj = new MemoryStream()) 
      { 
       string fileName = DateTime.Now.ToLongDateString() + ".xlsx"; 
       response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
       response.AddHeader("content-disposition", "attachment; filename=" + fileName + ""); 
       excel.SaveAs(swObj); 
       swObj.WriteTo(response.OutputStream); 
       return; 
      } 

     } 
     catch (Exception ex) 
     { 
      //handle exception 
      return; 
     } 
     finally 
     { 
      response.Flush(); 
      response.End(); 
     } 

В этой строке функции - worksheet.Cells[1, 1].LoadFromCollection(jsonData, true);

я получаю следующее исключение

Индекс находился вне границ массива

Я попытался установить в worksheet.Cells[0,0]

Я использую EPPlus 4.1.0 упаковка.

JSON Пример: -

 string jsonData = @"jsonData = [ 
        { 
         ""DocumentName"": ""Test Document"", 
         ""ActionDate"": ""2015-09-25T16:06:25.083"", 
         ""ActionType"": ""View"", 
         ""ActionPerformedBy"": ""Sreeja SJ"" 
        }, 
        { 
         ""DocumentName"": ""Test Document"", 
         ""ActionDate"": ""2015-09-25T16:12:02.497"", 
         ""ActionType"": ""View"", 
         ""ActionPerformedBy"": ""Sreeja SJ"" 
        }, 
        { 
         ""DocumentName"": ""Test Document"", 
         ""ActionDate"": ""2015-09-25T16:13:48.013"", 
         ""ActionType"": ""View"", 
         ""ActionPerformedBy"": ""Sreeja SJ"" 
        }]"; 
+0

Одна из проблем с работой с excel заключается в том, что ячейки не являются zer o, вам лучше использовать закрытый XML, который можно найти здесь https://closedxml.codeplex.com/ –

+0

Можете ли вы отправить образец данных JSON и ожидаемое преобразование Excel? –

+0

@SouvikGhosh. Я разместил образец JSON –

ответ

2

Я думаю, что это проблема с JSON и EPPlus метод LoadFromCollection внутренностей метод LoadFromCollection ожидает коллекцию, а не произвольная строка или что-то еще, поэтому, когда я десериализации его к соответствующий класс с Newtonsoft.Json, похоже, все в порядке.

using System; 
using System.Collections.Generic; 
using System.IO; 
using Newtonsoft.Json; 
using OfficeOpenXml; 

namespace TestC 
{ 
    public class PostData 
    { 
     public string DocumentName { get; set; } 
     public DateTime ActionDate { get; set; } 
     public string ActionType { get; set; } 
     public string ActionPerformedBy { get; set; } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (ExcelPackage package = new ExcelPackage()) { 
       var worksheet = package.Workbook.Worksheets.Add("Sheet1"); 
       string jsonData = @"[ 
        { 
         ""DocumentName"": ""Test Document"", 
         ""ActionDate"": ""2015-09-25T16:06:25.083"", 
         ""ActionType"": ""View"", 
         ""ActionPerformedBy"": ""Sreeja SJ"" 
        }, 
        { 
         ""DocumentName"": ""Test Document"", 
         ""ActionDate"": ""2015-09-25T16:12:02.497"", 
         ""ActionType"": ""View"", 
         ""ActionPerformedBy"": ""Sreeja SJ"" 
        }, 
        { 
         ""DocumentName"": ""Test Document"", 
         ""ActionDate"": ""2015-09-25T16:13:48.013"", 
         ""ActionType"": ""View"", 
         ""ActionPerformedBy"": ""Sreeja SJ"" 
        }]"; 

       List<PostData> dataForExcel = JsonConvert.DeserializeObject<List<PostData>>(jsonData); 

       worksheet.Cells[1, 1].LoadFromCollection(dataForExcel, true); 

       package.SaveAs(File.Create(@"C:\Users\User\Documents\sample.xlsx")); 
      } 
     } 
    } 
} 

Результаты в:

Excel


Для правильного вывода даты в Excel вы должны применять правильный формат чисел для ячеек во второй колонке (ActionDate), начиная со второго ряда до конца:

worksheet.Cells[2, 2, worksheet.Dimension.End.Row, 2].Style.Numberformat.Format = "yyyy-mm-ddThh:mm:ss.000"; 
+0

Это не вопрос внутренних дел. 'LoadFromCollection' ожидает * коллекцию *. Он не анализирует Json, XML или другие произвольные форматы. –

+0

@PanagiotisKanavos yep, поймите сейчас –

+0

@VladislavKhapin Точно! В качестве входного параметра ожидается коллекция IEnumerable. –

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