我有一台机器生成的excel文件,其中有几列具有相同的名称。 e.g:
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的内容时,我看到了所有的&#39; Second&#39;属性与“第一”属性具有相同的值。的。
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:我后面还有一些代码,但我认为它与问题无关。
答案 0 :(得分:1)
你现在无法使用LinqToExcel来解决问题,因为它包装了OleDb函数,然后根据列名映射属性,因此你会丢失指定列的“FN”等OleDb选项(如“ F1“for”A“)。
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请求)