- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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() 方法中创建/使用工作表的方式。
附言我见过一个类似的问题,但问题似乎是 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();
}
}
创建文件
Initialize("C:\\path\\to\\file\\Test File.xls", "ListingDetails");
插入测试行
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 对象的代码。这可能给您带来了问题,我不确定,但这样至少您知道一切都已正确完成。
希望这对您有所帮助。
关于c# - OleDb 没有从 excel 文件中读取所有行,尽管使用 IMEX=1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523549/
我正在尝试将 xls 导出到数据表中。下面是我的连接字符串。 string path = //xls source path OleDbConnection MyConnection = new Ol
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX
我已经阅读了很多关于此的帖子,但我无法让它发挥作用。我正在导入地址电子表格。邮政编码列包含 5 位邮政编码、9 位邮政编码和 5-4 个邮政编码(5 位数字、破折号和 4 位数字)的组合。 (抱歉,我
我使用以下代码读取 xls 文件: private static DataSet GetDataSetFromExcelFilePath(string filePath) { try
我在 C# 中使用 Microsoft.ACE.OLEDB.12.0 驱动程序来读取和写入 excel 文件 (XLS)。我的阅读器的扩展属性如下所示:Excel 8.0;HDR=NO;IMEX=1;
我正在创建一个 ACCESS 应用程序,其中一个步骤是将数据从 Excel 电子表格导入数据库。一切正常,但是,如果有不同类型的值(即字符串、数字),ACCESS 只会导入一种类型。 Excel 电子
我使用下面的连接字符串与 ACE.OLEDB.12.0 从 XLSX 电子表格读取数据,但是我设置 IMEX=1,它不起作用,而当我完全删除 IMEX=1 时,它工作正常。 "Provider=Mic
我是一名优秀的程序员,十分优秀!