【问题标题】:Reading From Excel File - Cells with Values Show Null从 Excel 文件中读取 - 具有值的单元格显示为空
【发布时间】:2017-11-28 02:33:41
【问题描述】:

我编写了一些代码,用于读取 excel 文件中的每一行(针对两个特定列),稍后我将使用这些代码对具有值的每一行执行更新 SQL 查询。

我已经在一个列表框中显示了这些值,当与 excel 文件中的股票代码进行比较时,我得到的空值比预期的要多。

我尝试过更改 excel 文件的格式,但这并没有任何区别。有些行在该位置肯定有股票代码,但是当程序进行单元格比较时,当它们实际具有值时,程序将它们识别为空值。

有人知道我的代码有什么问题吗?

private void btnStockCodes_Click(object sender, RoutedEventArgs e)
{
    string file = @"\\amn-fs-01\users$\Shanel\Desktop\Stock Codes.xlsx";
    Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
    Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(file);
    Worksheet ews = ExcelApp.ActiveWorkbook.Sheets[1];
    Microsoft.Office.Interop.Excel.Range usedRange = ews.UsedRange;

    int TotalCounter = 0;
    string StockCode = "";
    string ReserveID = "";
    int nullcounter = 0;
    int foundcounter = 0;

    foreach (Microsoft.Office.Interop.Excel.Range row in usedRange.Rows)
    {
        StockCode = "";
        ReserveID = "";
        TotalCounter = TotalCounter + 1;

        if (row.Cells[TotalCounter,7].Value == null)
        {
            Listbox1.Items.Add(TotalCounter + " null");
            nullcounter = nullcounter + 1;
        }
        else
        {
            StockCode = row.Cells[TotalCounter,7].Value.ToString();
            ReserveID = row.Cells[TotalCounter, 3].Value.ToString();
            Listbox1.Items.Add(TotalCounter + " " + StockCode + " " + ReserveID);
            foundcounter = foundcounter + 1;
        }
    }

    txtTotal1.Text = foundcounter.ToString() + " Found";
    txtTotal2.Text = nullcounter.ToString() + " Null Values";
    txtTotal3.Text = TotalCounter.ToString() + " Total Records";
}

【问题讨论】:

  • 请上传示例文件供我们测试代码。随意将其缩减为仅显示问题的几行数据。
  • 感谢您的建议!我在描述中添加了一个指向 excel 文件示例的 Dropbox 链接。

标签: c# excel excel-interop


【解决方案1】:

我不相信 Worksheet.UsedRange 总是能正常工作,有时它包含的单元格比它应该包含的更多或更少。我的建议是阅读工作表中的所有行,而您有任何值。一旦没有更多的值,就停止阅读它。 如果行数过多,您可以同时将所有值读入一个数组,例如 here 并使用该数组。

【讨论】:

    【解决方案2】:

    感谢您的贡献,我已经解决了错误!

    出现在 row.Cells[TotalCounter,7].Value.ToString()

    应该是 row.Cells[7].Value.ToString()

    我不需要指定行索引,因为这在 Foreach 循环中已经处理好了。我将研究编写代码的替代方法,因为 Worksheet.UsedRange 可能不会像 Alex 建议的那样在所有情况下都有效。

    【讨论】:

    • 你拯救了我的一天!
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多