简单地说:我需要以最简单的方式从xlsx文件(行)中读取。也就是说,最好不使用第三方工具,或者至少不能作为nuget包使用的东西。
我一直在尝试使用IExcelDatareader
,但我无法弄清楚如何从特定工作表中获取数据。
这个简单的代码段有效,但它只是读取第一个工作表:
FileStream stream = File.Open("C:\\test\\test.xlsx", FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
excelReader.IsFirstRowAsColumnNames = true;
while (excelReader.Read()) {
Console.WriteLine(excelReader.GetString(0));
}
这将打印第一个工作表中的行,但忽略其他工作表。当然,除此之外没有任何建议,但我似乎无法找出如何指定工作表名称。
这让我觉得这应该很容易吗?
很抱歉,问过几次被问过的问题,但答案(这里和网上的其他地方)是一个糟糕的,完全错误的和过时的半答案的丛林,这是一个尝试和理解的噩梦。特别是因为几乎所有回答的人都认为你知道一些并不容易找到的具体细节。
更新: 根据daniell89的建议,我试过这个:
FileStream stream = File.Open("C:\\test\\test.xlsx", FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
excelReader.IsFirstRowAsColumnNames = true;
// Select the first or second sheet - this works:
DataTable specificWorkSheet = excelReader.AsDataSet().Tables[1];
// This works: Printing the first value in each column
foreach (var col in specificWorkSheet.Columns)
Console.WriteLine(col.ToString());
// This does NOT work: Printing the first value in each row
foreach (var row in specificWorkSheet.Rows)
Console.WriteLine(row.ToString());
使用col.ToString()打印每个列标题可以正常工作。
使用row.ToString()打印每行的第一个单元格会产生以下输出:
System.Data.DataRow
System.Data.DataRow
System.Data.DataRow
...
每行一个,所以显然得到了行。但是如何获取内容,为什么ToString()适用于列而不适用于行?
答案 0 :(得分:2)
也许看看这个答案:https://stackoverflow.com/a/32522041/5358389
DataSet workSheets= reader.AsDataSet();
然后是具体表:
DataTable specificWorkSheet = reader.AsDataSet().Tables[yourValue];
枚举行:
foreach (var row in specificWorkSheet.Rows)
Console.WriteLine(((DataRow)row)[0]); // column identifier in square brackets
答案 1 :(得分:0)
您需要获取要从中读取数据的工作表。要从汽车获得范围A1,例如:
var app = new Application();
Workbooks workbooks = app.Workbooks;
Workbook workbook = workbooks.Open(@"C:\MSFT Site Account Updates_May 2015.xlsx");
Worksheet sheet = workbook.Sheets["Cars"];
Range range = sheet.Range["A1"];
答案 2 :(得分:0)
这是一个较晚的答复,但我希望它将对某人有所帮助 该脚本的目的是从第一张表中检索数据,并获得第一行的数据
if (upload != null && upload.ContentLength > 0)
{
// ExcelDataReader works with the binary Excel file, so it needs a FileStream
// to get started. This is how we avoid dependencies on ACE or Interop:
Stream stream = upload.InputStream;
// We return the interface, so that
IExcelDataReader reader = null;
if (upload.FileName.EndsWith(".xls"))
{
reader = ExcelReaderFactory.CreateBinaryReader(stream);
}
else if (upload.FileName.EndsWith(".xlsx"))
{
reader = ExcelReaderFactory.CreateOpenXmlReader(stream);
}
else
{
ModelState.AddModelError("File", "This file format is not supported");
return View();
}
var result = reader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true
}
}).Tables[0];// get the first sheet data with index 0
var tables = result.Rows[0].Table.Columns;//we have to get a list of table headers here "first row" from 1 row
foreach(var rue in tables)// iterate through the header list and add it to variable 'Headers'
{
Headers.Add(rue.ToString());//Headers has been treated as a global variable "private List<string> Headers = new List<string>();"
}
var count = Headers.Count();// test if the headers have been added using count
reader.Close();
return View(result);
}
else
{
ModelState.AddModelError("File", "Please Upload Your file");
}