【发布时间】:2015-12-14 17:05:08
【问题描述】:
我正在尝试从 Excel 文档中读取单个列。我想阅读整列,但显然只存储有数据的单元格。我也想尝试处理列中的单元格为空的情况,但如果列中还有更远的内容,它将读取以后的单元格值。例如:
| Column1 |
|---------|
|bob |
|tom |
|randy |
|travis |
|joe |
| |
|jennifer |
|sam |
|debby |
如果我有那一列,我不介意在joe 之后的行的值是"",但我确实希望它在空白单元格之后继续获取值。但是,假设debby 是列中的最后一个值,我不希望它继续超过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 中找到了很多做类似事情的例子,但不完全是这样,我想确保我做了一些更现代的事情(假设人们用来做这件事的方法已经改变了一些)金额)。
我当前的代码读取整个列,但在最后一个值之后包含空白单元格。
EDIT1
我喜欢下面 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! MessageBox 永远不会显示。我不确定为什么会发生这种情况,但它似乎从未真正完成搜索。我尝试在循环中添加一个计数器,以查看它是否只是在不断地搜索该列,但它似乎不是......它似乎只是停止了。
Finished! MessageBox 在哪里,我试图关闭工作簿和电子表格,但该代码从未运行(正如预期的那样,因为 MessageBox 从未运行)。
如果我手动关闭 Excel 电子表格,我会收到 COMException:
COMException 未被用户代码处理
附加信息:HRESULT 异常:0x803A09A2
有什么想法吗?
【问题讨论】:
-
哈哈,这就是目标,谢谢!
-
我的回答对您有帮助吗?为了解决您遇到的效率问题,我进行了多次更新。
-
我的要求发生了变化,我以不同的方式做到了这一点,但我认为你的答案对于任何偶然发现这一点并需要解决与问题相同的问题的人来说都是很好的。感谢您的精彩回答!