Come ottenere la gamma di celle occupate in foglio Excel

Io uso C # per automatizzare un file Excel. Sono stato in grado di ottenere la cartella di lavoro e i fogli in essa contenuti. Se per esempio ho in sheet1 due colonne e 5 righe. Volevo o ottenere l’intervallo per le celle occupate come A1: B5. Ho provato il seguente codice ma non ha dato il risultato corretto. le colonne # e la riga # erano molto più grandi e anche le celle erano vuote.

Excel.Range xlRange = excelWorksheet.UsedRange; int col = xlRange.Columns.Count; int row = xlRange.Rows.Count; 

C’è un altro modo che posso usare per ottenere quell’intervallo?

Ho avuto un problema molto simile a quello che avevi. Ciò che ha effettivamente funzionato è questo:

 iTotalColumns = xlWorkSheet.UsedRange.Columns.Count; iTotalRows = xlWorkSheet.UsedRange.Rows.Count; //These two lines do the magic. xlWorkSheet.Columns.ClearFormats(); xlWorkSheet.Rows.ClearFormats(); iTotalColumns = xlWorkSheet.UsedRange.Columns.Count; iTotalRows = xlWorkSheet.UsedRange.Rows.Count; 

IMHO ciò che accade è che quando elimini i dati da Excel, continua a pensare che ci siano dati in quelle celle, sebbene siano vuoti. Quando ho cancellato i formati, rimuove le celle vuote e quindi restituisce i conteggi effettivi.

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

“range” sarà ora la gamma di celle occupate

Vedi il metodo Range.SpecialCells. Ad esempio, per ottenere celle con valori costanti o formule usa:

 _xlWorksheet.UsedRange.SpecialCells( Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeConstants | Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeFormulas) 

L’unico modo per farlo funzionare in TUTTI gli scenari (eccetto i fogli protetti) (basato sulla risposta di Farham):

Supporta:

  • Scansione di righe / colonne nascoste

  • Ignora le 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; 
 dim lastRow as long 'in VBA it's a long lastrow = wks.range("A65000").end(xlup).row 

Un po ‘vecchia domanda ora, ma se qualcuno sta cercando una soluzione, questo funziona per me.

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

Queste due linee da sole non funzionavano per me:

 xlWorkSheet.Columns.ClearFormats(); xlWorkSheet.Rows.ClearFormats(); 

Puoi testare premendo ctrl + fine nel foglio e vedere quale cella è selezionata.

Ho trovato che aggiungere questa riga dopo i primi due ha risolto il problema in tutti i casi che ho riscontrato:

 Excel.Range xlActiveRange = WorkSheet.UsedRange; 

Si dovrebbe provare la proprietà currentRegion, se si sa da dove si trova la gamma. Questo ti darà i limiti del tuo range usato.