2011-09-02 96 views
6

我想在OpenXML中使用Excel创建命名范围。我可以在DefinedNames集合中添加一个DefinedName,但似乎没有任何作用。我注意到ExtendedFileProperties中的一个地方,其中名称范围正在保存,这是一个名为“TitlesOfParts”的结构。我曾尝试在其中添加一个条目,但这会导致excel引发错误,并且不会创建指定的范围。这里是我使用的代码:在Excel中命名范围OpenXML

public void AddNamedRange(string pNamedRangeRef, string pNamedRangeName) 
    { 
     DefinedName _definedName = new DefinedName() { Name = pNamedRangeName, Text = pNamedRangeRef }; 
     _workbook.Descendants<DocumentFormat.OpenXml.Spreadsheet.DefinedNames>().First().Append(_definedName); 
     DocumentFormat.OpenXml.VariantTypes.VTLPSTR _t = new DocumentFormat.OpenXml.VariantTypes.VTLPSTR() { Text = pNamedRangeName }; 
     _spreadsheet.ExtendedFilePropertiesPart.Properties.TitlesOfParts.VTVector.Append(_t); 
     _spreadsheet.ExtendedFilePropertiesPart.Properties.TitlesOfParts.VTVector.Size++; 
    } 
+1

“我可以在DefinedNames集合中添加一个DefinedName,但这似乎没有做任何事情” - 这应该就是你所需要做的 - 它以什么方式不做任何事情?当您保存文档并在Excel中打开它时,您的命名范围是否显示在下拉列表中?如果您打开xlsx作为zip文件,您是否可以在workbook.xml中找到您命名的范围? – Ben

+2

我敢打赌,你没有适当地限定数值。你的pNamedRangeName应该看起来像“myrangename”,pNamedRangeRef应该看起来像“Sheet1!$ A $ 1”。 –

回答

1

使用Open XML SDK 2.0 Productivity Tool for Microsoft Office,定义一个全局/工作簿范围命名的范围是很容易的:

DefinedNames definedNamesCol = new DefinedNames(); //Create the collection 
DefinedName definedName = new DefinedName() 
    { Name = "test", Text="Sheet1!$B$2:$B$4" };  // Create a new range 
definedNamesCol.Append(definedName);     // Add it to the collection 

workbook.Append(definedNamesCol);      // Add collection to the workbook 
0

下面的代码做的把戏我。在此之后,我能够在Excel中看到名称范围。

var wbPart = document.WorkbookPart; 
Workbook workbook = wbPart.Workbook; 
DefinedName definedName1 = new DefinedName { Name = "ColumnRange",Text = "Sheet1!$A$1:$I$1"}; 
DefinedName definedName2 = new DefinedName { Name = "RowRange", Text = "Sheet1!$A$1:$A$15"}; 
if (workbook.DefinedNames == null) 
      { 
       DefinedNames definedNames1 = new DefinedNames(); 
       definedNames1.Append(definedName1); 
       definedNames1.Append(definedName2); 
       workbook.DefinedNames = definedNames1; 
      }