使用OLEDB / Microsoft Jet驱动程序导致excel文件中的“以文本形式存储的数字”

时间:2009-05-25 23:55:25

标签: c# excel oledb

我在使用C#中的OLDEDB将条目写入excel文件时遇到问题。基本上我想使用excel模板文件格式化一些信息。想法是用户可以运行查询,它会将结果填充到excel文件中,然后用户可以继续使用excel来模拟结果。

为此,我创建了一个“raw_data”选项卡,并使用OLEDB像表一样写入它。但是我遇到了预设计算的问题。有些列是文本,其他列是数字,而且只要打开工作表,forumals就会引用这些列。

Excel版本2003 C#/。Net 3.5

这是我的连接字符串

string connectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filename};Extended Properties=""Excel 8.0;HDR=YES;IMEX=0""";

{filename}以后在代码中使用文件路径替换

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
using (DbConnection connection = factory.CreateConnection())
{
  connection.ConnectionString = connectString;
  using (DbCommand command = connection.CreateCommand())
  {

    connection.Open();
    query = "INSERT INTO [raw_prod$] (correlationid, created, ipaddr, nai, started, delta, csid, bytesin, bytesout, cause, bsid, servopt, svzone) VALUES (\"{correlationid}\", \"{created}\", \"{ipaddr}\", \"{nai}\", \"{started}\", {delta}, \"{csid}\", {bytesin}, {bytesout}, {cause}, \"{bsid}\", \"{servopt}\", \"{zone}\")";
    //Replace {} code with actual values skipped
    command.CommandText = query;
    command.ExecuteNonQuery();
  }
}

当此次运行时,数据get按预期填充,但excel将数据视为文本,因此sum(c2:c100)之类的东西不起作用。如果我只是突出显示一个条目并按Enter键,它将自动成为文本。我尝试将列格式化为模板中的数字,正如您所看到的,我删除了sql中的双引号。

如何让excel将这些条目视为数字,以便所有计算都有效?

由于

4 个答案:

答案 0 :(得分:2)

您是否尝试修改TypeGuessRows的reg设置? HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ TypeGuessRows应该在哪里寻找Jet 4.0。 出于调试目的,您可以将其设置为大于默认值8的数字(或者,如果绝对确定第一行是正确的,则将其设置为1.)

一些有助于调试Daily DoesMSDN

的链接

啊哈!刚刚发现代码底部的示例。尝试删除这些数字值

周围的引号
\"{correlationid}\", \"{created}\", \"{ipa

我猜是

{correlationid}, \"{created}\", \"{ipa

答案 1 :(得分:2)

我弄明白了,实际上有点愚蠢。在我的excel文件中,对于任何列的行2-8,我想成为一个数字,我只填写了一些虚拟数字。这样,Jet驱动程序在扫描这些列时将看到数字并考虑这些列数。然后我从C#开始插入,然后相应地编辑模板,仅从第9行开始计算。真的很痛苦,但似乎有效。

答案 2 :(得分:0)

您可以通过显式告知Jet创建要导出的表时列的类型来执行此操作:

 "create table [tabName] ([col1] varchar(255), [col2] double)"

唯一的问题是,如果你试图将字符数据粘贴到数字列中,Jet会在你插入时抛出,这并不奇怪。

一个相关的问题是如何处理空值:就Jet而言,空字符串不为空:如果您尝试将其插入数字列,则Jet会抛出。

答案 3 :(得分:0)

我在Excel 2007中遇到了同样的问题,并通过做两件事来解决它:

  • 使用上面philw提到的CREATE TABLE方法
  • 修改连接字符串并在excel 12.0部分之后添加“xml”

请参阅以下代码示例

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" + scratchFile 
    + @""";Extended Properties=""Excel 12.0 xml;HDR=YES""";   

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");

using (DbConnection connection = factory.CreateConnection())
{
    connection.ConnectionString = connectionString;

    using (DbCommand command = connection.CreateCommand())
    {
        connection.Open();

        command.CommandText = @"CREATE TABLE [RawData$] " + 
            "([Organization] varchar(255), " +
            "[Department] varchar(255), [TotalSales] int, [TotalHours] int)";
        command.ExecuteNonQuery();

        command.CommandText = @"INSERT INTO [RawData$] " +
            "(Organization,Department,TotalSales,TotalHours)" +
            "VALUES('Organization','Department',700,70)";

        command.ExecuteNonQuery();

    }
}