2014-06-09 63 views
-2

我正在使用有很多命名範圍的非常大的工作表。我預計將來工作表會被修改,所以我不能使用它們的單元格號碼與單元格進行交互。如何使用c#Excel.Interop從Excel工作表中獲取現有範圍名稱?

如何從工作表中獲取現有名稱(或現有名稱列表)?另外,我怎麼能告訴我的C#程序某個名字已經存在,並且使用它?

+0

作爲一個說明,使我們建議,當談到因爲文檔和智能感知互操作它是稀疏使用插件事情對自己更容易。 LINQtoExcel和EPPlus都是令人驚歎和高效的插件,在C#中使用Excel時我無法做到這一點。 –

回答

2

你會想如果你使用EPPlus使用Excel.Worksheet.Names

foreach (Excel.Worksheet sheet in wb.Sheets) { 
    foreach (Excel.Range range in sheet.Names) { 
     // this is the named ranges 
    } 
} 

Source

,你可以這樣做(很簡單的哪個屬性)

static void Main(string[] args) { 
     using (FileStream stream = new FileStream(@"C:\Users\bblack\Test\TestWorksheet.xlsx", FileMode.Append)) { 
      using (ExcelPackage xl = new ExcelPackage(stream)) { 
       // xl by default contains one workbook; 
       bool test; 
       foreach (ExcelWorksheet sheet in xl.Workbook.Worksheets) { 
        test = NamedRangeExists("NamedRange", sheet); 
       } 
      } 
     } 
    } 

    static bool NamedRangeExists(string name, ExcelWorksheet ws) { 
     return ws.Names.Where(n => n.Name == name).Count() > 0; 
    } 

這將打開指定的文件,遍歷工作簿中包含的工作表並檢查一個名爲範圍內名爲「NamedRange」。

+0

謝謝!這是一個很大的幫助。 – user3685427

+0

對於遲到的回覆,我表示歉意,但我試圖弄清楚如何使用EPPlus。我使用NuGet Package命令行安裝了軟件包。我在頂部聲明瞭'使用OpenOfficeXml;'但是我仍然在你的行中出現錯誤'返回ws.Names.Where(n ....'。Intellisense不喜歡「Where」並且不會提供任何修復。任何幫助? – Sanya

+0

如果它沒有對'.Where()'的引用,那麼這可能意味着你沒有正確的'using'語句。關閉我的頭頂我認爲需要使用System。 Linq' –

0

你在找這樣的事嗎?在這個解決方案,我把它們放在一本字典

Dictionary<string, Worksheet> dictionary = new Dictionary<string, Worksheet>(); 
foreach (Worksheet worksheet in ws.Worksheets) 
{ 
    dictionary.Add(worksheet.Name, worksheet); 
} 

更新

Sheet1.Range( 「A3:A7」)< - 獲取範圍

WB是類型Workbook

Dictionary<string, Range> dictionary = new Dictionary<string, Range>(); 
foreach (Worksheet sheet in wb.Sheets) { 
    foreach (Range range in sheet.Names) { 
     dictionary.Add(range.Name, Range); 
     //use here range var 
     var cells= range.Cells; 
    } 
} 

是指here看你要

+0

這是工作表名稱,不是命名範圍。 –

+0

'Sheet1.Range(「A3:A7」)' – faby

+0

什麼?這列出了工作表的名稱,例如Sheet1,Sheet2,Sheet3,他想要的是Worksheet本身中命名範圍的列表,這意味着他需要使用'Names'成員,而不是'Name'成員。 –

0

這種替代本·布萊克的回答爲我工作:

foreach (Excel.Worksheet sheet in wb.Sheets) { 
    foreach (Excel.Name name in sheet.Names) {   
     var value = sheet.get_Range(name.NameLocal).Value;//get value of named range 
     var formula = sheet.get_Range(name.NameLocal).Formula;//get Formula of named range 
} 
} 
相關問題