使用OleDb写入excel

我试图将数据行从sql导出到excel但我的插入命令似乎每次都失败。 我花了很多时间试图创造这个,但我终于遇到了困难。

excel文档是由IRS生成的文档,我们不会大声修改第16行以上的任何内容。第16行是标题行,下面的所有内容都需要来自sql的数据。 标题名称都包含空格,这似乎是我遇到麻烦的地方。

从第16行开始,列名称为:参加者名字,参加者姓氏,参加者PTIN,计划编号,CE奖励计划,完成日期

这就是我试图写入excel的方式

private void GenerateReport() { FileInfo xlsFileInfo = new FileInfo(Server.MapPath(CE_REPORTS_PATH + CE_PTIN_TEMPLATE + EXTENSION)); string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes'", xlsFileInfo.FullName); //create connection OleDbConnection oleDBConnection = new OleDbConnection(connectionString); oleDBConnection.Open(); //create the adapter with the select to get OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$A16:F16]", oleDBConnection); // Create the dataset and fill it by using the adapter. DataTable dataTable = new DataTable(); adapter.FillSchema(dataTable, SchemaType.Source); adapter.Fill(dataTable); string[] colNames = new string[dataTable.Columns.Count]; string[] colParms = new string[dataTable.Columns.Count]; for (int i = 0; i < dataTable.Columns.Count; i++) { colNames[i] = String.Format("[{0}]", dataTable.Columns[i].ColumnName); colParms[i] = "?"; } // Create Insert Command adapter.InsertCommand = new OleDbCommand(String.Format("INSERT INTO [Sheet1$] ({0}) values ({1})", string.Join(",", colNames), string.Join(",", colParms)), oleDBConnection); // Create Paramaters for (int i = 0; i < dataTable.Columns.Count; i++) { OleDbParameter param = new OleDbParameter(String.Format("@[{0}]", dataTable.Columns[i].ColumnName), OleDbType.Char, 255, dataTable.Columns[i].ColumnName); adapter.InsertCommand.Parameters.Add(param); } // create a new row DataRow newCERecord = dataTable.NewRow(); // populate row with test data for (int i = 0; i < dataTable.Columns.Count; i++) { newCERecord[i] = "new Data"; } dataTable.Rows.Add(newCERecord); // Call update on the adapter to save all the changes to the dataset adapter.Update(dataTable); oleDBConnection.Close(); } 

调用adapter.Update(dataTable)时发生的错误如下所示

 $exception {"The INSERT INTO statement contains the following unknown field name: 'Attendee First Name'. Make sure you have typed the name correctly, and try the operation again."} System.Exception {System.Data.OleDb.OleDbException} 

这很令人沮丧,因为我直接从列名中拉出每个字段,如colNames [i] = String.Format(“[{0}]”,dataTable.Columns [i] .ColumnName)。 我发现我需要[]来考虑列名中的空格,但此时我不确定问题是什么。 当我查看excel文件时,一切似乎都是正确的。

我实际上为您找到了一篇完整代码的Microsoft文章 – 您可以复制并粘贴您最喜欢的解决方案。 这是链接:

http://support.microsoft.com/kb/306023

看起来像CopyRecordset是最简单的方法,虽然他们确实解释了我提到的那个(使用制表符分隔文件)。

编辑 :为了完整起见,这是我的原始答案。 请参阅上面的链接,了解更多详细信息以及可能的更好解决方案。

这不是您的问题的答案,而是改变您的方法的建议(如果可以的话)。 通过COM调用添加数据时Excel往往非常慢,我认为OleDB在内部使用COM。 根据我的经验,将数据输出到Excel的最快(并且巧合最痛苦的方法)是生成包含所有数据的制表符分隔文本文件,然后将文件导入Excel并使用COM互操作在工作表上执行任何格式化。 当我以这种方式生成Excel报表时,我生成的大多数报表的生成速度几乎比使用Excel COM对象模型快100倍。 (我不知道OleDB调用是否会相同,因为我从未在Excel中使用过OleDB,但我愿意打赌OleDB适配器在内部使用COM。)

这也会处理您的嵌入式空间问题,因为tab是列分隔符。

在您的特定情况下,我将文本文件导入Excel中的新工作表,然后将其复制并粘贴到IRS表中的正确位置。 完成后,可以删除临时表。

数据库表中的字段名称是什么? 你能提到它们以及excel标题列名吗?