在OpenXML中设置DefinedNames,为Excel中的所有工作表设置打印标题

时间:2015-05-13 15:25:41

标签: c# excel openxml openxml-sdk

我的最终目标是以编程方式设置Excel"打印标题"我的文档中所有工作表的页面设置值。

最初我尝试使用SpreadsheetPrintingParts对象(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\'!$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)

我还尝试在Xlm上设置DefinedName属性,但该文件随后会打开,并显示错误,其中包含Macro-Free文件中的宏,该文件不是&# 39;我想我想做什么。

我在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>

有没有更好的方法来解决这个问题?或者我的意图是对的,这是对其他地方方法的误解吗?

1 个答案:

答案 0 :(得分:1)

上面的代码在CreateWorksheet方法中,因此每个工作表都被调用。在生成的workbook.xml文件中,当只有一个definedNames对象包含多个definedNames时,就会创建多个definedNames个对象。

我使用此代码解决了问题:

        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
相关问题