我正在使用C#的Excel Office Interop。 (在VS 2013中)。我正在使用在Office 2010 Professional Plus附带的Excel版本中创建的Excel工作簿。该工作簿具有.xlsx扩展名。
当我在Excel中打开工作簿时,它有4张可见,但是当我使用interop打开它时,Worksheets集合包含带有许多其他名称的工作表,如下所示:
Icons
International URLs
International Settings
DropdownSizer
International Translastions
Data Validation
International Data
然后在该列表之后,最终会显示工作簿选项卡中可见的工作表。但是当我尝试在任何工作表上使用UsedRange时,它没有数据。
我的代码适用于从同一Office / Excel安装创建的其他工作簿,这些工作簿只有一张工作表。
以下是我的代码中的一些捣碎的片段,其中包含注释,空值检查,调试代码等。
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中打开工作簿时,如何才能获得显示在选项卡中的工作表?
完成后,我如何获取每张表中的数据?
答案 0 :(得分:3)
如果您需要将sheetNames
列表过滤为仅包含可见的工作表,可以尝试以下操作:
foreach (Excel.Worksheet worksheet in xlApp.Worksheets)
{
if (worksheet.Visible == XlSheetVisibility.xlSheetVisible)
{
sheetNames.Add(worksheet.Name);
}
}
我尝试过使用xlWorkbook.Worksheets代替 xlApp.Worksheets。没有区别。
文档说明Application.Worksheets
属性返回活动工作簿中所有工作表的集合。由于当前活动的工作簿与xlWorkbook
变量引用的工作簿是同一个对象,因此可能没有任何区别。