C#Excel插入错误使用OleDb和Access数据库引擎

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

我正在使用OleDbConnectionstring

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

并尝试了许多其他连接string选项 ,没有运气。

我在代码中生成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采取其他数据格式?

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

我不认为你可以。 一个excel格式实际上不是一个数据库列的数据types – 最终底层的值总是一个数字或一个string; 然后格式决定如何显示。

即使我错了 – 我个人更喜欢用http://epplus.codeplex.com/来生成我的Excel电子表格 – 你可以做很多非常先进的东西,以及简单的东西,如格式化。

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

有一个解决办法,当在Excel文件中创build第一个logging,然后转到第一个logging,并重新input相同的值单元格(其中数字数据需要)已有的logging。

要么

你可以把一个默认的logging与Excel表中的数值。

下面提到的示例代码将在数据表中创build第一条logging之后将数据types转换为数字。 当任何一个logging被插入到表单中时,调用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(); } } 

}