• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#数据保存到Excel

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

C#将数据保存到Excel时,数据需要保持原来的类型,而不是简单的分为数字和文本将数据保存。

public static bool SaveByOLEDB(DataTable dt, string path)
		{
			bool success = true;

			string connStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + path + ";Extended Properties=Excel 8.0;";//仅支持2003格式的Excel
			OleDbConnection conn = new OleDbConnection(connStr);
			OleDbCommand cmd = new OleDbCommand();
			cmd.Connection = conn;
			cmd.CommandType = CommandType.Text;
			try
			{
				conn.Open();
				string cmdText = "Create Table sheet1 (";

				for(int i = 0; i < dt.Columns.Count; i++)
				{
					string columnName = dt.Columns[i].ColumnName;
					cmdText += " "+ columnName;
					string typeName =GetExcelMapDataType(dt.Columns[i].DataType.Name);
					cmdText += " "+ typeName;
					if(i == dt.Columns.Count - 1)
					{
						cmdText += ")";
					}
					else
					{
						cmdText += ",";
					}
				}

				cmd.CommandText = cmdText;
				cmd.ExecuteNonQuery();

				for (int i = 0; i < dt.Rows.Count; i++)
				{
					cmdText = "Insert into sheet1 values (";
					for (int j = 0; j < dt.Columns.Count; j++)
					{
						string columnName = dt.Columns[j].ColumnName;
						cmdText += "@" + columnName;
						cmd.Parameters.AddWithValue("@" + columnName, dt.Rows[i][columnName]);
						if (j == dt.Columns.Count - 1)
						{
							cmdText += ")";
						}
						else
						{
							cmdText += ",";
						}
					}
					cmd = new OleDbCommand(cmdText, conn);
					for (int j = 0; j < dt.Columns.Count; j++)
					{
						string columnName = dt.Columns[j].ColumnName;
						string columnType = dt.Columns[j].DataType.Name;
						if(columnType.ToLower() == "datetime")
						{
							OleDbParameter pm = new OleDbParameter();
							pm.ParameterName = "@" + columnName;
							pm.OleDbType = OleDbType.Date;
							pm.Value = dt.Rows[i][columnName];
							cmd.Parameters.Add(pm);

							continue;
						}
						cmdText += "@" + columnName;
						cmd.Parameters.AddWithValue("@" + columnName, dt.Rows[i][columnName]);
					}

					cmd.ExecuteNonQuery();
				}

				

			}
			catch(Exception ex)
			{

			}
			finally
			{
				conn.Close();
				conn.Dispose();
			}
			return success;
		}

  一些特殊类型需要转为OLEDB兼容的数据类型。

static string GetExcelMapDataType(string dataType)
		{
			string result = dataType;
			switch (dataType.ToLower())
			{
				case "int":
				case "int32":
					result = "INTEGER";
					break;
				case "datetime":
					result = "DATE";
					break;
				case "boolean":
					result = "bit";
					break;
				default:
					break;
			}

			return result;
		}

  附Excel的数据类型

在进行转换时OLEDB作为中间层实现了C#数据类型和Excel数据类型的映射,但是C#数据类型转为OLEDB数据类型这儿需要自己处理。

图片截取自:https://www.promotic.eu/en/pmdoc/Subsystems/Db/Excel/DataTypes.htm

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#Hashtable、HashSet和Dictionary的区别发布时间:2022-07-18
下一篇:
为DEVC++/CodeBlock配置gdb调试遇到的问题发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap