2011-09-02 19 views
6

Estoy tratando de crear rangos con nombre en Excel con OpenXML. Puedo agregar un DefinedName en la colección DefinedNames, pero eso no parece hacer nada. Observé un lugar en ExtendedFileProperties donde se guardan los nombres de los rangos, una estructura llamada "TitlesOfParts". He intentado agregar una entrada allí pero eso hace que Excel arroje un error y no se crea el rango con nombre. Aquí está el código que estoy utilizando:Rangos con nombre en Excel OpenXML

public void AddNamedRange(string pNamedRangeRef, string pNamedRangeName) 
    { 
     DefinedName _definedName = new DefinedName() { Name = pNamedRangeName, Text = pNamedRangeRef }; 
     _workbook.Descendants<DocumentFormat.OpenXml.Spreadsheet.DefinedNames>().First().Append(_definedName); 
     DocumentFormat.OpenXml.VariantTypes.VTLPSTR _t = new DocumentFormat.OpenXml.VariantTypes.VTLPSTR() { Text = pNamedRangeName }; 
     _spreadsheet.ExtendedFilePropertiesPart.Properties.TitlesOfParts.VTVector.Append(_t); 
     _spreadsheet.ExtendedFilePropertiesPart.Properties.TitlesOfParts.VTVector.Size++; 
    } 
+1

"Soy capaz de añadir un DefinedName en la colección DefinedNames, pero eso no parece hacer nada" - que debería ser todo lo que tiene que hacer - ¿De qué manera no hace nada? Cuando guarda el documento y lo abre en Excel, ¿aparece su rango con nombre en la lista desplegable? Si abre xlsx como un archivo comprimido, ¿puede encontrar su rango con nombre en workbook.xml? – Ben

+2

Apuesto a que no calificas los valores correctamente. Su pNamedRangeName debe parecerse a "myrangename" y pNamedRangeRef debe verse como "Sheet1! $ A $ 1". –

Respuesta

1

Utilizando el Open XML SDK 2.0 Productivity Tool for Microsoft Office, para definir un rango mundial/libro de toda la llamada es bastante fácil:

DefinedNames definedNamesCol = new DefinedNames(); //Create the collection 
DefinedName definedName = new DefinedName() 
    { Name = "test", Text="Sheet1!$B$2:$B$4" };  // Create a new range 
definedNamesCol.Append(definedName);     // Add it to the collection 

workbook.Append(definedNamesCol);      // Add collection to the workbook 
0

El código siguiente hizo el truco para mí. Después de esto, pude ver los rangos de nombres en excel también.

var wbPart = document.WorkbookPart; 
Workbook workbook = wbPart.Workbook; 
DefinedName definedName1 = new DefinedName { Name = "ColumnRange",Text = "Sheet1!$A$1:$I$1"}; 
DefinedName definedName2 = new DefinedName { Name = "RowRange", Text = "Sheet1!$A$1:$A$15"}; 
if (workbook.DefinedNames == null) 
      { 
       DefinedNames definedNames1 = new DefinedNames(); 
       definedNames1.Append(definedName1); 
       definedNames1.Append(definedName2); 
       workbook.DefinedNames = definedNames1; 
      } 
Cuestiones relacionadas