使用Microsoft Access数据库引擎通过OleDb将数据表插入Excel中

问题描述 投票:3回答:1

我今天遇到了使用此网站上的OleDbConnection从Microsoft Excel文件中读取数据的说明:OLE DB Providers

这使我可以从Excel文件中读取所有数据:

private const string EXCEL_CON =
  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};" +
  @"Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";

    public DataTable ExtractExcel(string fullFilename, string tableName)
    {
        var table = new DataTable();
        string strCon = string.Format(EXCEL_CON, fullFilename);
        using (var xlConn = new System.Data.OleDb.OleDbConnection(strCon))
        {
            ConnectionState initialState = xlConn.State;
            try
            {
                if ((initialState & ConnectionState.Open) != ConnectionState.Open)
                {
                    xlConn.Open();
                }
                string sql = string.Format("SELECT * FROM `{0}`;", tableName);
                using (var cmd = new System.Data.OleDb.OleDbCommand(sql, xlConn))
                {
                    table.Load(cmd.ExecuteReader());
                }
            }
            finally
            { // it seems like Access does not always close the connection
                if ((initialState & ConnectionState.Open) != ConnectionState.Open)
                {
                    xlConn.Close();
                }
            }
        }
        return table;
    }

当插入数据时,第1步是在添加,更改或删除列的情况下删除Microsoft Access数据库中的现有表:

public void InsertExcel(OleDbConnection dbConn, DataTable table) {
  ConnectionState initState = dbConn.State;
  try {
    if ((initState & ConnectionState.Open) != ConnectionState.Open) {
      dbConn.Open();
    }
    string sql = string.Format("SELECT * FROM {0};", table.TableName);
    DataTable original = new DataTable();
    using (OleDbCommand cmd = new OleDbCommand(sql, dbConn)) {
      try {
        original.Load(cmd.ExecuteReader());
      } catch (Exception) { // table does not exist
      }
    }
    if (0 < original.Rows.Count) {
      sql = string.Format("DROP TABLE {0};", table.TableName);
      using (OleDbCommand cmd = new OleDbCommand(sql, dbConn)) {
        cmd.ExecuteNonQuery();
      }
    }
    // ****************
    // CODE NEEDED HERE
    // ****************
  } finally {
    if ((initState & ConnectionState.Open) != ConnectionState.Open) {
      dbConn.Close();
    }
  }
}

DROP TABLE命令执行后(在CODE NEEDED HERE部分中,我需要以某种方式将信息插入DataTable

如果我没有任何类型的主键,列名或列数据类型,我将如何插入表?

OleDbParameter具有AddWithValue方法,该方法允许添加数据而不必知道数据类型。 是否有类似的东西可以用来转储整个DataTable(或DataSet)?

c# excel oledb
1个回答
13
投票

这里是static class,我通过合并我发现或开发的各种代码而构建而成。您需要注意的主要方法是ExportToExcelOleDb,在给定DataSet和连接字符串的情况下,会将DataSet写到您选择的Excel文件中,格式为DataSet

[请注意,访问引擎存在一种“错误”,即访问引擎写入Excel的方式-在写入Excel工作簿时它不能保留数据类型,这意味着所有数据类型都以ExcelTEXT/ [ C0]。无论如何,这是...

STRING

我希望这对您有用。

注。我知道这种答案很不满意,但是我花了一些时间来开发这个答案,最终没有用,而是转移到COM / interop。不分享实在可惜!

© www.soinside.com 2019 - 2024. All rights reserved.