如何在使用ClosedXML时确定标题行

问题描述 投票:0回答:2

我有一个小的winforms应用程序,我正在使用并使用ClosedXML处理我们的Excel文件。我试图以某种方式构建读取逻辑,无论标题位于哪一行,我都可以找到该行并使用其下的数据。由于我们的报告来自企业报告系统,因此文件在以数据开头的位置并不总是相同的,因为从我们的系统中导出的内容将报告过滤器和选择附加到前x行,然后在其下开始数据转储。因此,现在,只有我手动删除顶部的所有那些行并将标题行设置为第一行,我才能使其正常工作。

我正在寻找一些有关如何根据列名或任何其他方法查找“标题”行的帮助。我已经看过他们的Wiki https://github.com/ClosedXML/ClosedXML/wiki,但是仅提及使用打印页眉和页脚。

[我相信这里是我需要集中精力工作的地方,但不清楚从哪里开始:

    // Look for the first row used
    var firstRowUsed = ws.FirstRowUsed(); //{'Precision Calculator D'!A1:XFD1}
    //var firstRowUsed = "'Precision Calculator D'!A9:XFD9";

    // Narrow down the row so that it only includes the used part
    var udasRow = firstRowUsed.RowUsed(); //{'Precision Calculator D'!A10:A10}
    //var udasRow = "'Precision Calculator D'!A10:A10}";

    // Move to the next row (it now has the titles)
    udasRow = udasRow.RowBelow();

[我已经尝试过将报头从第5行开始,而其他报头从第7行开始,依此类推,因此没有实际的行,因此需要找到一种自动确定它的方法。无论如何确定列名称所在的行?列将始终以相同的顺序排列,因此我已经确定了。

所以在提到closedXML时碰到了这一点,它的def可能有助于我到达需要的位置,但不清楚如何实现

var foundMonth = ws.Search("Month", System.Globalization.CompareOptions.OrdinalIgnoreCase);

由于它返回一个IEnumerable,所以有可能会有多个单元格的值为“ Month”,并且在我进行即时测试的文件中,有2行包含该单词,并且不确定我如何确定在这种情况下,我想要找到的最后一个单元格(如果有多个)。

解决了有关返回的多个单元格的问题,现在可以使用以下命令确定标题所在的行:

    var foundMonth = ws.Search("Month", System.Globalization.CompareOptions.OrdinalIgnoreCase);
    var monthRow = foundMonth.Last().Address.ToString();

仍然不清楚如何将其实现到上面的原始代码中,因此在这种情况下firstRowUsed会正确反映为A11:XFD11

我有一个小的winforms应用程序,我正在使用并使用ClosedXML处理我们的Excel文件。我试图以某种方式构建读取逻辑,无论标题位于哪一行,我都能发现...

c# closedxml
2个回答
0
投票

在用尽了对ClosedXML的搜索并阅读了许多其他问题之后,我找到了解决方案。下面的代码将帮助您根据文件中当前的数据结构来设置使用范围。

    var foundMonth = ws.Search("Month", System.Globalization.CompareOptions.OrdinalIgnoreCase);            
    var monthRow = foundMonth.Last().Address;  // A11
    var lastcell = ws.LastCellUsed().Address; // BC3950
    var rangeUsed = ws.Range(monthRow, lastcell);

由于我不知道我的标题行在文件之间的位置,因此我在A列中搜索我的列标题名称,因为所有可用数据大部分都是数字,因此我可以放心地假设A列是最后找到的实例“月”一词是我的标题行。这样,最后使用的单元格就可以确定我的数据范围,如上所示。尽管我仍然需要弄清楚如何替换firstRowUsed逻辑以相同的方式工作,但这离最终解决方案还差一步。在我将此问题标记为回答之前,我会把我的发现发回去。


0
投票
var firstRowUsed = ws.Range(monthRow, lastcell).FirstRowUsed();

此行与下面的行相同

© www.soinside.com 2019 - 2024. All rights reserved.