如何解决如何在c#中使用OLEDB将混合数据类型数据表写入EXCEL
我有一个包含混合数据类型列的数据表(从 sql 查询中获取),需要在不更改数据类型的情况下将其写入 excel,这是我编写的代码,我取了一个示例数据表以供参考:
DataTable dtA = new DataTable();
dtA.Columns.Add("col1",typeof(string));
dtA.Columns.Add("col2",typeof(decimal));
dtA.Columns.Add("col3",typeof(DateTime));
dtA.Columns.Add("col4");
dtA.Rows.Add("VALUE1",23.3,"12-06-2021","VALUE4");
// Now I am trying to push this datatable into an excel with the same multiple datatypes format:
OleDbConnection objConn;
OleDbCommand objCmd;
OleDbDataAdapter objDatAdap = new OleDbDataAdapter();
string excelConnectString;
string reportspath =@"C:\Users\Report.xlsx";
excelConnectString = (@"Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1""").Replace("{0}",reportspath);
objConn = new OleDbConnection(excelConnectString);
try
{
objConn.open();
using (objCmd = new OleDbCommand())
{
objCmd.Connection = objConn;
List<keyvaluePair<string,string>> columnNamesFordtitems = new List<keyvaluePair<string,string>>();
foreach (DataColumn dataColumn in dtA.Columns)
{
columnNamesFordtitems.Add(new keyvaluePair<string,string>(dataColumn.ColumnName,dataColumn.DataType.ToString()));
}
string table = "test";
DataTable dtSheets = objConn.GetoleDbSchemaTable(OleDbSchemaGuid.Tables,null);
bool existsTable = dtSheets.Select().ToList().Exists(sheet => sheet["TABLE_NAME"].ToString() == table);
if (existsTable)
{
objCmd.CommandText = $"DROP TABLE [{table}];";
objCmd.ExecuteNonQuery();
}
//this is the original query in case of common datatype
// objCmd.CommandText = $"CREATE TABLE [{table}] ({String.Join(",",columnNamesFor11A.Select(c => $"[{c}] string").ToArray())});";
//how to do it in case of multiple datatype
objCmd.CommandText = $"CREATE TABLE [{table}] ({String.Join(",columnNamesFordtitems.Select(c => $"[{c.Key,(c.Value)}]").ToArray())});";
objCmd.ExecuteNonQuery();
foreach (DaTarow row in dtA.Rows)
{
List<String> rowValues = new List<string>();
foreach (DataColumn column in dt.Columns)
{
rowValues.Add((row[column] != null && row[column] != dbnull.Value) ? row[column].ToString() : String.Empty);
}
objCmd.CommandText = $"INSERT INTO [{table}]({String.Join(",columnNamesFordt.Select(c => $"[{c}]"))}) VALUES ({String.Join(",rowValues.Select(r => $"'{r}'").ToArray())});";
objCmd.ExecuteNonQuery();
}
任何建议或解决方案都会对我很有帮助。 提前致谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。