我正在尝试从Excel文档中读取单列数据。我想读取整个列,但显然只存储有数据的单元格。我还想尝试处理列中某些单元格为空的情况,但如果在该列下方有更多单元格值,则仍将读取后面的内容。例如:
| Column1 |
|---------|
|bob |
|tom |
|randy |
|travis |
|joe |
| |
|jennifer |
|sam |
|debby |
如果我有那一列,我不介意在
joe
后的行中有一个值为""
,但我希望它在空单元格后继续获取值。然而,我不希望它在假定debby
是该列中的最后一个值时继续进行 35,000 行。
还可以安全地假设这将始终是第一列。
到目前为止,我有:
Excel.Application myApplication = new Excel.Application();
myApplication.Visible = true;
Excel.Workbook myWorkbook = myApplication.Workbooks.Open("C:\\aFileISelect.xlsx");
Excel.Worksheet myWorksheet = myWorkbook.Sheets["aSheet"] as Excel.Worksheet;
Excel.Range myRange = myWorksheet.get_Range("A:A", Type.Missing);
foreach (Excel.Range r in myRange)
{
MessageBox.Show(r.Text);
}
我发现许多从较早版本的.NET中找到的示例做了类似的事情,但不完全相同,并希望确保我所做的更现代些(假设用于此操作的方法已经有所改变)。
我的当前代码读取整个列,但包括最后一个值之后的空单元格。
编辑1 我喜欢Isedlacek下面的答案,但我确实有一个问题,我不确定它是否特定于他的代码。如果我这样使用它:
Excel.Application myApplication = new Excel.Application();
myApplication.Visible = true;
Excel.Workbook myWorkbook = myApplication.Workbooks.Open("C:\\aFileISelect.xlsx");
Excel.Worksheet myWorksheet = myWorkbook.Sheets["aSheet"] as Excel.Worksheet;
Excel.Range myRange = myWorksheet.get_Range("A:A", Type.Missing);
var nonEmptyRanges = myRange.Cast<Excel.Range>()
.Where(r => !string.IsNullOrEmpty(r.Text));
foreach (var r in nonEmptyRanges)
{
MessageBox.Show(r.Text);
}
MessageBox.Show("Finished!");
Finished!
提示框没有显示出来。我不确定为什么会这样,但它似乎从未真正完成搜索。我尝试在循环中添加计数器,以查看它是否只是在不断地搜索该列,但它似乎并不是…… 它似乎只是停止了。在
Finished!
提示框处,我试图只关闭工作簿和电子表格,但该代码从未运行(因为Finished!
提示框从未运行,所以这是预期的)。如果我手动关闭Excel电子表格,我会收到一个COMException:
有什么想法吗?用户代码未处理COMException
附加信息:来自HRESULT的异常:0x803A09A2