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

bom*_*sen 6 c# com excel

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

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

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

在此输入图像描述

调用我所拥有的方法GetExcelDataByCategory(string categoryName),其中categoryName参数将用于查找从哪个列获取数据.

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

在此输入图像描述

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

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

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

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

提前致谢.

祝一切顺利,

博

Jet*_*tti 5

这就是我会做的:

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


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