【问题标题】:LinqToExcel - Need to start at a specific rowLinqToExcel - 需要从特定行开始
【发布时间】:2023-03-19 03:38:01
【问题描述】:

我正在使用LinqToExcel library。到目前为止工作得很好,除了我需要在特定行开始查询。这是因为客户端的 excel 电子表格在数据实际开始之前在 excel 文件顶部使用了一些图像和“标题”信息。

数据本身很容易阅读并且相当通用,我只需要知道如何告诉ExcelQueryFactory 从特定行开始。

我知道WorksheetRange<Company>("B3", "G10") 选项,但我不想指定一个结束行,只是开始读取文件的位置。

在 C# 中使用最新版本的 LinqToExcel

【问题讨论】:

    标签: linq linq-to-excel


    【解决方案1】:

    我刚刚尝试了这段代码,它似乎工作得很好:

    var book = new LinqToExcel.ExcelQueryFactory(@"E:\Temporary\Book1.xlsx");
    
    var query =
        from row in book.WorksheetRange("A4", "B16384")
        select new
        {
            Name = row["Name"].Cast<string>(),
            Age = row["Age"].Cast<int>(),
        };
    

    我只取回了带有数据的行。

    【讨论】:

      【解决方案2】:

      我想你已经解决了这个问题,但也许对其他人来说 - 看起来你可以使用

      var excel = new ExcelQueryFactory(path);
      var allRows = excel.WorksheetNoHeader();
      
      //start from 3rd row (zero-based indexing), length = allRows.Count() or computed range of rows you want
      for (int i = 2; i < length; i++)
      {
          RowNoHeader row = allRows.ElementAtOrDefault(i);
          //process the row - access columns as you want - also zero-based indexing
      }
      

      不是指定一些Range("B3", ...)那么简单,还要指定方式。 希望这至少对某人有所帮助;)

      【讨论】:

      • 在哪里分配length 变量?
      • 好吧,如果您想阅读所有行,通常是allRows.CountallRows.Count()allRows.Length(现在不知道,抱歉)。或者作为指定(不存在的)Range("B3", "G10") 的替代,您必须计算它。 Length 仅用于展示目的。那时,没有简单的解决方案 AFAIK ......好点,编辑了原始帖子。
      【解决方案3】:

      我已经尝试过了,适用于我的场景。

      //get the sheets info
              var faceWrksheet = excel.Worksheet(facemechSheetName);
            // get the total rows count.
              int _faceMechRows = faceWrksheet.Count();
      
            // append with End Range.
        var faceMechResult = excel.WorksheetRange<ExcelFaceMech>("A5", "AS" + _faceMechRows.ToString(), SheetName).
                              Where(i => i.WorkOrder != null).Select(x => x).ToList();
      

      【讨论】:

      • 我刚刚发现这非常有用,但想指出您需要将起始行值添加到记录数中,否则您会错过最后的行数,因此它应该是 int _faceMechRows = faceWrksheet .Count()+5;
      • @DavidMolyneux 我不确定这是 2 年前的事,但在我的情况下,它是跳过一些标题记录。
      • 您是正确的,我已经对此进行了更多研究,如果您的顶部行中有数据,那么它可以正常工作。如果像我一样它们只是空白行,那么它们不会被加载,并且总行数会因空行数而变短。因此,如果您有 5 个空白行和 15 行数据(总共 20 行),则总行数为 15,因此您的范围将从第 5 行变为第 15 行,缺少最后 5 行添加跳过的行将使您回到正确的总数。
      【解决方案4】:

      你试过WorksheetRange&lt;Company&gt;("B3", "G")

      【讨论】:

      • 是的,不幸的是它给了我一个错误“EndRange 参数 'G' 是单元格名称的无效格式”
      【解决方案5】:

      不幸的是,目前在 LinqToExcel 框架的迭代中,似乎没有任何方法可以做到这一点。

      为了解决这个问题,我们要求客户将数据上传到 Excel 文档中自己的“表格”中。第一行的标题行及其下的数据。如果他们想要任何“元数据”,他们需要将其包含在另一张表中。下面是LinqToExcel documentation 中关于如何查询特定工作表的示例。

      var excel = new ExcelQueryFactory("excelFileName");
      var oldCompanies = from c in repo.Worksheet<Company>("US Companies") //worksheet name = 'US Companies'
                         where c.LaunchDate < new DateTime(1900, 0, 0)
                         select c;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        • 2018-12-28
        • 1970-01-01
        • 2017-04-11
        • 2015-12-24
        相关资源
        最近更新 更多