2015-12-04 5 views
12

Ich lese Daten von Excel zu datierbar mit EPPlus.Wie kann ich die tatsächlich verwendete Reichweite für modifizierte Excel mit Epplus nutzen?

Nachdem ich ein Excel-Blatt mit 10 Datensatzzeilen gelesen hatte, änderte ich die Excel-Tabelle, indem ich vorhandene Daten löschte und Daten für nur eine Zeile behielt. Aber wenn ich das modifizierte Excel lese liest es immer noch 10 Zeilen (1 mit Wert und bleibt als Nullfelder) in Datentabelle.

Wie kann dies begrenzt werden? Ich verwende folgenden Code zum Lesen von Excel.

using (var pck = new OfficeOpenXml.ExcelPackage()) 
{ 
    using (var stream = File.OpenRead(FilePath)) 
    { 
     pck.Load(stream); 
    } 
    var ws = pck.Workbook.Worksheets.First();     
    bool hasHeader = true; // adjust it accordingly(this is a simple approach) 
    foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]) 
    { 
     DSClientTransmittal.Tables[0].Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); 
    } 
    var startRow = hasHeader ? 2 : 1; 
    for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) 
    { 
     //var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; 
     var wsRow = ws.Cells[rowNum, 1, rowNum, DSClientTransmittal.Tables[0].Columns.Count]; 
     var row = DSClientTransmittal.Tables[0].NewRow(); 
     foreach (var cell in wsRow) 
     { 
      try 
      { 
       object cellValue = cell.Value; 
       //row[cell.Start.Column - 1] = cell.Text; 
       row[cell.Start.Column - 1] = cellValue.ToString().Trim(); 
       //cell.Style.Numberformat.Format = "@"; 
       //row[cell.Start.Column - 1] = cell.Text; 
      } 
      catch (Exception ex) { } 
     } 
     DSClientTransmittal.Tables[0].Rows.Add(row); 
    } 
    pck.Dispose(); 
} 

Als ich Interop Excel Excel zu lesen, wurde gleiches Problem überwunden durch clearformat() Verfahren wie

ws.Columns.ClearFormats(); 
xlColCount = ws.UsedRange.Columns.Count; 

Gibt es eine Entsprechung für diesen in Epplus Open XML? Wie kann ich den tatsächlich verwendeten Bereich für modifizierte Excel-Werte erhalten?

+0

Wie entfernen Sie die Daten? – Ernie

+0

Dimension scheint in allen meinen Tests den richtigen Bereich zu liefern. Auch nach dem Löschen von Zeilen und dem erneuten Importieren. Ist Dimension nach dem Löschen in Ihrer Situation 10 Zeilen? –

+0

@PhilipBijker, @ Ernie: Ich wähle alle Zellen aus, die entfernt werden müssen, und lösche die Taste, nicht ganze Zeile – Athul

Antwort

5

Es gibt keine integrierte Möglichkeit, anzugeben, dass eine Zeile nicht berücksichtigt werden soll, wenn nur Daten in einigen Zellen gelöscht werden.

Dimension ist so nah wie Sie bekommen können, aber Reihen sind in der Dimension wenn jede Spalte enthält Daten, oder wenn jede Zeile oben oder unten enthält Daten enthalten.

Sie könnten jedoch versuchen, herauszufinden, ob Sie eine Zeile in der for-Schleife überspringen sollten. Zum Beispiel, wenn Sie die Daten immer in den ersten 4 Spalten löschen nur, dann könnten Sie versuchen:

if(!ws.Cells[rowNum, 1, rowNum, 4].All(c => c.Value == null)) 
{ 
    //Continue adding the row to the table 
} 

Die Beschreibung ist nicht die Kriterien angibt, für eine Zeile überspringen, aber Sie bekommen die Idee.

+0

ist es nicht möglich, zu sagen, welche Zeilen entfernt werden.Nur 4 vergeben ws.Dimension.End.Row wird es funktionieren? – Athul

+0

Sie geben Folgendes an: "Ich habe das Excel-Blatt geändert, indem vorhandene Daten entfernt und Daten nur für eine Zeile aufbewahrt wurden". Welche Daten werden genau entfernt? Dies sollte das Kriterium sein, um die Zeile als entfernt zu behandeln und sie somit in der for-Schleife zu überspringen. –

+0

war es wie zufälliger Test, keine vorherigen Kriterien zum Entfernen von Zelldaten, ich habe eine Excel-Vorlage mit Beispieldaten für den Massenimport. Die meisten der Clients werden (durch Entfernen von einigen Zeilen und alle) diese vorhandene Vorlage bearbeiten und – Athul

3

Zunächst bin ich kein C# -Programmierer, aber ich denke, ich habe eine Lösung, die mit einem Excel-VBA-Skript funktioniert. Sie können möglicherweise diesen Excel-VBA-Code mit C ausführen oder erhalten Einblick, wie Sie dasselbe mit C + erreichen können.

Das Problem, das Sie haben, hängt damit zusammen, wie Excel die Arbeitsgröße eines Arbeitsblatts behandelt. Wenn Sie Daten in der 1 Millionsten Zeile eingeben und dann diese Zelle löschen, zeigt Excel das Arbeitsblatt weiterhin mit 1 Million Zeilen an.

Ich habe diesen Excel-VBA-Code getestet und erfolgreich alle Zeilen gelöscht, die vollständig leer waren, und dann die Arbeitsblattgröße zurücksetzen.

Sub DelEmptyRowsResizeWorksheet() 
    Dim i As Long, iLimit As Long 
    iLimit = ActiveSheet.UsedRange.Rows.Count 
    For i = iLimit To 1 Step -1 
    If Application.CountA(Cells(i, 1).EntireRow) = 0 Then 
     Cells(i, 1).EntireRow.Delete 
    End If 
    Next i 
    iLimit = ActiveSheet.UsedRange.Rows.Count ' resize the worksheet based on the last row with data 
End Sub 

dies ohne Skript manuell zu tun, löschen Sie zunächst alle leeren Zeilen am unteren Rand (oder Spalten auf der rechten Seite) von einem Arbeitsblatt, speichern, dann schließen und die Arbeitsmappe öffnen. Ich habe festgestellt, dass dadurch auch die Excel-Arbeitsmappengröße zurückgesetzt wird.

Verwandte Themen