2012-04-27 98 views
2

所有,这个问题上有很多问题,但没有解决我的问题。我写了一个相当复杂的例程,使用OleDb和Access数据库引擎将Excel传递给Excel(我的Office 2010运行在Win7下)。问题是无论我如何定义要写入Excel的列,所有值都作为TEXT/STRING字段导出。C#Excel插入错误使用OleDb和Access数据库引擎

我使用OleDbConnection

string fileName = @"F:\SomePath\MyExcel.xlsx"; 
string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= 
    {0};Extended Properties=""Excel 12.0 Xml;HDR=YES;MaxScanRows=0;IMEX=0""", fileName); 

,并试图许多其他connection string options没有运气。

我生成代码Excel的定义,但明确地这些被制成

CREATE TABLE [MetaTab] ([Table] TEXT,[Field] TEXT,[Seq] NUMBER,[DataLevel] NUMBER) 

然后我生成用于插入的代码,对于以上示例是

INSERT INTO [MetaTab$]([Table],[Field],[Seq],[DataLevel])VALUES('B1A','EstabID','1','9') 

这工作,但所有值都写为TEXT。 如何强制Excel采取其他数据格式?

注意:我已尝试删除非字符串的撇号,但这也不起作用。我真的被卡住了,任何想法都将不胜感激。谢谢你的时间。

+0

您是否尝试过与HDR = NO,我认为,如果你创建的表中,第一行不包含任何头 – Steve 2012-04-27 10:44:52

+0

是。我试过这个。谢谢。 – MoonKnight 2012-04-27 10:46:29

回答

1

我不认为你可以。一个excel格式实际上并不与数据库列数据类型相同 - 最终,其基础值始终是数字或字符串;然后格式决定它如何显示。

即使我错了 - 我个人更倾向于使用http://epplus.codeplex.com/来生成我的Excel电子表格 - 您可以在其中执行很多非常先进的内容以及格式化等简单内容。

+0

但是我看到代码中存在一个现有的Excel文件,并且使用与上面相同的“INSERT”语句,并且使用正确的格式插入数据。我想这表明格式化是在INSERT发生之前在工作簿中预先建立的。对我来说,看起来很奇怪,你可以用CREATE TABLE来指定列类型,并且这不符合INSERT ... – MoonKnight 2012-04-27 10:55:55

+0

@Killercam - oledb提供程序不必支持SQL DDL的每个功能你可以开火它 - 它只需要正确解释它。在excel的情况下,将行插入现有工作表将使用Excel的智能格式化传播行为;但除此之外,SQL数据类型不适用于Excel格式,因此供应商不解释它们是有道理的。虽然方便吗?绝对不! – 2012-04-27 11:07:47

+0

我明白,提供程序不必支持SQL DDL,但CREATE声明在指定所需的列格式时不起作用。这清楚地表明,Excel正在处理这些类型,以便正确构建表结构 - 这种情况似乎没有发生。我看过你的链接,我很喜欢它!我目前使用'Microsoft.Office.Interop.Excel'库导出我格式化的Excel文件,这是非常笨重和笨重的!我喜欢你的答案,但我不相信你不能做我想做的事......感谢你的时间。 – MoonKnight 2012-04-27 12:41:10

1

在Excel表格中插入值时,不可能给OleDbCommand提供任何提示(语法)以插入数值。当您打开工作表时,它不会将数值显示为表格中的数字。

有一种解决办法,当在Excel文件中创建第一条记录时,然后转到第一条记录并重新输入已存在记录的单元格中的相同值(其中数字数据需要)。

您可以在Excel表格中放入一个带有数值的默认记录。

下面提到的示例代码将在数据表中创建第一条记录后将数据类型转换为数字。当任何记录已经插入到工作表中时,调用ChangeFormat函数,其他数据将保持适当的格式。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Office.Interop.Excel; 
using System.Data; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 


     System.Data.DataTable xlsData = new System.Data.DataTable(); 
     string xlsConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\\romil.xlsx;Extended Properties=\"Excel 12.0;HDR=Yes;\""; 
     System.Data.OleDb.OleDbConnection xlsCon = new System.Data.OleDb.OleDbConnection(xlsConnectionString); 
     System.Data.OleDb.OleDbCommand xlsCommand; 
     int recUpdate; 
     int recordsinSheet; 

     xlsCommand = new System.Data.OleDb.OleDbCommand("Select count(*) as RecCount from [Sheet1$]"); 
     xlsCommand.Connection = xlsCon; 
     xlsCon.Open(); 
     recordsinSheet =Convert.ToInt32(xlsCommand.ExecuteScalar()); 

     xlsCommand= new System.Data.OleDb.OleDbCommand("Insert into [Sheet1$] (Field1,Field2) values ('123',2)"); 
     xlsCommand.Connection = xlsCon; 

     recUpdate = xlsCommand.ExecuteNonQuery(); 
     xlsCon.Close(); 

     if ((recordsinSheet + recUpdate) == 1) 
      ChangeFormat(); 

     Console.ReadKey(); 

    } 

    private static void ChangeFormat() 
    { 
     string filename = "d:\\romil.xlsx"; 

     object missing = System.Reflection.Missing.Value ; 

     Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 

     Microsoft.Office.Interop.Excel.Workbook wb = excel.Workbooks.Open(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); 

     Microsoft.Office.Interop.Excel.Worksheet wsh=null; 
     foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in wb.Sheets) 
     { 
      if (sheet.Name == "Sheet1") 
      { 
       wsh = sheet; 
       break; 
      } 
     } 

     for (int rCnt = 2; rCnt <= wsh.Rows.Count; rCnt++) 
     { 

      if (wsh.Cells[rCnt, 2].Value== null) 
       break; 

      wsh.Cells[rCnt, 2] = wsh.Cells[rCnt, 2].Value; 
     }  

     wb.SaveAs(filename, missing, 
      missing, missing, missing, missing, 
      Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, 
      missing, missing, missing, 
      missing, missing); 
     wb.Close(); 
    } 
} 

}

+0

+1非常感谢您的答案。但是,这假定用户安装了Office,并且在这种情况下使用OleDb的重点是避免使用Interop。我已经有了一个使用'Microsoft.Office.Interop.Excel'写入Excel的例程。再次感谢,这是一个很好的工作,我可能会在将来使用... – MoonKnight 2012-04-29 09:50:25

相关问题