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
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;
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:
Questo funziona, ho avuto difficoltà a ottenere la riga corretta. – NWessel
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
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;
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;
Risposta brillante (e l'unica che ha funzionato per me). –
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 }
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;
}
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 };
}
- 1. Perché viene compilata?
- 2. Perché viene compilata questa dichiarazione della classe C#?
- 3. Unione di celle in Excel utilizzando C#
- 4. leggi dati excel riga per riga con C# .net
- 5. Concatenazione di stringhe, perché viene compilata?
- 6. Impossibile salvare il file Excel utilizzando C#
- 7. Aggiungi nuova riga al file excel utilizzando la libreria phpExcel
- 8. Creare un grafico in Excel utilizzando C#
- 9. Come viene compilata una classe vuota e una struttura vuota?
- 10. prima riga vuota in excel
- 11. Iniziare a leggere i dati da una riga specifica di excel utilizzando Linq in C#
- 12. utilizzando il carattere ':' in XDocument per la generazione Excel - C#
- 13. Che aspetto ha una classe C++ compilata?
- 14. Come aggiungere una nuova riga al file excel in C#
- 15. La libreria C++ head-only (GLM) non viene compilata con Android-NDK
- 16. Nascondere password/chiavi nell'applicazione compilata
- 17. Backbone.js + Rest. La raccolta non viene compilata dopo il recupero()
- 18. std :: la funzione non viene compilata in VS2012
- 19. La funzione di ritorno di constexpr non viene compilata
- 20. La versione pointfree non viene compilata, ma quella puntuale?
- 21. Cosa significa questa espressione e perché viene compilata?
- 22. Perché questa matrice di assegnazione della struttura non viene compilata?
- 23. Lua chiamata da redis viene interpretata o compilata?
- 24. Leggere una stringa riga per riga utilizzando C++
- 25. Stampa di Excel utilizzando Interop
- 26. C++: Come eseguire il debug di un'applicazione C++ compilata utilizzando la toolchain "Microsoft Visual C++" in eclissi?
- 27. questo numero riga segnaposto excel formula
- 28. Conversione di tabella HTML in Excel foglio utilizzando C#
- 29. Converti valore cella Excel da testo a numero utilizzando C#
- 30. Come formattare voce in Excel/CSV utilizzando C#
Non sei sicuro di come funzionerebbe la prima opzione ... Ma la seconda sembra interessante. Come posso tradurlo in un valore int? – SoftwareSavant
Ho modificato il mio codice, non ho testato quel codice ma spero che ti dia un'idea per quello che vuoi ottenere. – Priyank
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