我在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 ,并创建一个新的 output.xls 文件并使用我的编写器写入它 . 现在我在MS Excel中打开文件 output.xls ,然后再添加几行 .
接下来,我将 output.xls 作为输入提供给我的程序,当我调试时,我看到它只读取最初使用OleDb编写的行 . 它不会读取我添加的任何新行,并且写入器会读出已读取的行 .
这是OleDb的工作原理吗?即将数据库视为由其锁定,并且不重视外部插入 . 或者我是如何创建和保存文件的?
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();
}
关闭文件,我只是做 conn.Close();
我在某种程度上怀疑我在Initialize()方法中创建/使用工作表的方式 .
附:我已经看到了类似的问题,但问题似乎是数据和IMEX标志没有被设置为1.我先告诉你,这不是一个重复的问题 .
谢谢
1 回答
我使用下面的代码,这实际上是对代码的简化,但稍作修改 . 它每次都有效,我甚至可以打开Excel并在执行代码时观察插入的行 . 然后,我可以对文件进行编辑,然后在文件仍处于打开状态时将它们加载到数据网格中,而不会保存更改 .
使用创建文件
插入测试行
我清理了围绕创建和处理OleDb对象的代码 . 这可能对你造成了问题,我不确定,但这种方式至少你知道一切都已经完成了 .
希望这可以帮助 .