我正試圖從Excel文檔讀取一列。我想閱讀整個專欄,但顯然只存儲有數據的單元格。我也想嘗試處理這種情況,即列中的某個單元格爲空,但如果列中的某些內容更靠後,它將在稍後的單元格值中讀取。例如:如何從Excel電子表格中讀取單個列?
| Column1 |
|---------|
|bob |
|tom |
|randy |
|travis |
|joe |
| |
|jennifer |
|sam |
|debby |
如果我有這樣的專欄中,我不介意joe
後具有行A ""
價值,但我不希望它保持空白單元格後得到的值。但是,假設debby
是該列中的最後一個值,我不希望它繼續運行到過去的 35000行。
假設這將始終是第一列也是安全的。
到目前爲止,我有這樣的:
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
任何想法?
最後!今天的問題可以理解! – pnuts
哈哈,那是目標,謝謝! – trueCamelType
我的回答對你有幫助嗎?爲了解決您遇到的效率問題,我做了幾項更新。 –