2013-09-24 5 views
32

У меня есть файл excel с листом1, который имеет значение, которое мне нужно прочитать в строке 2 и столбце 10. Вот мой код.Как читать одно значение ячейки Excel

Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(workbookPath, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); 
Excel.Sheets excelSheets = excelWorkbook.Worksheets; 
string currentSheet = "Sheet1"; 
Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets.get_Item(currentSheet); 
var cell = (Excel.Range)excelWorksheet.Cells[10, 2]; 

После получения объекта ячейки, который является Excel.Range, я не знаю, как читать содержимое этой ячейки. Я попытался преобразовать его в массив и перебрать его, и я попытался преобразовать в массив строк и т. Д. Я уверен, что это очень просто. Есть ли прямой способ получить только одно значение ячейки, которое является строкой?

ответ

59

Вам нужно передать его в строку (а не массив строки), поскольку это одно значение.

var cellValue = (string)(excelWorksheet.Cells[10, 2] as Excel.Range).Value; 
+0

если я делаю это так, как вы упомянули, я получаю такую ​​ошибку: не могу выразить выражение типа «Microsoft.Office.Interop.Excel.Range» для ввода строки. – DoodleKana

+2

Я пробовал этот подход, о котором вы говорили ранее, но я всегда получал нуль и в VS 2012, когда я это делал. Значит, это не пришло. Value2 или Value [object]. Поэтому я подумал, что то, что я использую, было как-то не так и решило спросить здесь. Но я узнал, что мои строки и столбцы были перемешаны по следам и ошибкам. Это Cells [row, column] like array. По какой-то причине в Интернете разные сообщения говорили иначе, так что меня смутили. – DoodleKana

+0

У меня есть 'использование Excel = Microsoft.Office.Interop.Excel', и когда я пытаюсь это решение, я получаю ошибку' Тип 'Range' существует как в Microsoft.Office.Interop.Excel, Version [...] ' и 'myProject [...]' '. Есть идеи по этому поводу? – jera

7
//THIS IS WORKING CODE       
Microsoft.Office.Interop.Excel.Range Range_Number,r2; 
Range_Number = wsheet.UsedRange.Find("smth"); 
string f_number=""; 

r2 = wsheet.Cells; 

int n_c = Range_Number.Column; 
int n_r = Range_Number.Row; 
var number = ((Range)r2[n_r + 1, n_c]).Value; 

f_number = (string)number; 
+4

Не могли бы вы добавить немного больше объяснений в свой ответ? Мы стараемся избегать ответов, которые являются только кодом :) Объяснение, скорее всего, поможет будущим читателям. – starsplusplus

+0

Microsoft.Office.Interop.Excel.Range [i, j] возвращает объект (и r2 [n_r + 1, n_c] делает это), поэтому мы должны отдать его в Range, чтобы получить доступ к свойствам Range. Приложение теперь не то, что такое тип «Значение», поэтому мы используем вариант (var) для обработки этого. И мы снова используем cast для получения строкового значения. – MadPointer

+2

Вы можете [изменить] (http://stackoverflow.com/posts/22718076/edit) свой ответ, чтобы включить эту информацию. – starsplusplus

9
using Microsoft.Office.Interop.Excel; 

string path = "C:\\Projects\\ExcelSingleValue\\Test.xlsx "; 

Application excel = new Application(); 
Workbook wb = excel.Workbooks.Open(path); 
Worksheet excelSheet = wb.ActiveSheet; 

//Read the first cell 
string test = excelSheet.Cells[1, 1].Value.ToString(); 

wb.Close(); 

В этом примере используется 'Microsoft Excel Library 15.0 Object', но могут быть совместимы с более ранними версиями Interop и других библиотек.

2

Пожалуйста, попробуйте это, может быть это поможет вам это работа для меня

string sValue = (range.Cells[_row, _column] as Microsoft.Office.Interop.Excel.Range).Value2.ToString(); 
//_row,_column your column & row number 
//eg: string sValue = (sheet.Cells[i + 9, 12] as Microsoft.Office.Interop.Excel.Range).Value2.ToString(); 
//sValue has your value 
3

Лучше использовать .Value2() вместо .Value(). Это быстрее и дает точное значение в ячейке. Для определенного типа данных усечение можно наблюдать, когда используется .Value().

Смежные вопросы