问题描述
我有一个包含混合数据类型列的数据表(从 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 (将#修改为@)