如何使用c# Excel. interop从Excel工作表中获取现有的区域名称

本文关键字:Excel 区域 域名 获取 何使用 interop 工作 | 更新日期: 2023-09-27 18:08:01

我正在使用一个非常大的工作表,其中有许多命名范围。我预计工作表将来会被修改,所以我不能使用单元格编号与单元格进行交互。

如何从工作表中获得现有名称(或现有名称列表)?或者,我如何告诉我的c#程序某个名称已经存在,并使用它?

如何使用c# Excel. interop从Excel工作表中获取现有的区域名称

您需要使用excel . workbench . names

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

如果您要使用EPPlus,您可以这样做(非常简单)

    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;
    }

这将打开指定的文件,遍历工作簿中包含的工作表,并检查其中名为"namerange"的命名范围

你在寻找这样的东西吗?在这个解决方案中,我将它们放入字典

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

Sheet1.Range("A3:A7")<——get range

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;
     }
}

参考这里查看您想要的属性

这个替代Ben Black的答案对我来说很有效:

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
 }
}
        int row = 3;
        var wb = Globals.ThisAddIn.Application.ActiveWorkbook;
        ws.Range["A6"].Value = wb.Names.Count;
        foreach (Name rangeName in wb.Names)
        {
            Range c = ws.Cells[row++, 3];
            c.Value = rangeName.NameLocal;
        }
        var ws = Globals.ThisAddIn.Application.ActiveSheet;
        ws.Range["A7"].Value = ws.Range["MyRangeName"].Value;