2017-12-08 8 views
0

Ich mache eine Bulk-Excel-Export-Operation, In diesem Excel habe ich ein Diagramm, sollte das Diagramm basierend auf exportierten Daten binden. Aber die Daten werden als Zeichenfolge in Excel eingefügt. Es ist ein dynamischer Export Ich habe mehr als 10 Blätter in einer Excel-Datei, ich verwende eine gemeinsame Methode für alle Operationen. So wurden meine gesamten Daten als String behandelt. Ich werde Int nicht wegen seiner Dynamik konvertieren können.Excel-Diagramm nicht verbindlich beim Export von C#

 int rCnt; 
     int cCnt; 
     int rw = 0; 
     int cl = 0; 
       // Fill The Report Content Data Here 
       rw = dtblData.Rows.Count; 
       cl = dtblData.Columns.Count; 
       string[,] data = new string[rw, cl]; 
       for (var row = 1; row <= rw; row++) 
       { 
        for (var column = 1; column <= cl; column++) 
        { 
         data[row - 1, column - 1] = dtblData.Rows[row - 1][column - 1].ToString(); 
        } 
       } 
       Excel.Range endRange = (Excel.Range)xlWorkSheet.Cells[rw + (startrange.Cells.Row - 1), cl + (startrange.Cells.Column - 1)]; 
       Excel.Range writeRange = xlWorkSheet.Range[startrange, endRange]; 
       writeRange.WrapText = true; 
       writeRange.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous; 
       writeRange.Value2 = data; 
       data = null; 
       startrange = null; 
       endRange = null; 
       writeRange = null; 

enter image description here

+0

Sie sollten versuchen Epp plus Excel zu exportieren sie haben ein viel besseres Ergebnis als Interop, ich habe ab sofort keine genaue Lösung, aber versuchen Sie mit epp – Lucifer

+0

@Lucifer Es ist eine große Aufgabe, die gesamte Quelle zu Epp plus von Interop zu ändern – Jzl

Antwort

0

Es geschieht, weil Sie Array vom Typ verwenden string und nicht int für die „Count“ Säule, eine Art und Weise stark typisierte Objekte zu verwenden ist (im Beispiel ist es eine Liste von structs das stellt man Data Object) Daten zu halten, und als es zum Auffüllen Excel-Arbeitsblatt:

List<dataObj> data = new List<dataObj>(); 
for (var row = 1; row <= rw; row++) 
{ 
    for (var column = 1; column <= cl; column++) 
    { 
     dataObj d = new dataObj(); 
     d.DeniedSourceIp = dtblData.Rows[row - 1]["YourColNameOfDeniedSourceIp"].ToString(); 
     d.Count = int.Parse(dtblData.Rows[row - 1]["YourColNameOfCount"].ToString()); 
     data.Add(d); 
    } 
} 


struct dataObj 
{ 
    public string DeniedSourceIp { get; set; } 
    public int Count { get; set; } 
} 

als Schleife um den Bereich Trog und die Daten injizieren. (?)

auch, wenn Sie Ihre Datentabelle ist stark typisiert, warum Array/Liste von Objekten zu verwenden, können Sie die Daten direkt von Ihrem Datatable injizieren worklsheet zu übertreffen, müssen Sie nicht Range verwenden müssen Sie das tun:

xlWorkSheet.Cells[i, j] = "somevalue"; 
0

Nach einigen Recherchen fand ich die richtige Lösung dafür. Ich habe unterhalb der Codezeile nach dem Zuweisen der Daten hinzugefügt.

writeRange.Value2 = data; writeRange.Formula = writeRange.Formula;

Davor habe ich hinzugefügt, um das Format ich in meiner Excel-Vorlage erforderlich. Ich habe die Zahlenspalten auch in Zahlenformat und Datum geändert. Coole es funktionierte für mich.

Verwandte Themen