2016-11-24 5 views
2

Ich habe ASP.Net Website. Folgendes ist meine Methode, um Stream in Excel zu schreiben.Index war außerhalb der Grenzen des Arrays beim Exportieren von Daten zu Excel in 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(); 
     } 

An dieser Zeile der Funktion - worksheet.Cells[1, 1].LoadFromCollection(jsonData, true);

ich die folgende Ausnahme bin immer außerhalb der Grenzen des Arrays

Index

war ich versucht, Einstellung worksheet.Cells[0,0]

Ich verwende EPPlus 4.1.0 Paket.

JSON-Beispiel: -

 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

Eines der Probleme mit der Arbeit mit Excel ist, dass die Zellen nicht zer sind o basierte Indizes, Sie sind besser dran mit Closed XML hier gefunden https://closedxml.codeplex.com/ –

+0

Können Sie bitte ein Beispiel JSON-Daten und die erwartete Excel-Konvertierung? –

+0

@SouvikGhosh. Ich habe das Beispiel JSON –

Antwort

2

Ich denke, dass es Problem mit JSON und EPPlus Methode LoadFromCollection Interna LoadFromCollection Verfahren eine Sammlung erwartet, keine willkürliche Zeichenfolge oder sonst etwas, so dass, wenn ich deserialisiert es ein entsprechende Klasse mit Newtonsoft.Json scheint es in Ordnung zu sein.

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")); 
      } 
     } 
    } 
} 

Ergebnisse in:

Excel


Für eine korrekte Datum Ausgabe in Excel sollten Sie korrekte Zahlenformat für Zellen in der zweiten Spalte (ActionDate), ausgehend von der zweiten Reihe zum Ende gelten:

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

zu verwenden. Dies ist keine Frage der Interna. 'LoadFromCollection' erwartet eine * Sammlung *. Es analysiert JSON, XML oder andere beliebige Formate nicht. –

+0

@PanagiotisKanavos yep, jetzt verstehen –

+0

@VladislavKhapin Genau! Es erwartet eine IEnumerable-Auflistung als Eingabeparameter. –

Verwandte Themen