使用 OleDB 连接将撇号字符添加到 Excel 导出
Add apostrophe character to Excel export with OleDB connection
我想生成与我们之前使用的相同的 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,那么我仍然看到我的撇号:
如果我按下单元格然后按下回车,那么这个撇号就会消失。
根据我上面的评论:您不需要将 '
显式添加到要插入的每个单元格值。
相反,您应该从 INSERT .. VALUES (...)
语句中删除前导 '
字符,并通过添加 IMEX=0
或 IMEX=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
讨论。
还有提到的 MSFT KB article 与 IMEX
相关。在那篇文章中,IMEX 的可能设置是:
0 is Export mode - use for writing-to/insertion-into Excel file
1 is Import mode - use for reading from Excel file
2 is Linked mode (full update capabilities)
请注意,描述完整 IMEX
行为的原始完整 MSFT 文档仍有待找到。
听起来你想做 Format=Text 做的事情。
formatRange.NumberFormat = "@";
这会将指定范围的格式设置为文本格式。
我想生成与我们之前使用的相同的 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,那么我仍然看到我的撇号:
如果我按下单元格然后按下回车,那么这个撇号就会消失。
根据我上面的评论:您不需要将 '
显式添加到要插入的每个单元格值。
相反,您应该从 INSERT .. VALUES (...)
语句中删除前导 '
字符,并通过添加 IMEX=0
或 IMEX=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
讨论。
还有提到的 MSFT KB article 与 IMEX
相关。在那篇文章中,IMEX 的可能设置是:
0 is Export mode - use for writing-to/insertion-into Excel file
1 is Import mode - use for reading from Excel file
2 is Linked mode (full update capabilities)
请注意,描述完整 IMEX
行为的原始完整 MSFT 文档仍有待找到。
听起来你想做 Format=Text 做的事情。
formatRange.NumberFormat = "@";
这会将指定范围的格式设置为文本格式。