【问题标题】:I can not read an Excel cell having a leading apostrophe within it我无法读取其中包含前导撇号的 Excel 单元格
【发布时间】:2020-10-21 00:10:06
【问题描述】:

我遇到了这样的问题。我试图读取 Excel 文件数据,都是字符串。我使用了下面的代码。

try
{
    var connectionString = string.Format( "Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"", session["FilePath"] );
    using (var adapter = new System.Data.OleDb.OleDbDataAdapter( "SELECT * FROM [Sheet1$]", connectionString ))
    {
        var ds = new DataSet();
        adapter.Fill( ds, "workBook" );
        workBook = ds.Tables["workBook"];
    }
    if (workBook == null)
        throw new Exception( "Could not load imported spreadsheet!" );
    if (workBook.Rows.Count <= 0)
        throw new Exception( "You are use an empty spreadsheet!" );
    foreach (DataColumn column in workBook.Columns)
        column.ColumnName = column.ColumnName.Trim();
}
catch (Exception exc)
{
}

一切正常,我得到了一个数据表,其中数据为字符串数据类型,并在程序级别解析它们(我在一列中只有混合数据类型)。但是,当单元格具有数字格式并且此单元格的值为 0589 时,我需要在单元格中添加前导撇号,因为 0 必须存在于 4 位数字中。当我尝试使用 IMEX 参数 1 读取此类 excel 文件时,我从该单元格中获得了 NULL 值。我不明白为什么,我把所有的数据都读成字符串数据类型。

【问题讨论】:

  • 您是否尝试过使用其他提供商? Microsoft.ACE.OLEDB.12.0;?
  • 不确定客户端计算机上是否安装了此提供程序。我只确定 Microsoft Jet 4.0。
  • 嗯.. 好的,您是否尝试将数据加载到 ADO.Recordset 而不是数据表中?
  • 不,我没试过。然后我可以将数据从 ADO.Recordset 导入到 Datatable 吗?因为我的代码正在处理数据表。
  • 刚刚尝试将 excel 数据加载到 Recordset 并且相同的单元格返回 NULL。

标签: c# asp.net excel oledb


【解决方案1】:

将单元格的数字格式更改为“0000”,以获得始终为 4 位并保留前导零的数字。

【讨论】:

  • 不幸的是,我的客户希望在他这边一切正常,无需对 excel 文件进行任何操作。
【解决方案2】:

由于我修复了这个问题,在加载电子表格之前,我在程序级别将注册表项 TypeGuessRows 设置为零,然后在加载回 8 之后(以防其他程序使用它)。

【讨论】:

    【解决方案3】:
         string file = "C:\\temp\\Exposure\\UTC.xlsx";
            OleDbConnectionStringBuilder connStringBuilder = new OleDbConnectionStringBuilder();
            connStringBuilder.DataSource = file;
            connStringBuilder.Provider = "Microsoft.ACE.OLEDB.12.0";
    
            connStringBuilder.Add("Extended Properties", "Excel 8.0;HDR=NO;IMEX=1");
    
            DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
    
            DbConnection connection = factory.CreateConnection();
            connection.ConnectionString = connStringBuilder.ConnectionString;
            connection.Open();
    
            // var myTableName = connection.GetSchema("Tables").Rows[0]["TABLE_NAME"];
    
            DbCommand selectCommand = factory.CreateCommand();
    
            string sql = "SELECT * FROM [Daily Monitoring$]";
            selectCommand.CommandText = sql;
            selectCommand.Connection = connection;
    
            DbDataAdapter adapter = factory.CreateDataAdapter();
    
            adapter.SelectCommand = selectCommand;
            DataSet data = new DataSet();
            adapter.Fill(data);
            DataTable dt = data.Tables[0];
    
            connection.Close();
            string ss = dt.Rows[1][1].ToString();
    

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 2019-12-08
      • 2017-04-19
      相关资源
      最近更新 更多