zoukankan      html  css  js  c++  java
  • C# 数据保存到Excel

    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

  • 相关阅读:
    4-----flask快速入门
    2-----python 常用数据结构回顾以及推导式
    2-1 test 代码梳理,各个目录说明
    13----- sentry实现错误日志的监控
    2----生鲜超市 (开发环境搭建)
    2、虚拟环境
    1、DRF+VUE 项目架构
    jenkins介绍,Jenkins安装,Jenkins发布PHP代码
    dsad
    rest_framework自己总结的
  • 原文地址:https://www.cnblogs.com/andy-2014/p/11320527.html
Copyright © 2011-2022 走看看