【问题标题】:Linq To excel cant find column in excelLinq To excel在excel中找不到列
【发布时间】:2012-02-03 14:26:46
【问题描述】:

我正在使用 Linq to Excel 库来访问其中一个 Excel 工作表,我遇到的问题是,我的调用无法找到具有特定名称的列。

public IQueryable<Cell> getExcel()
    {

        var excel = new ExcelQueryFactory();
        excel.FileName = @"C:\Users\Timsen\Desktop\QUOTATION.CSV";
        var indianaCompanies = from c in excel.Worksheet() select c["ARTICLE TEXT"];

        return indianaCompanies;

    }

错误:

base {System.SystemException} = {"'ARTICLE TEXT' 列名不存在。有效的列名是 'QUOT NO;DEBTOR;ITEM;ART NO;HWS NO#;BRANCH PRICE;QTY;PR;ARTICLE T '、'F2'、'F3'、'F4'、'F5'"}

Excell 中的表格名称

报价

没有

债务人

项目

艺术

没有

HWS

没有。

分店价格

数量

公关

文章正文

类型名称

销售价格

QT%

DIS

金额

UNI

B

ARTG

补充

职责

更新 Excel 示例:

【问题讨论】:

  • ARTICLE TEXT 在错误日志中被引用为 ARTICLE T 。你试过了吗?
  • 我可以看到,但是如何解决呢?在 Excel 中名称是 ARTICLE TEXT 但看起来 linqtoexcel 只返回列文本名称的一部分
  • 我对@9​​87654324@库很熟悉,但是您是否尝试过使用OledbDataAdapter
  • @AnuragRanjhan - 我们能否建议使用 JET 的解决方案,这些解决方案将来在 x64 操作系统上将不会也无法工作?他应该使用 ACE 或使用他正在使用的方法。他当前的问题是我怀疑的格式错误的标头值。
  • @Ramhound 我不知道 JET 不能正常工作。谢谢

标签: c# linq excel


【解决方案1】:

你能告诉我们 csv 文件的第一行或第二行吗?

如果我正确解释了错误消息,标题行将使用分号而不是逗号作为分隔符。

具体来说,错误消息似乎将这些列为列名(请注意,它使用单引号和逗号来尝试使其清晰,这似乎很有用)。

  1. '报价编号;债务人;项目;艺术编号;HWS 编号#;分店价格;数量;公关;T 条'
  2. 'F2'
  3. 'F3'
  4. 'F4'
  5. 'F5'

由于第一个列名是 64 个字符,我假设它在该点被截断,如果该限制没有到位,其余列也将在那里(仍然以分号分隔)。

不确定是否可以为 linq-to-excel 项目指定不同的分隔符,因为根据https://github.com/paulyoder/LinqToExcel/blob/792e0807b2cf2cb6b74f55565ad700d2fcf31e19/src/LinqToExcel/Query/ExcelUtilities.cs,它似乎将 Jet 用于 csv 文件

如果不能将其设为“真正的”csv,并且库不支持指定备用分隔符,您可能只能通过浏览文件中的行来获取文章文本(第一个除外) 并拉出第 12 列(因为那似乎是文章文本)。

所以,类似:

var articleTextValues =
    // Skip(1) since we don't want the header
    from line in File.ReadAllLines(@"C:\Users\Timsen\Desktop\QUOTATION.CSV").Skip(1)
    select line.Split(';')[11];

【讨论】:

  • 我希望得到这些行的实际内容,而不是 Excel 在加载它们时的样子。该文件实际上是基于文本和逗号分隔的值吗? linq-to-excel 库根据扩展名选择要使用的引擎,因此如果文件不是实际的 csv 数据,您需要将其重命名为正确的扩展名,以便库正确处理它。
  • 由于您能够将文件加载到 Excel 中,您可以做的一件事就是将文件从 Excel 重新保存到“真实”的 csv 文件中(使用逗号作为分隔符) .另一种可能性是您的列表分隔符具有与逗号不同的字符的区域设置 - 如果是这种情况,您可能希望尝试将其更改为逗号足够长的时间以将文件内容保存为实际的逗号分隔。如果这不需要自动化,那么您也可以将文件保存为真正的 Excel 工作簿并使用它,因为它可以完全避免分隔符问题。
  • 好吧,当他们从 CiCS 数据库中保存它时,它将被保存为 .XLS 文件,这可能是个问题,所以我必须将文件重新保存为 .csv 格式?
  • 好的,我现在解决了,问题是文件格式。显然,如果具有相同数据的同一文件是 CSV 格式,它会像我一样出现问题。但是,一旦您将格式类型转换为 XLS 文件,问题就消失了,一切正常! James thatnk 寻求帮助,你的回答让我朝着正确的方向前进;)
【解决方案2】:

将您的代码更改为:

public IQueryable<Cell> getExcel() 
{ 

    var excel = new ExcelQueryFactory(); 
    excel.FileName = @"C:\Users\Timsen\Desktop\QUOTATION.CSV"; 
    var indianaCompanies = from c in excel.Worksheet() select c["ARTICLE T"]; 

    return indianaCompanies; 

} 

【讨论】:

    【解决方案3】:

    它列出了有效的列名。 QTY;PR; 表示的列的某些标题存在问题,这意味着它解析了两个不同的列而不是一个。 F2 表示它不知道实际应该调用什么标头。

    最简单的解决方案是验证导入以下查询的数据是否与您的 Excel 文档匹配。

    var indianaCompanies = from c in excel.Worksheet() select *;
    

    我相信这会奏效。

    【讨论】:

    • QTy 和 PR 是不同的列(我格式化失败)。好吧,它会得到整张纸,但是我如何只从 ARTICLE TEXT 库中提取数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2013-09-17
    • 2014-11-07
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多