我在我的 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文件并使用我的 writer 写入它。现在我在 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() 方法中创建/使用工作表的方式。
PS 我看到了一个类似的问题,但问题似乎是数据和 IMEX 标志没有设置为 1。让我事先告诉你,这不是一个重复的问题。
谢谢