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

时间:2012-05-14 21:54:48

标签: c# excel oledb

我今天遇到了使用此网站上的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)?

1 个答案:

答案 0 :(得分:13)

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

请注意,Access Engine写入Excel的方式存在“错误” - 在写入Excel工作簿时无法保留数据类型,这意味着所有数据类型都以Excel {{1}编写} / DataSet。无论如何它是......

TEXT

我希望这对你有用。

注意。我知道这种类型的答案是不受欢迎的,但我花了一些时间来开发它,最后没有用它 - 转而使用COM / interop。不分享是一种耻辱!