2011-09-02 88 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; 
      }