2010-04-09 7 views
4

utilisant Office bibliothèques Interop de .NET, quelqu'un sait la meilleure façon de convertir dans les deux sens entre les chaînes (par exemple, "A57", "$ L $ 2: M $: $ 3") et correspondant objets de type Excel.Range?Excel.Range à la conversion chaîne en C#

points de bonus si cela fonctionne aussi avec « plages nommées ».

+0

Pas tout à fait sûr de ce que vous voulez dire ici ... sont « A57 », « $ L $ 2: $ M $ 3 » chaînes contenant des informations de référence de cellule que vous souhaitez résoudre un Excel.Range, ou voulez-vous dire autre chose? – code4life

Répondre

3

Utilisez la propriété Range d'un objet Worksheet et transmettez le Type.Missing comme second paramètre.

Par exemple:

Range range = sheet.get_Range("$L$2:$M:$3", Type.Missing); 

Ce prend également en charge les plages nommées.

ÉDITÉE

+0

C'est ce que je veux, bien que je m'intéresse aussi à l'opération inverse (Range to string). – mcoolbeth

+0

Convertissez la propriété 'Name' de la plage en un objet' Name' et regardez les propriétés. – SLaks

+0

Pouvez-vous penser à une raison pour laquelle Range n'apparaît pas parmi les propriétés visibles d'une feuille de calcul dans Visual Studio? – mcoolbeth

0

Si ce que vous essayez d'obtenir est le contenu réel de la cellule, utilisez la propriété Value2. Voici un code qui examine le type de valeur de cellule et fait des choses différentes en conséquence.

Excel.Range cell = (Excel.Range)sheet.UsedRange[row, col]; 
if (cell.Value2 != null) 
{ 
    switch (Type.GetTypeCode(cell.Value2.GetType())) 
    { 
     case TypeCode.String: 
      string formula = cell.Value2; 
      break; 
     case TypeCode.Double: 
      double amt = (Double)cell.Value2; 
      break; 
    } 
} 

cell.Value2 = amt + someotheramt; 

HTH

1

Comme SLaks dit, vous pouvez obtenir un objet de plage à partir d'une adresse de la chaîne avec Range propriété comme worksheet.Range["A3:C30"] de la feuille de calcul. Le deuxième argument peut être omis dans .NET 4.0. .get_Range() est équivalent à .Range[]. Pour inverser la procédure, utilisez la propriété Address des objets de plage comme suit: range.Address.

+0

En C# il semble que vous devez utiliser range.get_Address() et fournir les arguments comme indiqué ici: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.address .aspx –

0

Pour obtenir un string d'un Range:

/// <summary> 
/// Extensions to the Range class. 
/// </summary> 
public static class RangeExtensions 
{ 
    /// <summary> 
    /// Returns the range as a string indicating its address. 
    /// </summary> 
    /// <param name="range">The range to convert to a string.</param> 
    /// <returns>A string indicating the range's address.</returns> 
    public static string ToAddressString(this Range range) 
    { 
     return range.Address[true, true, XlReferenceStyle.xlA1, false, null]; 
    } 
} 

Pour obtenir un Range d'un string:

public class ExcelUtil 
{ 
    /// <summary> 
    /// Converts the given address string on the given sheet to a Range object. 
    /// </summary> 
    /// <param name="sheet">The worksheet.</param> 
    /// <param name="addressString">The address string to convert.</param> 
    /// <returns>The range.</returns> 
    public static Range RangeFromAddresssString(Worksheet sheet, string addressString) 
    { 
     return sheet.Range[addressString]; 
    } 
} 

La deuxième méthode est peut-être un peu gratuit, mais je préfère être clair dans mes noms de méthodes.