LinqToExcel列名重复

本文关键字:LinqToExcel | 更新日期: 2023-09-27 18:29:20

我有一个机器生成的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"属性相同。

这篇文章是我在搜索中发现的最接近的东西,我认为这个问题可以用这样的东西来解决:

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列名重复

现在使用LinqToExcel无法解决您遇到的问题,因为它封装了OleDb函数,然后它们根据列名映射属性,因此您将丢失指定列的OleDb选项,如"FN"(如"A"的"F1")。

LinqToExcel github repo上有一个问题。https://github.com/paulyoder/LinqToExcel/issues/85

我建议您将列的名称更改为不重复的名称(例如,Period1、Name1、Period2、Name2)。如果由于机器生成而无法更改,请尝试在运行时更改标题名称。

另一种选择是在excel文件中进行多个查询,将范围划分为组,然后合并结果。

var excel = new ExcelQueryFactory(filePath);
var group1 = excel.WorksheetRange<T>(A1, B + rowCount);
var group2 = excel.WorksheetRange<T>(C1, D + rowCount);

编辑:我将开发一个功能,尝试以优雅的方式解决这个问题,所以也许将来你可以有一个更灵活的选项来映射列和属性(如果他们接受我的Pull Request)