如何使用 OpenXML 设置 Excel "Print Titles"

How to set Excel "Print Titles" with OpenXML

如何使用 OpenXML 设置电子表格的 "Print Titles" 属性,以便在每个打印页面的顶部显示一行?

属性 直接保存在 SpreadsheetPrintingParts 对象中,然而,这似乎还没有完全集成到 OpenXML 中,需要将 base64 字符串传递给变量. (see here) 这个字符串的内容似乎与打开文件的机器有关,这对我的实现不起作用——我无法通过 [=12 创建一个未损坏的文件=].

相反,我发现 this post 表示给行定义名称 "Print_Titles" 具有相同的效果。然后我可以使用以下代码通过 OpenXML 创建定义的名称:

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}\'!:", _sheetName, startRowIndex, endRowIndex ?? startRowIndex)
            };

            if (_workbookPart.Workbook.DefinedNames == null)
            {
                var definedNamesCol = new DefinedNames();
                _workbookPart.Workbook.Append(definedNamesCol);
            }

            _workbookPart.Workbook.DefinedNames.Append(definedName);
        }

注意事项:

  1. DefinedName.LocalSheetId 是零索引的,与 Sheet.Id 相反,它是 1 索引的
  2. DefinedNames 每个工作簿一次,但可以包含多个 DefinedName 对象用于不同的工作表。