如何读取单个 Excel 单元格值

Posted

技术标签:

【中文标题】如何读取单个 Excel 单元格值【英文标题】:How to read single Excel cell value 【发布时间】:2013-09-24 23:21:54 【问题描述】:

我有一个带有 sheet1 的 excel 文件,该文件有一个我需要在第 2 行和第 10 列读取的值。 这是我的代码。

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 后,我不知道如何读取该单元格的内容。我尝试将其转换为数组并对其进行循环,然后尝试转换为字符串数组等。我相信它非常简单。有没有一种直接的方法来获取一个字符串的单元格值?

【问题讨论】:

【参考方案1】:

您需要将其转换为字符串(不是字符串数组),因为它是单个值。

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

【讨论】:

如果我按照您提到的方式进行操作,我会收到如下错误:无法将“Microsoft.Office.Interop.Excel.Range”类型的表达式转换为字符串类型。 我尝试过你之前提到的那种方法,但我总是得到 null 并且在 VS 2012 中当我这样做时 .Value 它没有出现。 Value2 或 Value[object] 即将出现。所以我认为我使用的东西有点错误,并决定在这里问。但是我发现我的行和列由于跟踪和错误而混淆了。它是 Cells[row, column] 之类的数组。出于某种原因,互联网上的不同帖子另有说法,这让我感到困惑。 我有using Excel = Microsoft.Office.Interop.Excel,当我尝试这个解决方案时,我收到错误The type 'Range' exists in both 'Microsoft.Office.Interop.Excel, Version[...]' and 'myProject[...]'。有什么想法吗? @jera - 我将 var cellValue = (string)(excelWorksheet.Cells[10, 2] as Excel.Range).Value; 更改为:Excel.Range firstCell = excelWorkSheet.get_range("K2","K2"); var cellValue = firstCell.Value2; 将其拆分为两行避免了同样的错误。 excelWorksheet.Cells[1, 1] 是 1 索引...而不是 0。【参考方案2】:
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 15.0 对象库”,但可能与早期版本的 Interop 和其他库兼容。

【讨论】:

【参考方案3】:
 //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;

【讨论】:

您能否为您的答案添加更多解释?我们尽量避免只是代码的答案 :) 解释更有可能帮助未来的读者。 Microsoft.Office.Interop.Excel.Range[i,j] 返回对象(并且 r2[n_r + 1, n_c] 这样做),因此我们必须将其强制转换为 Range 才能访问范围属性。应用程序现在不知道什么是“Value”类型,所以我们使用 variant(var) 来处理它。我们再次使用 cast 来获取字符串值。 你可以edit你的答案包含该信息。【参考方案4】:

最好使用 .Value2() 而不是 .Value()。这更快,并且在单元格中给出了准确的值。对于某些类型的数据,使用 .Value() 可以观察到截断。

【讨论】:

此属性与 Value 属性的唯一区别是 Value2 属性不使用 Currency 和 Date 数据类型。 docs.microsoft.com/en-us/dotnet/api/…【参考方案5】:

.Net 中读取单个 Excel 单元格的问题在于,空单元格被评估为Null。因此,不能使用其.Value.Value2 属性,因为会出现错误。

要返回一个空字符串,当单元格为Null时,Convert.ToString(Cell)可以按如下方式使用:

Excel.Workbook wkb = Open(excel, filePath);
Excel.Worksheet wk = (Excel.Worksheet)excel.Worksheets.get_Item(1);

for (int i = 1; i < 5; i++)

    string a = Convert.ToString(wk.Cells[i, 1].Value2);
    Console.WriteLine(a);

【讨论】:

【参考方案6】:

请试试这个。也许这可以帮助你。 它对我有用。

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

【讨论】:

【参考方案7】:

你有两种获取价值的方法

using xl = Microsoft.Office.Interop.Excel;

// 1. Using Cells with numbered reference
string cellValue = (excelWorksheet.Cells[10, 2] as xl.Range).Text.ToString();

// 2. Using Range with address reference
string cellValue = excelWorksheet.Range["J2"].Text.ToString();

【讨论】:

【参考方案8】:

在您引用 objWorksheet.UsedRange 的情况下,这个解决方案可能会更好。

Excel.Worksheet mySheet = ...(load a workbook, etc);
Excel.Range myRange = mySheet.UsedRange;
var values = (myRange.Value as Object[,]);
int rowNumber = 3, columnNumber = 5;
string cellValue = Convert.ToString(values[rowNumber, columnNumber]);

【讨论】:

【参考方案9】:

从 excel Worksheet 读取单元格值时可能会遇到问题。如果单元格为空.Value(或.Value2)将抛出null。如果要消除该问题,则需要检查结果是否为null。像这样:

string strcelltext = Convert.ToString(mySheet.get_Range("A1", "A1").Value2) ?? "";

【讨论】:

以上是关于如何读取单个 Excel 单元格值的主要内容,如果未能解决你的问题,请参考以下文章

java导出excel,单元格的格式为下拉框。打开excel时,提示发现不可读取内容和已修复了公式和单元格值

nodejs读取excel时如何判断合并的单元格

如何在excel 中运算公式中引用单元格值

读取 Excel 单元格值而不是计算它的公式 -openpyxl

如何使用合并单元格值大于单元格宽度的 Apache-POI 增加 excel 行的高度?

如何基于单个单元格值格式化整个列?