4

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

为此,我创建了一个“raw_data”选项卡并使用 OLEDB 像表格一样对其进行写入。但是我遇到了预设计算的问题。有些列是文本,有些是数字,论坛应在打开工作表后立即引用这些列。

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();
  }
}

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

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

谢谢

4

4 回答 4

2

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

于 2009-05-26T03:37:01.633 回答
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
于 2009-05-26T00:15:43.610 回答
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();

    }
}
于 2011-07-18T19:45:12.260 回答
0

您可以通过在创建导出表时明确告诉 Jet 列的类型来做到这一点:

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

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

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

于 2010-08-20T07:23:51.767 回答