我在使用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将这些条目视为数字,以便所有计算都有效?
由于
答案 0 :(得分:2)
您是否尝试修改TypeGuessRows的reg设置? HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ TypeGuessRows应该在哪里寻找Jet 4.0。 出于调试目的,您可以将其设置为大于默认值8的数字(或者,如果绝对确定第一行是正确的,则将其设置为1.)
一些有助于调试Daily Does和MSDN
的链接啊哈!刚刚发现代码底部的示例。尝试删除这些数字值
周围的引号\"{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中遇到了同样的问题,并通过做两件事来解决它:
请参阅以下代码示例
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();
}
}