C# 使用C从组合的Excel列/行中读取数据

C# 使用C从组合的Excel列/行中读取数据,c#,excel,com,C#,Excel,Com,我正在尝试使用Microsofts COM Interop从C中的Excel文档中读取数据 到目前为止,我能够加载文档并从中读取一些数据。但是,我需要从两个不同的列中读取数据,并将其作为json输出,以用于jQueryAjax调用 我制作了一个Excel文档结构的快速原型,希望它更容易解释- 我使用的方法称为GetExcelDataByCategorystring categoryName,其中categoryName参数将用于查找要从中获取数据的列 因此,也就是说,如果我使用Category

我正在尝试使用Microsofts COM Interop从C中的Excel文档中读取数据

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

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

我使用的方法称为GetExcelDataByCategorystring categoryName,其中categoryName参数将用于查找要从中获取数据的列

因此,也就是说,如果我使用Category 2作为参数进行调用,我需要获取C列行中的所有值以及A列中相应的日期,因此输出如下所示:

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

我在如何实现这一点上到处搜索,但到目前为止运气不佳:-我知道我可以使用get_Range方法来选择一个范围,但似乎需要明确地告诉该方法从哪一行和哪一列获取数据。即:获取范围A1、C1

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

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

提前谢谢

祝你一切顺利


Bo

对于Excel解析和创建,您可以使用ExcelDataReader:

对于json,您可以使用json.net:


两者都相当容易使用。请看一下网站。

这就是我要做的:

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,但我认为这足以让你渡过难关


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

学习Excel对象模型的最佳方法之一是在Excel中记录一个宏,手动执行手头的任务。然后,查看宏中生成的VBA代码,了解如何构造代码以执行类似任务。嗨,杰蒂,非常感谢您的输入!感谢:但是,当我尝试使用excel文件.xls编写代码时,我总是遇到异常,无法对空引用执行运行时绑定,并且当我查看调试器时,到处都有这样的异常:Description:旧格式或无效类型库,即使我按照Microsoft建议设置了CurrentCulture:-/@bomortensen,问题很可能是因为您的单元格为空。我在我的答案中添加了一些代码,在对单元格进行任何操作之前,这些代码将进行检查以确保单元格不为空。这会解决问题的Hi Stephan,非常感谢我试过了,但我得到了一个索引越界异常,即使结果计数为I 252:我一直在玩弄它,现在我很难找到原因。当我尝试在读取器上创建GetValue0时,会发生异常。我也尝试了其他索引,结果是一样的。。