2011-10-06 14 views
18

Sto cercando di ottenere l'ultima riga di un foglio Excel utilizzando la libreria Microsoft.interop.Excel e C#. Voglio farlo, perché sono incaricato di eseguire il looping di tutti i record di un foglio di calcolo Excel e di eseguire su di essi una sorta di operazione. Nello specifico, ho bisogno del numero effettivo dell'ultima riga, poiché getterò questo numero in una funzione. Qualcuno ha qualche idea su come farlo?L'ultima riga riempita excel viene compilata utilizzando C#

risposta

39

modi di età matura,

using Excel = Microsoft.Office.Interop.Excel; 

Excel.ApplicationClass excel = new Excel.ApplicationClass(); 
Excel.Application app = excel.Application; 
Excel.Range all = app.get_Range("A1:H10", Type.Missing); 

O

Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing); 
Excel.Range range = sheet.get_Range("A1", last); 

int lastUsedRow = last.Row; 
int lastUsedColumn = last.Column; 
+1

Non sei sicuro di come funzionerebbe la prima opzione ... Ma la seconda sembra interessante. Come posso tradurlo in un valore int? – SoftwareSavant

+0

Ho modificato il mio codice, non ho testato quel codice ma spero che ti dia un'idea per quello che vuoi ottenere. – Priyank

+4

Questa risposta fornisce l'ultima cella del valore UsedRange del foglio di lavoro. Il problema, tuttavia, è che UsedRange non si contrae mai. Se hai un valore in A1 e AA100, quindi elimina il contenuto di AA100, UsedRange sarà ancora A1: AA100. AA100 sarà ancora considerato l'ultima cella. – CtrlDot

14

Questo è un problema comune in Excel.

Ecco po 'di codice C#:

// Find the last real row 
nInLastRow = oSheet.Cells.Find("*",System.Reflection.Missing.Value, 
System.Reflection.Missing.Value, System.Reflection.Missing.Value, Excel.XlSearchOrder.xlByRows,Excel.XlSearchDirection.xlPrevious, false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Row; 

// Find the last real column 
nInLastCol = oSheet.Cells.Find("*", System.Reflection.Missing.Value,  System.Reflection.Missing.Value,System.Reflection.Missing.Value, Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlPrevious, false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Column; 

trovato here

o utilizzando SpecialCells

Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing); 
Excel.Range range = sheet.get_Range("A1", last); 

[EDIT] discussioni simili:

+0

Questo funziona, ho avuto difficoltà a ottenere la riga corretta. – NWessel

7

Per domande che coinvolgono il modello a oggetti di Excel, è spesso più facile di provarlo in VBA, poi si traducono in C# è abbastanza banale.

In questo caso un modo per farlo in VBA è:

Worksheet.UsedRange.Row + Worksheet.UsedRange.Rows.Count - 1 
9

Pryank's answer è ciò che ha funzionato per me più vicino. Ho aggiunto un po 'verso la fine (.Row) quindi non sto solo restituendo un range, ma un integer.

int lastRow = wkSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Row; 
6

L'unico modo ho potuto farlo funzionare in tutti gli scenari (ad eccezione di fogli protetti):

Supporta:

  • scansione Hidden riga/colonne

  • ignora celle formattate senza dati/formula

Codice:

// Unhide All Cells and clear formats 
sheet.Columns.ClearFormats(); 
sheet.Rows.ClearFormats(); 

// Detect Last used Row - Ignore cells that contains formulas that result in blank values 
int lastRowIgnoreFormulas = sheet.Cells.Find(
       "*", 
       System.Reflection.Missing.Value, 
       InteropExcel.XlFindLookIn.xlValues, 
       InteropExcel.XlLookAt.xlWhole, 
       InteropExcel.XlSearchOrder.xlByRows, 
       InteropExcel.XlSearchDirection.xlPrevious, 
       false, 
       System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value).Row; 
// Detect Last Used Column - Ignore cells that contains formulas that result in blank values 
int lastColIgnoreFormulas = sheet.Cells.Find(
       "*", 
       System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value, 
       InteropExcel.XlSearchOrder.xlByColumns, 
       InteropExcel.XlSearchDirection.xlPrevious, 
       false, 
       System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value).Column; 

// Detect Last used Row/Column - Including cells that contains formulas that result in blank values 
int lastColIncludeFormulas = sheet.UsedRange.Columns.Count; 
int lastColIncludeFormulas = sheet.UsedRange.Rows.Count; 
+1

Risposta brillante (e l'unica che ha funzionato per me). –

1

L'ActiveSheet.UsedRange.Value restituisce una matrice bidimensionale oggetto 2 [riga, colonna]. Il controllo della lunghezza di entrambe le dimensioni fornirà l'indice LastRow e l'indice LastColumn. L'esempio seguente utilizza C#.

 Excel.Worksheet activeSheet; 
 
\t \t Excel.Range activeRange; 
 

 

 
     public virtual object[,] RangeArray { 
 
\t \t \t get { return ActiveRange.Value; } 
 
\t \t } 
 

 
\t \t public virtual int ColumnCount { 
 
\t \t \t get { return RangeArray.GetLength(1); } 
 
\t \t } 
 

 

 
\t \t public virtual int RowCount { 
 
\t \t \t get { return RangeArray.GetLength(0); } 
 
\t \t } 
 

 
\t \t public virtual int LastRow { 
 
\t \t \t get { return RowCount; } 
 
\t \t }

0

Questo problema è ancora più grave se ci sono forse celle vuote. Ma devi leggere una riga anche se è stato riempito un solo valore. Può richiedere un po 'di tempo quando ci sono molte celle vuote, ma se l'input è vicino a correggere è piuttosto veloce.

La mia soluzione ignora le righe completamente vuote e restituisce conteggio della colonna più lunga fila:

private static int GetLastRow(Worksheet worksheet) 
    { 
     int lastUsedRow = 1; 
     Range range = worksheet.UsedRange; 
     for (int i = 1; i < range.Columns.Count; i++) 
     { 
      int lastRow = range.Rows.Count; 
      for (int j = range.Rows.Count; j > 0; j--) 
      { 
       if (lastUsedRow < lastRow) 
       { 
        lastRow = j; 
        if (!String.IsNullOrWhiteSpace(Convert.ToString((worksheet.Cells[j, i] as Range).Value))) 
        { 
         if (lastUsedRow < lastRow) 
          lastUsedRow = lastRow; 
         if (lastUsedRow == range.Rows.Count) 
          return lastUsedRow - 1; 
         break; 
        } 
       } 
       else 
        break; 
      } 
     } 
     return lastUsedRow; 
    } 
0

Per coloro che utilizzano il metodo SpecialCells, (io non sono sicuro di altri), si ricorda nel caso in cui la vostra ultima cella è uniti, non sarà possibile ottenere l'ultima riga e il numero di colonna utilizzando Range.Row e Range.Column per ottenere l'ultima riga e colonna come numeri. è necessario prima Immergere il intervallo e quindi Ancora ottenere l'ultima cella. Mi è costato molto.

private int[] GetLastRowCol(Ex.Worksheet ws) 
    { 
     Ex.Range last = ws.Cells.SpecialCells(Ex.XlCellType.xlCellTypeLastCell, Type.Missing); 
     bool isMerged = (bool)last.MergeCells; 
     if (isMerged) 
     { 
      last.UnMerge(); 
      last = ws.Cells.SpecialCells(Ex.XlCellType.xlCellTypeLastCell, Type.Missing); 
     } 
     return new int[2] { last.Row, last.Column }; 
    } 
Problemi correlati