Définir DefinedNames dans OpenXML pour définir des titres d'printing pour toutes les feuilles de calcul dans Excel

Mon objective final est de configurer par programmation la valeur de «Print Titles» d'Excel de Page Setup pour toutes les feuilles de calcul de mon document.

Au début, j'ai essayé d'utiliser l'object SpreadsheetPrintingParts (en fonction de cette question ), mais nécessite de générer une base de 64 strings, qui apparemment doit provenir d'un file exisiting. (Je génère ma feuille de calcul à partir de zéro.)

Cette publication m'a ensuite appris que je pouvais définir "Print_Titles" comme un nom défini sur la ligne à laquelle j'avais besoin. J'ai essayé de le faire par programmation, mais cela semble corrompre tous mes files.

Mon code:

  var definedNamesCol = new DefinedNames(); //Create the collection var definedName = new DefinedName() { Name = "_xlnm.Print_Titles", Text = "\'SheetName\'!$2:$2", LocalSheetId = (UInt32) (_nextSheetId - 1) }; // Create a new range definedNamesCol.Append(definedName); // Add it to the collection _workbookPart.Workbook.Append(definedNamesCol); 

J'ai également examiné l'outil de productivité OpenXML qui suggère: (Essentiellement identique)

  DefinedNames definedNames1 = new DefinedNames(); DefinedName definedName1 = new DefinedName(){ Name = "_xlnm.Print_Titles", LocalSheetId = (UInt32Value)0U }; definedName1.Text = "\'SheetName\'!$2:$2"; definedNames1.Append(definedName1) 

J'ai également essayé de définir la propriété Xlm sur DefinedName mais le file s'ouvre alors avec une erreur qu'il contient Macro dans un file Macro-Free, ce qui n'est pas ce que je pense que je veux faire.

Une version (simplifiée) de ce que je génère dans workbook.xml:

 <?xml version="1.0" encoding="utf-8"?> <x:workbook xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> <x:sheets> <x:sheet name="ABBEY" sheetId="1" r:id="R2f5447238bc94fa4" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" /> </x:sheets> <x:definedNames> <x:definedName name="_xlnm.Print_Titles" localSheetId="0">'SheetName'!$2:$2</x:definedName> </x:definedNames> </x:workbook> 

Existe-t-il une meilleure façon d'aborder le problème? Ou est-ce que mon intention est juste, et c'est un malentendu de la méthode ailleurs?

Le code ci-dessus était dans une méthode CreateWorksheet , de sorte qu'on demandait chaque feuille. Dans le file definedNames résultant, il créait alors plusieurs objects definedNames , alors qu'il ne devrait y avoir qu'un seul object definedNames contenant plusieurs definedNames .

J'ai résolu le problème en utilisant ce code:

  var definedName = new DefinedName() { Name = "_xlnm.Print_Titles", Text = "\'Sheet Name\'!$2:$2", LocalSheetId = (UInt32) (_nextSheetId - 1) }; // Create a new range if (_workbookPart.Workbook.DefinedNames == null) { var definedNamesCol = new DefinedNames(); _workbookPart.Workbook.Append(definedNamesCol); } _workbookPart.Workbook.DefinedNames.Append(definedName); // Add it to the collection