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无法解决您遇到的问题,因为它封装了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)