C#Excel INSERT使用OleDb和Access数据库引擎时出错

时间:2012-04-27 10:36:55

标签: c# excel connection-string oledb

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

我正在使用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采用其他数据格式?

注意:我已经尝试删除非字符串的撇号,但这也不起作用。我真的被困住了,任何想法都会受到高度赞赏。谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

我认为你不能。 excel格式实际上并不与数据库列数据类型相似 - 最终底层值始终是数字或字符串;然后格式决定了它的显示方式。

即使我错了 - 我个人更喜欢使用http://epplus.codeplex.com/生成我的Excel电子表格 - 你可以在其中做很多非常高级的东西以及格式化等简单的东西。

答案 1 :(得分: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();
    }
}

}