【问题标题】:Add apostrophe character to Excel export with OleDB connection使用 OleDB 连接将撇号字符添加到 Excel 导出
【发布时间】:2017-02-23 08:36:56
【问题描述】:

我想生成与我们之前使用的相同的 Excel 报告(使用旧版本的 Excel)。唯一的问题是旧式报告中的所有单元格都显示为带有撇号字符的字符串:

我用下面的代码创建了基本相同的报告:

oleDbConnection = new System.Data.OleDb.OleDbConnection(
            "provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
            fileFullPath +  
            ";Extended Properties='Excel 12.0 Xml;HDR=YES' ");
oleDbConnection.Open();
oleDbCommand.Connection = oleDbConnection;

string commandHeader = String.Join("] char(255), [", headers);
commandHeader = "[" + commandHeader + "]";
commandHeader = "CREATE TABLE data (" + commandHeader + " char(255))";

oleDbCommand.CommandText = commandHeader;
oleDbCommand.ExecuteNonQuery();

foreach (var item in exportList)
{
     string line = String.Join("\",\"\'", new string[] {item.Foreman_ID, item.DateApp.Date.ToString("yyyyMMdd"), item.TimeApp,
     item.Employee_ID, item.ProductionOrder, item.OperationNumber,
     item.ConfirmationNumber, item.date.Date.ToString("yyyyMMdd"), item.TotalHours.ToString("0.000").Replace(",", "."), item.SalaryType, item.TimeType,
     item.ExtraPrice.ToString("0.00").Replace(",", "."), item.ExtraHours, item.ActualPC, item.PcPriceSplit, item.CostCenter});
     line = line.Replace(" ", String.Empty);
     line = "\"\'" + line + "\"";

     oleDbCommand.CommandText = "Insert into data values(" + line + ")";
     oleDbCommand.ExecuteNonQuery();
}

oleDbConnection.Close();

此代码生成相同的行,其中每个单元格都以撇号字符开头。但是如果我打开生成的 Excel,我仍然会看到我的撇号:

如果我按下单元格然后按回车键,那么这个撇号就会消失。

【问题讨论】:

  • wer 是行中的 pblm ,oleDbCommand.CommandText = "Insert into data values(" + line + ")";是否显示错误
  • 不,该行正常工作。报告已生成,但与之前使用的报告看起来不同。在新报告中,单元格中仍然可以看到撇号字符。
  • 您是否尝试过在 \"\'\'" 等位置的实际单引号字符之前删除反斜杠?
  • 我认为在代码中有些你试图在此处放置两个字符串(')(\'\'),那就是它来了
  • string line = String.Join("\",\"\'\'", new string[] {item.Foreman_ID, item.DateApp.Date.ToString("yyyyMMdd"), item.TimeApp, 检查此行并清除一个'

标签: c# excel oledb export-to-excel


【解决方案1】:

根据我上面的评论:您不需要将' 显式添加到要插入的每个单元格值中。

相反,您应该从INSERT .. VALUES (...) 语句中删除前导' 字符,并通过添加IMEX=0IMEX=2 来更改您的连接字符串:

oleDbConnection = new System.Data.OleDb.OleDbConnection(
            "provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
            fileFullPath +  
            ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=0' ");

请参阅What is the default value of IMEX in OLEDB? 问题以了解更多IMEX 讨论。

还有提到的与IMEX 相关的MSFT KB article。从那篇文章中,IMEX 的可能设置是:

0 是导出模式 - 用于写入/插入 Excel 文件
1 是导入模式 - 用于从 Excel 文件中读取
2 是链接模式(完整的更新能力)

请注意,描述完整 IMEX 行为的原始完整 MSFT 文档仍有待找到。

【讨论】:

  • 谢谢,这有帮助。请注意,这仍然不适用于 12.0 版本,仅适用于旧版本,所以我必须使用这种类型的字符串 provider=Microsoft.Jet.OLEDB.4.0;Data Source=...;Extended Properties='Excel 8.0;HDR=YES;IMEX=0'
  • @Serbin 嗯,它也应该适用于 v12。尝试更多地尝试使用 IMEX,也许将其设置为 2。但是,我记得为每一列获取正确的类型,我还在标题行下方创建了一个隐藏行,并在其中插入了字符串列的虚拟字符串和 0 INT 列。然后我用 v12 和 IMEX=0 让一切正常工作。您能否在您的问题中添加export-to-excel 标签?谢谢。
【解决方案2】:

听起来您想做与 Format=Text 相同的事情。

formatRange.NumberFormat = "@";

这会将指定范围的格式设置为文本格式。

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 2018-07-18
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多