【问题标题】:Why does ExcelQueryFactory only return 255 columns为什么 ExcelQueryFactory 只返回 255 列
【发布时间】:2014-02-20 17:04:04
【问题描述】:

我有一个包含大约 500 列的电子表格。当我执行下面的 linq 查询时,它只返回 255 列。这是对 ExcelQueryFactory 的限制吗?会不会是我的电子表格有问题?

var book = new ExcelQueryFactory(filePath); var data = from x in book.Worksheet("MyStatisticSheet") select x;

【问题讨论】:

    标签: linq-to-excel


    【解决方案1】:

    这是 LinqToExcel 使用的 Jet 和 Access 数据库引擎的限制。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我找到了解决方法

      var excel = new LinqToExcel.ExcelQueryFactory(InputFileName);
      var EData1 = (from c in excel.WorksheetRangeNoHeader("A1","IU100000", InputFileWorkSheet) select c).ToList<LinqToExcel.RowNoHeader>();
      var EData2 = (from c in excel.WorksheetRangeNoHeader("IV1","ZZ100000", InputFileWorkSheet) select c).ToList<LinqToExcel.RowNoHeader>();
      
      var ExcelData = new List<LinqToExcel.RowNoHeader>();
      for (var i = 0; i < EData1.Count; i++)
      {
          var RowWithoutHeader = EData1[i].Concat(EData2[i]);
          ExcelData.Add(new LinqToExcel.RowNoHeader(RowWithoutHeader));
      
      }
      

      EDATA1 包含前 255 列
      EDATA2 包含剩余的
      如果列数超过 510,我们可以有其他命中 EDATA3。
      ExcelData 现在包含所有列和行,限制为 100000,但也可以增加/减少

      【讨论】:

        【解决方案3】:

        基于@Sunil 的改进答案:

        void Main()
        {
            var excel = new LinqToExcel.ExcelQueryFactory(filePath);
            var eData1 = (from c in excel.WorksheetRange<Foo>("A1", "IU100000", "SheetName") select c).ToList<Foo>();
            var eData2 = (from c in excel.WorksheetRange<Foo>("IV1", "ZZ100000", "SheetName") select c).ToList<Foo>();
        
            var excelData = new List<Foo>();
            for (var i = 0; i < eData1.Count; i++)
            {
                Merge(eData2[i], eData1[i]);
                excelData.Add(eData1[i]);
            }
        }
        
        public class Foo
        { 
            public string Field1 { get; set; }  
            public string Field2 { get; set; } // located in column > 255
        }
        
        public void Merge<T>(T source, T target)
        {
            foreach (var p in typeof(T).GetProperties()) 
            {
                if (p.GetValue(target) == null) {
                    p.SetValue(target, p.GetValue(source));
                }
            }   
        }
        

        【讨论】:

          猜你喜欢
          • 2013-06-08
          • 1970-01-01
          • 2021-03-11
          • 1970-01-01
          • 1970-01-01
          • 2016-12-05
          • 2020-09-23
          • 2015-10-16
          相关资源
          最近更新 更多