使用OLEDB / Microsoft Jet驱动程序在Excel文件中导致“存储为文本的数字”

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

要做到这一点,我创build一个“raw_data”选项卡,并使用OLEDB写入它像一个表。 不过,我遇到了预devise算的问题。 一些列是文本,另一些是数字,并且一旦打开表格,原型应该引用这些列。

Excel版本2003 C#/。净3.5

这是我的连接string

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

{文件名} get的代码稍后在文件的path代码

 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作为数字对待这些条目,以便所有的计算都能正常工作?

谢谢

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

一些链接,以帮助debugging日常工作和MSDN

啊哈! 刚刚发现你的代码底部的例子。 尝试删除那些数字值的引号

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

我猜是会的

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

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

您可以通过明确地告诉Jet创build导出表的时候列的types:

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

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

一个相关的问题是如何处理空值:就Jet而言,空string不是null:如果试图将其插入到数字列中,则Jet会抛出。

我有与Excel 2007相同的问题,并通过做两件事情来解决它:

  • 使用上面philw提到的CREATE TABLE方法
  • 修改连接string并在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(); } }