2012-03-14 97 views
6

我想从C#中使用Microsoftofts COM Interop的Excel文档读取数据。使用C#从组合的Excel列/行读取数据

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

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

enter image description here

我的方法被称为GetExcelDataByCategory(string categoryName)在类别名称参数将被用于查找列从获取数据。因此,即如果我以“Category 2”作为参数进行调用,则需要获取C列行中A列相应日期的所有值,因此输出将会是这样的:

enter image description here

,然后需要转换/解析成JSON。

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

这是我第一次从Excel文档中读取数据的经验,所以我猜想有很多东西需要学习;-)有没有办法让我的第二个图像输出?

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

在此先感谢。

一切顺利,

+0

一个学习Excel对象模型的最佳方法是记录在Excel宏,可以手动执行手头的任务。然后,查看宏中生成的VBA代码,了解如何构建代码以执行类似任务。 – 2012-03-14 14:12:32

回答

4

这是我会做:

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(),则会出现错误,因为它们不存在。我添加了代码来检查以确保单元格在执行任何操作之前不是空的。它可以防止错误。

+0

嗨Jetti,非常感谢您的输入!感谢:)然而,当我尝试用我的代码Excel文件(.xls的),我不断收到异常“无法执行运行时对空引用结合”,当我看看调试器,有此异常遍:“描述:旧格式或无效的类型库”即使我设置的CurrentCulture微软建议: -/ – bomortensen 2012-03-14 21:12:05

+0

@bomortensen的问题很可能是因为您的电池是空的。我在我的答案中添加了一些代码,在执行任何操作之前,将检查单元是否为空。这应该解决问题 – Jetti 2012-03-14 21:38:41

0

为Excel,解析和创作,你可以使用ExcelDataReader:http://exceldatareader.codeplex.com/

和JSON,你可以使用json.net:http://json.codeplex.com/

两者都是相当容易使用。只要看看网站。

+0

嗨斯蒂芬,非常感谢! :)我试了一下,但我发现即使结果计数我252 :(被它鬼混了一段时间,我有一个很难找出原因,唯一的例外发生索引越界异常当我尝试做的GetValue(0)的读者,我与其他指标试图藏汉,具有相同的结果.. – bomortensen 2012-03-14 21:14:28