2015-12-04 35 views
12

Sto leggendo i dati da excel a datable usando EPPlus.Come posso ottenere l'attuale intervallo utilizzato per gli eccelli modificati utilizzando Epplus?

Dopo aver letto un foglio Excel con 10 righe di record, ho modificato il foglio excel rimuovendo i dati esistenti e conservando i dati per una sola riga. Ma quando sto leggendo l'Excel modificato, legge ancora 10 righe (1 con valore e restano come campi null) nella tabella dati.

Come limitare questo? Sto usando il seguente codice per leggere 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(); 
} 

Quando stavo usando interoperabilità di Excel leggere Excel, lo stesso problema è stato superato da clearformat() metodo come

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

Esiste un equivalente per questo nel Epplus Open XML? Come posso ottenere l'attuale intervallo usato per gli eccelsi modificati?

+0

Come si rimuovono i dati? – Ernie

+0

La dimensione sembra restituire l'intervallo corretto in tutti i miei test. Anche dopo l'eliminazione di righe e la reimportazione. La dimensione indica 10 righe nella tua situazione dopo l'eliminazione? –

+0

@PhilipBijker, @ Ernie: seleziono tutte le celle che hanno richiesto di rimuovere e premuto il tasto di cancellazione, non l'intera riga – Athul

risposta

5

Non esiste un modo incorporato per indicare che una riga non deve essere tenuta in considerazione quando si eliminano solo i dati in alcune celle.

Dimension è il più vicino si può ottenere, ma righe sono inclusi nella colonna Dimension se qualsiasi contiene dati o se qualsiasi riga sopra o sotto contiene dati.

Si potrebbe tuttavia provare a scoprire se è necessario saltare una riga nel ciclo for. Per esempio, se si eliminano i dati sempre nelle prime 4 solo le colonne, allora si potrebbe provare:

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

La descrizione non indica i criteri per saltare una riga, ma si ottiene l'idea.

+0

non è possibile dire quali file verranno rimosse. Invece di dare 4 posti ws.Dimension.End.Row funzionerà? – Athul

+0

Si indica quanto segue: "Ho modificato il foglio excel rimuovendo i dati esistenti e conservato i dati per una sola riga". Quali dati vengono rimossi esattamente? Questi dovrebbero essere i criteri per trattare la riga come rimossa e quindi saltarla nel ciclo for. –

+0

era come un test casuale, nessun criterio precedente per rimuovere i dati della cella, ho un modello excel con dati di esempio per l'importazione bulk. La maggior parte dei client modificherà (rimuovendo alcune righe e tutti) quel modello esistente e invierà – Athul

3

Per iniziare, non sono un programmatore C#, ma penso di avere una soluzione che funziona utilizzando uno script VBA di Excel. Potresti essere in grado di eseguire questo codice VBA di Excel con C o ottenere informazioni su come ottenere lo stesso risultato con C +.

Il problema riscontrato è relativo al modo in cui Excel gestisce le dimensioni di lavoro di un foglio di lavoro. Se inserisci i dati nella 1 milionesima riga e quindi elimini quella cella, Excel mostra ancora il foglio di lavoro con 1 milione di righe.

Ho testato questo codice VBA di Excel e ha cancellato tutte le righe che erano completamente vuote, quindi reimpostare le dimensioni del foglio di lavoro.

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 

Per fare questo manualmente senza uno script, prima eliminare tutte le righe vuote nella parte inferiore (o colonne sul lato destro) di un foglio, salvare, quindi chiudere e riaprire la cartella di lavoro. Ho trovato che questo ripristina anche la dimensione della cartella di lavoro di Excel.