LinqToExcel 重复列名
LinqToExcel Duplicate Column Names
我有一个机器生成的 excel 文件,其中有几列同名。例如:
A B C D
Group 1 Group 2
Period | Name Period | Name
我得到了这样的 DTO:
[ExcelColumn("Period")]
public string FirstPeriod { get; set; }
[ExcelColumn("Name")]
public string FirstName { get; set; }
[ExcelColumn("Period")]
public string SecondPeriod { get; set; }
[ExcelColumn("Name")]
public string SecondName { get; set; }
我使用以下命令读取行:
var excel = new ExcelQueryFactory(filePath);
excel.WorksheetRange<T>(beginCell, endColl + linesCount.ToString(), sheetIndex);
它可以很好地读取文件,但是当我检查我的 DTO 的内容时,我看到所有 'Second' 属性都与 'First' 属性具有相同的值。
This post 是我在搜索中找到的最接近的东西,我认为这个问题可以通过这样的方式解决:
excel.AddMapping<MyDto>(x => x.FirstPeriod, "A");
excel.AddMapping<MyDto>(x => x.FirstName, "B");
excel.AddMapping<MyDto>(x => x.SecondPeriod, "C");
excel.AddMapping<MyDto>(x => x.SecondName, "D");
但我不知道如何获取 excel 列字母...
Obs:我在这背后还有一些代码,但我认为它与问题无关。
你遇到的问题今天无法用 LinqToExcel 解决,因为它包装了 OleDb 函数,然后它们根据列名映射属性,所以你失去了 OleDb 选项,如 "FN" 用于指定列(例如 "F1" 代表 "A")。
LinqToExcel github 存储库中存在与此相关的问题。 https://github.com/paulyoder/LinqToExcel/issues/85
我建议您将列的名称更改为不重复的名称(例如 Period1、Name1、Period2、Name2),如果由于其机器生成而无法更改,请尝试更改 header 中的名称运行时间。
另一种选择是在 excel 文件中进行多个查询,范围拆分您的组,然后稍后合并结果。
var excel = new ExcelQueryFactory(filePath);
var group1 = excel.WorksheetRange<T>(A1, B + rowCount);
var group2 = excel.WorksheetRange<T>(C1, D + rowCount);
编辑:我将开发一个功能来尝试以一种优雅的方式解决这个问题,所以也许将来你有一个更灵活的选项来映射列和属性(如果他们接受我的 Pull请求)
我有一个机器生成的 excel 文件,其中有几列同名。例如:
A B C D
Group 1 Group 2
Period | Name Period | Name
我得到了这样的 DTO:
[ExcelColumn("Period")]
public string FirstPeriod { get; set; }
[ExcelColumn("Name")]
public string FirstName { get; set; }
[ExcelColumn("Period")]
public string SecondPeriod { get; set; }
[ExcelColumn("Name")]
public string SecondName { get; set; }
我使用以下命令读取行:
var excel = new ExcelQueryFactory(filePath);
excel.WorksheetRange<T>(beginCell, endColl + linesCount.ToString(), sheetIndex);
它可以很好地读取文件,但是当我检查我的 DTO 的内容时,我看到所有 'Second' 属性都与 'First' 属性具有相同的值。
This post 是我在搜索中找到的最接近的东西,我认为这个问题可以通过这样的方式解决:
excel.AddMapping<MyDto>(x => x.FirstPeriod, "A");
excel.AddMapping<MyDto>(x => x.FirstName, "B");
excel.AddMapping<MyDto>(x => x.SecondPeriod, "C");
excel.AddMapping<MyDto>(x => x.SecondName, "D");
但我不知道如何获取 excel 列字母...
Obs:我在这背后还有一些代码,但我认为它与问题无关。
你遇到的问题今天无法用 LinqToExcel 解决,因为它包装了 OleDb 函数,然后它们根据列名映射属性,所以你失去了 OleDb 选项,如 "FN" 用于指定列(例如 "F1" 代表 "A")。
LinqToExcel github 存储库中存在与此相关的问题。 https://github.com/paulyoder/LinqToExcel/issues/85
我建议您将列的名称更改为不重复的名称(例如 Period1、Name1、Period2、Name2),如果由于其机器生成而无法更改,请尝试更改 header 中的名称运行时间。
另一种选择是在 excel 文件中进行多个查询,范围拆分您的组,然后稍后合并结果。
var excel = new ExcelQueryFactory(filePath);
var group1 = excel.WorksheetRange<T>(A1, B + rowCount);
var group2 = excel.WorksheetRange<T>(C1, D + rowCount);
编辑:我将开发一个功能来尝试以一种优雅的方式解决这个问题,所以也许将来你有一个更灵活的选项来映射列和属性(如果他们接受我的 Pull请求)