C# ExcelDataReader 仅从特定列读取
C# ExcelDataReader read from specific columns only
我正在尝试从我的 excel sheet 获取数据以将其添加到数据库中,这完美地工作,但我只想要特定 header 下的数据。
这是我的配置代码:
var headers = new List<string>;
DataSet result = excelDataReader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true,
ReadHeaderRow = rowReader =>
{
for (var i = 0; i < rowReader.FieldCount; i++)
headers.Add(Convert.ToString(rowReader.GetValue(i)));
},
FilterColumn = (columnReader, columnIndex) =>
headers.IndexOf("LOCATION") == columnIndex
|| headers.IndexOf("PARENT") == columnIndex
|| headers.IndexOf("DESCRIPTION") == columnIndex
}
});
LOCATION
、PARENT
和 DESCRIPTION
是列 header 的名称。
这是我用来将数据添加到数据库的代码
foreach (DataTable table in result.Tables)
{
foreach (DataRow row in table.Rows)
{
if (!existedLocations.Any(l => l.ShortCode?.Replace(" ", String.Empty) == row[0].ToString().Replace(" ", String.Empty)))
{
addtable.Name = addtable.NameAr = row[2].ToString().Substring(row[2].ToString().LastIndexOf(',') + 1);
addtable.ParentLocation = connection.Locations.FirstOrDefault(l => l.ShortCode == row[1].ToString()).Id;
addtable.LocationType = (int)LocationsTypes.Area;
addtable.ShortCode = row[0].ToString();
addtable.Category = (int)LocationsCategory.indoor;
addtable.IsActive = 1;
addtable.Isdeleted = 0;
existedLocations.Add(addtable);
connection.Locations.InsertOnSubmit(addtable);
connection.SubmitChanges();
addtable = new Location();
}
}
}
sheets headers定义如下
sheet1
sheet2
好吧,你有两个 sheet,具有相同的 headers 但位置不同。您的代码将第一个 sheet 的 headers 添加到列表中,然后是第二个 sheet 的 headers。因此,当您在第二个 sheet 中查找要过滤的 headers 时,您会从第一个索引中获取索引,因为 IndexOf 将首次出现。
此外,您似乎只使用 headers
列表来过滤列,因此您可以简化:
var result = reader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true,
FilterColumn = (columnReader, columnIndex) =>
{
string header = columnReader.GetString(columnIndex);
return (header == "LOCATION" ||
header == "PARENT" ||
header == "DESCRIPTION"
);
}
}
});
我正在尝试从我的 excel sheet 获取数据以将其添加到数据库中,这完美地工作,但我只想要特定 header 下的数据。 这是我的配置代码:
var headers = new List<string>;
DataSet result = excelDataReader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true,
ReadHeaderRow = rowReader =>
{
for (var i = 0; i < rowReader.FieldCount; i++)
headers.Add(Convert.ToString(rowReader.GetValue(i)));
},
FilterColumn = (columnReader, columnIndex) =>
headers.IndexOf("LOCATION") == columnIndex
|| headers.IndexOf("PARENT") == columnIndex
|| headers.IndexOf("DESCRIPTION") == columnIndex
}
});
LOCATION
、PARENT
和 DESCRIPTION
是列 header 的名称。
这是我用来将数据添加到数据库的代码
foreach (DataTable table in result.Tables)
{
foreach (DataRow row in table.Rows)
{
if (!existedLocations.Any(l => l.ShortCode?.Replace(" ", String.Empty) == row[0].ToString().Replace(" ", String.Empty)))
{
addtable.Name = addtable.NameAr = row[2].ToString().Substring(row[2].ToString().LastIndexOf(',') + 1);
addtable.ParentLocation = connection.Locations.FirstOrDefault(l => l.ShortCode == row[1].ToString()).Id;
addtable.LocationType = (int)LocationsTypes.Area;
addtable.ShortCode = row[0].ToString();
addtable.Category = (int)LocationsCategory.indoor;
addtable.IsActive = 1;
addtable.Isdeleted = 0;
existedLocations.Add(addtable);
connection.Locations.InsertOnSubmit(addtable);
connection.SubmitChanges();
addtable = new Location();
}
}
}
sheets headers定义如下
sheet1
sheet2
好吧,你有两个 sheet,具有相同的 headers 但位置不同。您的代码将第一个 sheet 的 headers 添加到列表中,然后是第二个 sheet 的 headers。因此,当您在第二个 sheet 中查找要过滤的 headers 时,您会从第一个索引中获取索引,因为 IndexOf 将首次出现。
此外,您似乎只使用 headers
列表来过滤列,因此您可以简化:
var result = reader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true,
FilterColumn = (columnReader, columnIndex) =>
{
string header = columnReader.GetString(columnIndex);
return (header == "LOCATION" ||
header == "PARENT" ||
header == "DESCRIPTION"
);
}
}
});