Come impostare Excel “Print Titles” con OpenXML

Come posso impostare la proprietà “Print Titles” di un foglio di calcolo con OpenXML, per visualizzare una riga nella parte superiore di ogni pagina stampata?

Stampa interfaccia titoli

La proprietà viene salvata direttamente nell’object SpreadsheetPrintingParts , tuttavia, questo non sembra essere ancora completamente integrato in OpenXML e richiede il passaggio di una stringa base64 alla variabile. ( vedi qui ) Il contenuto di questa stringa sembra essere legato alla macchina su cui è stato aperto il file, cosa che non ha funzionato per la mia implementazione – Non ero in grado di creare un file non danneggiato attraverso SpreadsheetPrintingParts.FeedData() .

Invece, ho trovato questo post che ha dichiarato dando alla riga il nome definito “Print_Titles” ha lo stesso effetto. Sono stato quindi in grado di creare un nome definito tramite OpenXML con il seguente codice:

 public void SetPrintTitleRows(int startRowIndex, int? endRowIndex = null) { var localSheetId = _localsheetId++; //LocalSheetIds are 0-indexed. var definedName = new DefinedName { Name = "_xlnm.Print_Titles", LocalSheetId = localSheetId, Text = String.Format("\'{0}\'!${1}:${2}", _sheetName, startRowIndex, endRowIndex ?? startRowIndex) }; if (_workbookPart.Workbook.DefinedNames == null) { var definedNamesCol = new DefinedNames(); _workbookPart.Workbook.Append(definedNamesCol); } _workbookPart.Workbook.DefinedNames.Append(definedName); } 

Punti da notare:

  1. DefinedName.LocalSheetId è zero-indexed, al contrario di Sheet.Id che è 1-indexed
  2. DefinedNames è una volta per cartella di lavoro, ma può contenere più oggetti DefinedName per diversi fogli.