LinqToExcel标头映射

时间:2016-08-04 19:30:51

标签: c# linq-to-excel

我正在使用LinqToExcel来获取excel文件的内容。 使用如下所示的头映射类,我可以将我的类的属性映射到excel中的列:

public class Transaction
{
    [ExcelColumn("Trans Id")]
    public string TradeNumber { get; set; }

    [ExcelColumn("Trans Version")]
    public string TransVersion { get; set; }
}

但是,有时传入的文件有不同的标题,例如有时它有标题“Trans Id”有时它有“Trans ID”,当标题是“Trans ID”时程序无法转换列

有没有办法在不区分大小写的模式下使LinqToExcel比较列名? 或者有一个地方让我覆盖LinqToExcel的比较方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

我尝试使用

public void AddTransformation<TSheetData>(Expression<Func<TSheetData, object>> property, Func<string, object> transformation); 

库的一部分,但只处理值,而不处理列名。

不确定这是否是最好的解决方案,但它对我有用。我试图找到类似的方法,但如果你无法控制这样的列名

//Get the Header information
//Worksheet title
//List of Columns (can narrow down if you always know the placement)
ExcelQueryFactory HeaderInfo = new ExcelQueryFactory("FILE NAME.xlsx");
List<string> worksheetName = HeaderInfo.GetWorksheetNames().ToList();
IEnumerable<string> columnNames = HeaderInfo.GetColumnNames(worksheetName[0].ToString());

//Get those values that you're looking for.  Pulling in the unedited Excel column name
string TradeNumber_HeaderName = columnNames.Where(a => a.ToUpper().Trim() == "TRANS ID" || a => a.ToUpper().Trim() == "TRANSID").FirstOrDefault() ?? "Trans ID";
string TransVersion_HeaderName = columnNames.Where(a => a.ToUpper().Trim() == "TRANS VERSION").FirstOrDefault() ?? "Trans Version";

//Whatever your new connection is now to , and this will use that column value dynamically.
ExcelQueryFactory ExcelConn = ...
ExcelConn.AddMapping<Transaction>(x => x.TradeNumber, TradeNumber_HeaderName);
ExcelConn.AddMapping<Transaction>(x => x.TransVersion, TransVersion_HeaderName);

答案 1 :(得分:0)

您可以自己定义映射:

var excelFile = new ExcelQueryFactory(pathToExcelFile);    
excelFile.AddMapping("Trans Id", "Trans ID");

这只是一个建议,你必须为每个场景创建一个映射......呃。

如果AddMapping适合您,请告诉我们。