尽pipe使用IMEX = 1,OleDb不会读取Excel文件中的所有行

我在C#中使用Microsoft.ACE.OLEDB.12.0驱动程序来读取和写入Excel文件(XLS)。 我的阅读器的扩展属性如下所示: Excel 8.0; HDR = NO; IMEX = 1; 对于编写器看起来像: Excel 8.0; HDR = NO; IMEX = 0;

这是一个场景:我从一个excel文件中读取input.xls ,然后创build一个新的output.xls文件,并使用我的编写器写入。 现在我在MS Excel中打开文件output.xls ,并添加更多的行。

接下来,我将我的output.xls作为input提供给我的程序,当我debugging时,我发现它只读取最初使用OleDb写入的行。 它不读取我添加的任何新行,并且编写器将所读取的行吐出。

这是如何OleDb的作品? 即将数据库视为locking,并且不对外部插入赋值。 或者,我可以创build和保存文件吗?

private void Initialize(string fileName, FileType fileType) { string connectionString = GetConnectionString(fileName, fileType); string sheet; using (OleDbConnection connection = OpenConnection(connectionString)) { DataTable sheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); } tableName = "[ListingDetails]"; conn = new OleDbConnection(); conn.ConnectionString = connectionString; conn.Open(); cmd1 = new OleDbCommand(); cmd1.Connection = conn; cmd1.CommandText = string.Format(CultureInfo.InvariantCulture, @"CREATE TABLE {0} {1}", tableName, fieldstring); int x = cmd1.ExecuteNonQuery(); } public void InsertRow(string[] data) { StringBuilder fieldString = new StringBuilder(); fieldString.Append("("); foreach (var h in headers) { fieldString.Append(" ["+h+"], "); } fieldString.Remove(fieldString.Length - 2, 2); fieldString.Append(")"); StringBuilder dataString = new StringBuilder(); dataString.Append("('"); foreach (var d in data) { if(d!=null) dataString.Append(d.Replace("'", "''") + "', '"); else dataString.Append("', '"); } dataString.Remove(dataString.Length - 4, 4); dataString.Append("')"); cmd1.CommandText = string.Format(CultureInfo.InvariantCulture, @"INSERT INTO {0} {1} values {2}", tableName, fieldString, dataString); int x = cmd1.ExecuteNonQuery(); } 

closures文件,我只是做一个conn.Close();

我在某种程度上怀疑我在Initialize()方法中创build/使用工作表的方式。

PS我曾经见过类似的问题,但问题似乎有Data和IMEX标志没有设置为1.让我先告诉你,这不是一个重复的问题。

谢谢

我使用下面的代码,这是一个简单的代码,但有一些小的改变。 它每次都有效,我甚至可以打开Excel,并在执行代码时观察插入的行。 然后,我可以对文件进行编辑,随后将文件加载到数据网格中,同时文件仍处于打开状态,并且没有保存更改

 private void Initialize(string fileName, string tableName) { string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Mode=ReadWrite;Extended Properties=\"Excel 8.0;HDR=NO\""; string fieldstring = "(ID int, Field1 char(255), Field2 char(255))"; using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); using (OleDbCommand cmd = new OleDbCommand()) { cmd.Connection = conn; cmd.CommandText = string.Format(CultureInfo.InvariantCulture, @"CREATE TABLE [{0}] {1}", tableName, fieldstring); cmd.ExecuteNonQuery(); } conn.Close(); } } public void InsertRow(string fileName, string tableName, string data) { string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Mode=ReadWrite;Extended Properties=\"Excel 8.0;HDR=YES\""; string headers = "ID,Field1,Field2"; using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); using (OleDbCommand cmd = new OleDbCommand()) { cmd.Connection = conn; cmd.CommandText = string.Format(CultureInfo.InvariantCulture, @"INSERT INTO [{0}$] ({1}) values({2})", tableName, headers, data); txtQuery.Text = cmd.CommandText; cmd.ExecuteNonQuery(); } conn.Close(); } } 

使用创build文件

 Initialize("C:\\path\\to\\file\\Test File.xls", "ListingDetails"); 

插入testing行

 for (int i = 0; i < 10; i++) { InsertRow("C:\\path\\to\\file\\Test File.xls", "ListingDetails", "'" + i.ToString() + "','test" + (i + 2).ToString() + "','test" + (i + 5).ToString() + "'"); } 

我清理了围绕OleDb对象的创build和处理的代码。 这可能是你造成的问题,我不确定,但这样至less你知道一切都正常完成了。

希望这可以帮助。