Excel Interop 只读过滤行
Excel Interop read only filtered rows
原始未过滤table
已过滤 table
我正在尝试使用 Interop.Excel 读取 .xlsx 文件。 xlRange 变量似乎有一个奇怪的行为,当我将它设置为仅显示过滤后的单元格(可见)时:
Excel.Range xlRange = xlWorksheet.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible, Type.Missing);
调试中:
当table不过滤时:
xlRange.Count: 15 //table
中的元素总数
rowCount: 5 //这包括 header
过滤table时:
xlRange.Count: 9 //这是正确的
rowCount: 1 //这里应该是3(包括header)
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(Directory.GetCurrentDirectory() + "\Example.xlsx");
Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible, Type.Missing);
int rowCount = xlRange.Rows.Count;
int colCount = xlRange.Columns.Count;
//iterate over the rows and columns and print to the console as it appears in the file
//excel is not zero based!!
for (int i = 1; i <= rowCount; i++)
{
for (int j = 1; j <= colCount; j++)
{
//new line
if (j == 1)
Console.Write("\r\n");
//write the value to the console
if (xlRange.Cells[i, j] != null && xlRange.Cells[i, j].Value2 != null)
Console.Write(xlRange.Cells[i, j].Value2.ToString() + "\t");
}
}
考虑到 xlRange.Count 是 9 我应该能够手动访问所有 3 行而忽略 rowCount 变量但 xlRange 似乎与原始未过滤范围相同:
Console.WriteLine(xlRange.Cells[1, 1]);//Writes ID, Correct
Console.WriteLine(xlRange.Cells[2, 1]);//Writes 1, Should be 2
Console.WriteLine(xlRange.Cells[3, 1]);//Writes 2, Should be 4
Console.WriteLine(xlRange.Cells[4, 1]);//Writes 3, Should not be able to acces this element element at all because xlRange.Count is 9
我怀疑您想要的是迭代 .Rows
属性 而不是字面意义上的 row/column。像这样:
foreach (Excel.Range row in xlRange.Rows)
{
for (int j = 1; j <= colCount; j++)
{
//write the value to the console
if (row.Cells[1, j] != null && row.Cells[1, j].Value2 != null)
Console.Write(row.Cells[1, j].Value2.ToString() + "\t");
}
Console.WriteLine();
}
当您指定范围内的行、列时,我怀疑它会转到该行(相对于范围)。
试一试,告诉我。
原始未过滤table
已过滤 table
我正在尝试使用 Interop.Excel 读取 .xlsx 文件。 xlRange 变量似乎有一个奇怪的行为,当我将它设置为仅显示过滤后的单元格(可见)时:
Excel.Range xlRange = xlWorksheet.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible, Type.Missing);
调试中:
当table不过滤时:
xlRange.Count: 15 //table
中的元素总数rowCount: 5 //这包括 header
过滤table时:
xlRange.Count: 9 //这是正确的
rowCount: 1 //这里应该是3(包括header)
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(Directory.GetCurrentDirectory() + "\Example.xlsx");
Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible, Type.Missing);
int rowCount = xlRange.Rows.Count;
int colCount = xlRange.Columns.Count;
//iterate over the rows and columns and print to the console as it appears in the file
//excel is not zero based!!
for (int i = 1; i <= rowCount; i++)
{
for (int j = 1; j <= colCount; j++)
{
//new line
if (j == 1)
Console.Write("\r\n");
//write the value to the console
if (xlRange.Cells[i, j] != null && xlRange.Cells[i, j].Value2 != null)
Console.Write(xlRange.Cells[i, j].Value2.ToString() + "\t");
}
}
考虑到 xlRange.Count 是 9 我应该能够手动访问所有 3 行而忽略 rowCount 变量但 xlRange 似乎与原始未过滤范围相同:
Console.WriteLine(xlRange.Cells[1, 1]);//Writes ID, Correct
Console.WriteLine(xlRange.Cells[2, 1]);//Writes 1, Should be 2
Console.WriteLine(xlRange.Cells[3, 1]);//Writes 2, Should be 4
Console.WriteLine(xlRange.Cells[4, 1]);//Writes 3, Should not be able to acces this element element at all because xlRange.Count is 9
我怀疑您想要的是迭代 .Rows
属性 而不是字面意义上的 row/column。像这样:
foreach (Excel.Range row in xlRange.Rows)
{
for (int j = 1; j <= colCount; j++)
{
//write the value to the console
if (row.Cells[1, j] != null && row.Cells[1, j].Value2 != null)
Console.Write(row.Cells[1, j].Value2.ToString() + "\t");
}
Console.WriteLine();
}
当您指定范围内的行、列时,我怀疑它会转到该行(相对于范围)。
试一试,告诉我。