【问题标题】:I am getting invalid sheetnames from Excel files using OleDb. What's wrong?我正在使用 OleDb 从 Excel 文件中获取无效的工作表名称。怎么了?
【发布时间】:2011-12-15 09:24:56
【问题描述】:

我尝试使用 oledb 获取 excel 工作表名称。

我的连接字符串是:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
filepath + 
";Extended Properties=Excel 12.0;";

filepath 是一个文件名。

我的代码:

List<string> sheetNames = new List<string>();
_excel.Connect(_path);
DataTable dataTable = _excel.ExecuteSchema();
_excel.Disconnect();
foreach (DataRow row in dataTable.Rows)
{
    string sheetName = row["TABLE_NAME"].ToString();
    if(!sheetName.EndsWith("$'")) { continue; }
    sheetNames.Add(sheetName);
 }

带有工作表名称的列表包含所有有效工作表名称和一些其他工作表名称。 示例:

  • "'correctsheetname$'"
  • "'correctsheetname$'Print_Area"

我只添加以$' 结尾的工作表

我的问题是,如果工作表名称包含单引号,我会用两个单引号得到它。

示例: 对于名为asheetname's 的工作表,我得到'asheetname''s$''

之后,当我尝试获取此工作表的数据源时,我收到此工作表不存在的异常。

query = "SELECT * FROM ['asheetname''s$']"
_command = new OleDbCommand(query, _connection);
_dataTable = new DataTable();
_dataReader = _command.ExecuteReader();   <-- Exception is thrown here

还有异常信息:

{System.Data.OleDb.OleDbException: ''asheetname''s$'' is not a valid name. Make sure that it does not include invalid characters or punctuation and that it is not too long. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.OleDb.OleDbCommand.ExecuteReader() at PrestaImporter.Entity.Excel.ExecuteQuery(String query)

【问题讨论】:

  • 使用方法判断名称是否包含引号,然后提取名称中多余的引号。
  • 还有其他字符需要替换吗?

标签: c# oledb


【解决方案1】:

这应该可以工作

"SELECT * FROM [" + asheetname + "$]"

如果没有,请尝试在字符串变量 asheetname 中手动输入工作表名称 - 它应该会打开。

"SELECT * FROM ["SHEET_NAME"$]"

【讨论】:

  • //Cmd.CommandText = "从 [sheet1$] 中选择 *"; //不起作用,但以下对我有用,我的工作表名称是“普通人”Cmd.CommandText =“SELECT * FROM [”+“普通人”+“$]”;
【解决方案2】:

使用不包含空格的工作表名称.. 前任。我的床单:这是个糟糕的选择.. 我的表格:它有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多