在 OpenXML 中设置 DefinedNames 以设置 Excel 中所有工作表的打印标题
Setting DefinedNames in OpenXML to set Print Titles for all worksheets in Excel
我的最终目标是以编程方式为我的文档中的所有工作表设置 Excel 的 "Print Titles" 页面设置值。
最初我尝试使用 SpreadsheetPrintingParts
object (based on this question) - 但是,这需要生成一个 base 64 字符串,这似乎必须来自现有文件。 (我正在从头开始生成我的电子表格。)
This post 然后教我可以将 "Print_Titles" 设置为我需要的行上的定义名称。我一直在尝试以编程方式执行此操作,但这似乎损坏了我的所有文件。
我的代码:
var definedNamesCol = new DefinedNames(); //Create the collection
var definedName = new DefinedName() { Name = "_xlnm.Print_Titles", Text = "\'SheetName\'!:", LocalSheetId = (UInt32) (_nextSheetId - 1) }; // Create a new range
definedNamesCol.Append(definedName); // Add it to the collection
_workbookPart.Workbook.Append(definedNamesCol);
我还查看了 OpenXML 生产力工具,它表明:(基本相同)
DefinedNames definedNames1 = new DefinedNames();
DefinedName definedName1 = new DefinedName(){ Name = "_xlnm.Print_Titles", LocalSheetId = (UInt32Value)0U };
definedName1.Text = "\'SheetName\'!:";
definedNames1.Append(definedName1)
我也试过在 DefinedName
上设置 Xlm
属性 但是文件打开时出现错误,它在 Macro-Free 文件中包含宏,这这不是我想做的。
我在 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'!:</x:definedName>
</x:definedNames>
</x:workbook>
有没有更好的方法来解决这个问题?还是我的本意是对的,是其他地方对方法的误解?
以上代码在 CreateWorksheet
方法中,因此每个 sheet 都会被调用。在生成的 workbook.xml
文件中,创建了多个 definedNames
对象,而实际上应该只有一个 definedNames
对象包含多个 definedNames
.
我使用此代码解决了问题:
var definedName = new DefinedName() { Name = "_xlnm.Print_Titles", Text = "\'Sheet Name\'!:", 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
我的最终目标是以编程方式为我的文档中的所有工作表设置 Excel 的 "Print Titles" 页面设置值。
最初我尝试使用 SpreadsheetPrintingParts
object (based on this question) - 但是,这需要生成一个 base 64 字符串,这似乎必须来自现有文件。 (我正在从头开始生成我的电子表格。)
This post 然后教我可以将 "Print_Titles" 设置为我需要的行上的定义名称。我一直在尝试以编程方式执行此操作,但这似乎损坏了我的所有文件。
我的代码:
var definedNamesCol = new DefinedNames(); //Create the collection
var definedName = new DefinedName() { Name = "_xlnm.Print_Titles", Text = "\'SheetName\'!:", LocalSheetId = (UInt32) (_nextSheetId - 1) }; // Create a new range
definedNamesCol.Append(definedName); // Add it to the collection
_workbookPart.Workbook.Append(definedNamesCol);
我还查看了 OpenXML 生产力工具,它表明:(基本相同)
DefinedNames definedNames1 = new DefinedNames();
DefinedName definedName1 = new DefinedName(){ Name = "_xlnm.Print_Titles", LocalSheetId = (UInt32Value)0U };
definedName1.Text = "\'SheetName\'!:";
definedNames1.Append(definedName1)
我也试过在 DefinedName
上设置 Xlm
属性 但是文件打开时出现错误,它在 Macro-Free 文件中包含宏,这这不是我想做的。
我在 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'!:</x:definedName>
</x:definedNames>
</x:workbook>
有没有更好的方法来解决这个问题?还是我的本意是对的,是其他地方对方法的误解?
以上代码在 CreateWorksheet
方法中,因此每个 sheet 都会被调用。在生成的 workbook.xml
文件中,创建了多个 definedNames
对象,而实际上应该只有一个 definedNames
对象包含多个 definedNames
.
我使用此代码解决了问题:
var definedName = new DefinedName() { Name = "_xlnm.Print_Titles", Text = "\'Sheet Name\'!:", 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