2010-02-18 6 views
4

J'essaie de lire un fichier Excel à partir de C# en utilisant COM, et je peux l'ouvrir et le charger très bien. Cependant, je ne veux pas utiliser toutes les données de la feuille (elle se développe mensuellement), juste un certain sous-ensemble qui commence sous le haut de la feuille (ligne 3 pour les en-têtes, ligne 4 pour les données) et va jusqu'au bout . Je peux actuellement obtenir une plage représentant l'ensemble des données comme Excel.Worksheet.UsedRange, mais ensuite je dois soit le manipuler jusqu'à la plage désirée, ou (de préférence) trouver le point final à passer dans une autre plage pour ma récupération de données réelle. Quelqu'un peut-il me dire comment faire l'un ou l'autre? Merci.Besoin de trouver les points de début et de fin d'une gamme Excel en C#

+0

laissez-moi savoir si vous avez besoin d'aide avec ma réponse, je n » étais pas Assurez-vous de la profondeur de votre expérience Excel –

+0

Pouvez-vous être plus précis dans votre question, de quoi exactement avez-vous besoin? Est-ce que UsedRange renvoie la plage correcte et que vous voulez simplement la redimensionner? –

+0

Stan, c'est exactement ça. Je ne veux pas toute la gamme, juste le point final pour que je puisse utiliser mon propre point de départ. –

Répondre

6

Je ne suis pas sûr de ce que vous essayez de faire. Mais voici quelques exemples.

Supposons que je la gamme suivante:

Excel.Worksheet sheet = this.Application.ActiveSheet as Excel.Worksheet; 
Excel.Range range = sheet.get_Range("A1", "B5") as Excel.Range; 

Pour déplacer votre gamme vers le bas par n -nombre de la ligne:

int n = 1; 
int rows = range.Rows.Count; 
int cols = range.Columns.Count; 

Excel.Range newRange = range.get_Offset(n, 0).get_Resize(rows-n,cols); 
newRange.Select(); //will select the new range will be 1 row lower 

Pour déplacer votre rangée du bas

Excel.Range newRange = range.get_Resize(rows-n,cols); 
newRange.Select(); //will select the new range will be 1 row higher 

Je suppose que vous pouvez comprendre comment le déplacer d'un côté à l'autre.

get_Offset() va déplacer toute la gamme, puis vous devez redimensionner la gamme.

EDIT: Maintenant que je sais ce que vous voulez.

Pour sélectionner la dernière cellule:

Excel.Range lastCell = range.Cells[rows, cols] as Excel.Range; 
lastCell.Select(); 

Maintenant, vous pouvez utiliser votre propre point de départ comme ceci:

Excel.Range newRange = sheet.get_Range("B1", lastCell); 
newRange.Select(); 
+0

vous avez répondu à votre propre question, mais je pense toujours que cette réponse vous sera utile à long terme. –

+0

Ouais, c'est génial pour quand je connais les positions que je veux aller, mais j'essaie de trouver la position des dernières données quand je ne sais pas ce que ce sera .. –

+0

@Tom, s'il vous plaît, regardez mon mise à jour répondre, il montrera comment faire ce que vous voulez, sans get_Address. –

1

De MSDN:

« Utilisez la propriété de fin, ainsi qu'une valeur de l'énumération XlDirection (xlUp, xlToRight, xlToLeft, xlDown), pour extraire une plage qui représente la cellule à l'extrémité de la région, comme si vous aviez appuyé sur la touche décrite par la valeur énumérée; "

rngDown = rng.get_End(Excel.XlDirection.xlDown); 
+0

il n'y a pas une telle méthode disponible, je pense que vous pensez à get_End –

+0

Lorsque j'ai essayé cela, il a retourné la fin de la feuille contenant (ligne 65536), plutôt que la fin de la UsedRange. –

+0

@Stan, oui vous avez raison c'est une faute d'impression sur le site MS, merci –

1

Vous devriez être en mesure d'utiliser les Range.Row, Range.Rows.Count, Range.Column et Range.Columns.Count propriétés pour obtenir le début et la fin de votre gamme comme ceci:

Dim used As Range, first As Range, last As Range 
Set used = Sheet1.UsedRange 
Set first = Sheet1.Cells(used.Row, used.Column) 
Set last = Sheet1.Cells(used.Row + used.Rows.Count, used.Column + used.Columns.Count) 

MsgBox ("First: " + first.Address + " Last: " + last.Address) 

Ce code exemple est en VBA, mais toutes ces fonctions devraient être disponibles en C# avec COM.

+0

@Joseph, il y avait une faute d'impression sur le site MS, utilisez get_End à la place –

+0

assurez-vous soit d'abord sélectionner une cellule, ou l'utiliser dans un syndicat formulaire –

1

Ok, trouvé une réponse (après presque 3 heures de recherche totale, demandé ici 2 heures), donc poster ici pour les autres.

Excel.Range urange = (Excel.Range)xlWorkSheet.UsedRange; // gives us the actual range
string used = urange.get_Address(false, false, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing));

De MSDN:
public string get_Address (
[OptionalAttribute] Object RowAbsolute,
[OptionalAttribute] Object ColumnAbsolute,
[OptionalAttribute] XlReferenceStyle ReferenceStyle,
[OptionalAttribute] Object External,
[OptionalAttribute] Object RelativeTo
)

qui, apparemment, les deux premiers sont des drapeaux vrai/faux, le prochain est défini comme un objet Microsoft.Office.Interop.Excel.XlReferenceStyle, et je devine que l'extérieur est soit une référence à un fichier externe, ou un drapeau de quelque sorte. RelativeTo, je ne peux que deviner qu'il se réfère à une position arbitraire définie, peut-être un objet range, peut-être une chaîne. Malheureusement, le MSDN est extrêmement rare sur ce sujet, donc je devine juste ici et poster mes suppositions. Cependant, en utilisant ce code comme je l'ai posté, je suis en mesure de récupérer le total utilisé comme "A1: B245" qui me donne exactement ce que je veux, et je peux ensuite créer une nouvelle gamme en extrayant la deuxième partie et ensuite continuez.

+0

Cela fonctionne PARFAIT! Je ne sais pas pourquoi plus de gens n'ont pas regardé cela. –

Questions connexes