【发布时间】:2015-05-14 01:06:58
【问题描述】:
我的最终目标是以编程方式为我的文档中的所有工作表设置 Excel 的“打印标题”页面设置值。
最初我尝试使用 SpreadsheetPrintingParts 对象 (based on this question) - 但是,这需要生成一个基数为 64 的字符串,该字符串似乎必须来自现有文件。 (我正在从头开始生成我的电子表格。)
This post 然后告诉我,我可以将“Print_Titles”设置为我需要的行上的定义名称。我一直在尝试以编程方式执行此操作,但这似乎损坏了我的所有文件。
我的代码:
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);
我还查看了 OpenXML 生产力工具,该工具建议:(基本相同)
DefinedNames definedNames1 = new DefinedNames();
DefinedName definedName1 = new DefinedName(){ Name = "_xlnm.Print_Titles", LocalSheetId = (UInt32Value)0U };
definedName1.Text = "\'SheetName\'!$2:$2";
definedNames1.Append(definedName1)
我也尝试在DefinedName 上设置Xlm 属性,但文件随后打开时出现错误,表明它在无宏文件中包含宏,这不是我想我想做的。
我在 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>
有没有更好的方法来解决这个问题?还是我的意图是正确的,是对其他地方的方法有误解?
【问题讨论】:
-
你能解压你正在创建的文件并显示
workbook.xml文件的内容吗?我的预感是definedNames元素是在calcPr元素之后添加的,但这只是猜测:) -
@petelids:已添加。我的 workbook.xml 没有
calcPr元素,但是我可以看到手动添加 DefinedName 的版本。这有关系吗? -
我认为这意味着我的预感是错误的。
calcPr元素是可选的,所以我 认为 上面的 xml 是有效的。我会再想一想。最初我认为它与this 之类的东西有关 -
@petelids:到了那里......我担心我的示例可能过于简化以显示问题。上面的代码在
CreateSheet方法中,因此为每个工作表创建单独的definedNames对象,而实际上我应该在其中有一个definedNames和许多definedName标记。感谢您为我指明规范的方向,无论如何……这有帮助!
标签: c# excel openxml openxml-sdk