【问题标题】:Read data from combined Excel columns/rows using C#使用 C# 从组合的 Excel 列/行中读取数据
【发布时间】:2012-03-31 00:07:37
【问题描述】:

我正在尝试使用 Microsoft 的 COM 互操作从 C# 中的 Excel 文档中读取数据。

到目前为止,我能够加载文档并从中读取一些数据。但是,我需要从两个不同的列中读取数据并将它们输出为 json(用于 jquery ajax 调用)

我已经制作了我的 Excel 文档结构的快速原型,希望它更容易解释;-)

我的方法称为GetExcelDataByCategory(string categoryName),其中 categoryName 参数将用于查找从哪一列获取数据。

因此,即,如果我使用“Category 2”作为参数进行调用,我需要从 A 列中获取 C 列行中的所有值相应的日期,所以输出将如下所示:

然后需要将其转换/解析为 JSON。

我已经搜索了如何实现这一点的高低,但到目前为止没有运气:-( 我知道我可以使用 get_Range() 方法来选择一个范围,但似乎你需要明确告诉方法从哪一行哪一列获取数据。即:get_Range("A1, C1")

这是我第一次从 Excel 文档中读取数据,所以我想还有很多东西要学 ;-) 有没有办法在我的第二张图片上获得输出?

非常感谢任何帮助/提示! :-)

提前致谢。

一切顺利,

【问题讨论】:

  • 学习 Excel 对象模型的最佳方法之一是在 Excel 中记录宏,您可以在其中手动执行手头的任务。然后,查看宏中生成的 VBA 代码,了解如何构建代码以执行类似任务。

标签: c# excel com


【解决方案1】:

这就是我会做的:

using Excel = Microsoft.Office.Interop.Excel;

Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("path to book");
Excel.Worksheet xlSheet = xlWorkbook.Sheets[1]; // get first sheet
Excel.Range xlRange = xlSheet.UsedRange; // get the entire used range

int numberOfRows = xlRange.Rows.Count;
int numberOfCols = xlRange.Columns.Count;
List<int> columnsToRead = new List<int>();
// find the columns that correspond with the string columnName which
// would be passed into your method
for(int i=1; i<=numberOfCols; i++)
{
    if(xlRange.Cells[1,i].Value2 != null) // ADDED IN EDIT
    {
        if(xlRange.Cells[1,i].Value2.ToString().Equals(categoryName))
        {
            columnsToRead.Add(i);
        }
    }
}
List<string> columnValue = new List<string>();
// loop over each column number and add results to the list
foreach(int c in columnsToRead)
{
    // start at 2 because the first row is 1 and the header row
    for(int r = 2; r <= numberOfRows; r++)
    {
        if(xlRange.Cells[r,c].Value2 != null) // ADDED IN EDIT
        {
            columnValue.Add(xlRange.Cells[r,c].Value2.ToString());
        }
    }
}

这是我用来读取 Excel 的代码。现在它读取具有标题的每一列(由第一行中的任何内容指定),然后读取那里的所有行。这不是您所要求的(它不会格式化为 JSON),但我认为这足以让您克服困难。


编辑:看起来有一些空白单元格会导致问题。 Interop 中的空白单元格将为 NULL,因此如果我们尝试调用 Value2 或 Value2.ToString() 会出现错误,因为它们不存在。我添加了代码来检查以确保在对其进行任何操作之前该单元格不为空。它可以防止错误。

【讨论】:

  • 您好 Jetti,非常感谢您的意见!赞赏:) 但是,当我使用我的 excel 文件 (.xls) 尝试代码时,我不断收到异常“无法在空引用上执行运行时绑定”,当我查看调试器时,到处都是这个异常:“说明:旧格式或无效类型库”,即使我按照 Microsoft 的建议设置 CurrentCulture :-/
  • @bomortensen 问题很可能是因为您的单元格是空的。我在答案中添加了一些代码,这些代码将在对单元格进行任何操作之前检查以确保单元格不为空。这应该可以解决问题
【解决方案2】:

对于 Excel 解析和创建,您可以使用 ExcelDataReader:http://exceldatareader.codeplex.com/

对于 json,您可以使用 json.net:http://json.codeplex.com/

两者都相当容易使用。看看网站吧。

【讨论】:

  • 嗨斯蒂芬,非常感谢! :) 我试过了,但是即使结果计数为 252,我也会得到一个索引超出范围的异常 :( 一段时间以来一直在玩弄它,我很难找出原因。发生了异常当我尝试在阅读器上创建 GetValue(0) 时。我也尝试使用其他索引,结果相同..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多