我正在尝试使用Microsofts COM Interop从C#中的Excel文档中读取数据。
到目前为止,我可以加载文档并从中读取一些数据。但是,我需要从两个不同的列读取数据并将它们输出为json(用于jquery ajax调用)
我已经快速制作了我的Excel文档结构的原型,希望它更容易解释; - )
我所使用的方法称为GetExcelDataByCategory(string categoryName)
,其中categoryName参数将用于查找从中获取数据的列。
所以,即如果我以“类别2”作为参数进行调用,我需要获取C列中的所有值和来自A列的相应日期,所以输出看起来像这样:
然后需要将其转换/解析为JSON。
我已经搜索了如何实现这一目标的高低,但到目前为止没有运气:-(我知道我可以使用get_Range()方法来选择范围,但似乎你需要明确告诉方法从哪一行和哪一列获取数据。即:get_Range(“A1,C1”)
这是我从Excel文档中读取数据的第一次经历,所以我想有很多需要学习的东西;-)有没有办法在第二张图片上获得输出?
非常感谢任何帮助/提示! : - )
提前致谢。
一切顺利,
博
答案 0 :(得分: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(),则会出现错误,因为它们不存在。我添加了代码以检查以确保在执行任何操作之前单元格不为null。它可以防止错误。
答案 1 :(得分:0)
对于Excel解析和创建,您可以使用ExcelDataReader:http://exceldatareader.codeplex.com/
对于json,您可以使用json.net:http://json.codeplex.com/
两者都相当容易使用。看看这些网站。