Excel Interop Worksheets 列表有多余的工作表,UsedRange 没有数据

Excel Interop Worksheets list has extra sheets, UsedRange has no data

我正在使用来自 C# 的 Excel Office Interop。 (在 VS 2013 中)。我正在使用 Excel 工作簿,该工作簿是在 Office 2010 Professional Plus 附带的 Excel 版本中创建的。工作簿的扩展名为 .xlsx。

当我在 Excel 中打开工作簿时,它有 4 sheets 可见,但是当我使用互操作打开它时,Worksheets 集合包含 sheets 还有很多其他的名字,比如:

Icons 
International URLs 
International Settings 
DropdownSizer
International Translastions 
Data Validation 
International Data

然后在该列表之后,工作簿选项卡中可见的 sheet 终于出现了。但是,当我尝试获取任何 sheet 的 UsedRange 时,它​​里面没有数据。

我的代码适用于从同一 Office/Excel 安装创建的其他工作簿,这些工作簿只有一个 sheet。

以下是我的代码中的一些混搭片段,其中删除了注释、空检查、调试代码等:

private Excel.Application xlApp;
private Excel.Workbook xlWorkbook;
private Excel.Worksheet xlWorksheet;
public Excel.Range usedRange;   

public void Open(string pathname, int sheetNum = 1) {
    xlApp = new Excel.Application();
    xlWorkbook = xlApp.Workbooks.Open(pathname, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);        
    xlWorksheet = (Excel.Worksheet)xlWorkbook.Sheets.get_Item(sheetNum);
    usedRange = xlWorksheet.UsedRange;
}

public string[] GetSheetNames() {
    var sheetNames = new List<string>();
    foreach (Excel.Worksheet worksheet in xlApp.Worksheets) {
        sheetNames.Add(worksheet.Name);
    }
    return sheetNames.ToArray();
}

public void SetCurrentSheet(int sheetNum) {
    usedRange = xlWorkbook.Worksheets[sheetNum].UsedRange;
}

我试过使用 xlWorkbook.Worksheets 而不是 xlApp.Worksheets。没有区别。

当我在 Excel 中打开工作簿时,如何才能只显示选项卡中显示的 sheet?

这样做之后,如何获取每个 sheet 中的数据?

如果您需要过滤 sheetNames 列表以仅包含可见工作表,您可以尝试以下操作:

foreach (Excel.Worksheet worksheet in xlApp.Worksheets)
{
    if (worksheet.Visible == XlSheetVisibility.xlSheetVisible) 
    {
        sheetNames.Add(worksheet.Name);
    }
}

I've tried using the xlWorkbook.Worksheets instead of xlApp.Worksheets. No difference.

文档说 Application.Worksheets 属性 returns 活动工作簿中所有工作表的集合。由于当前活动的工作簿与您的 xlWorkbook 变量引用的对象是同一对象,因此没有任何区别。