详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeak
///根据上传的excel文件获得数据表
public static DataTable GetExcelTable(System.Web.UI.WebControls.FileUpload FileUploadControl, string savepath = "uploadfiles\\FileUpload")
{
DataTable dtAccess = null;
string savefilename = FileUploadControl.FileName;
string absolutePath = HttpRuntime.AppDomainAppPath.ToString() + savepath;
if (!Directory.Exists(absolutePath))
{
Directory.CreateDirectory(absolutePath);
}
FileUploadControl.SaveAs(absolutePath + "\\" + savefilename);
if (File.Exists(absolutePath + "\\" + savefilename))
{
DataTable ExcelDt = new DataTable();
string exefile = Path.GetExtension(savefilename).ToUpper();
string filename = savefilename;
string sUploadPath1 = absolutePath;
DataSet dsAccess = new DataSet();
if (exefile == ".MDB")
{
DbFileMapDataSet obj = new DbFileMapDataSet(sUploadPath1 + filename, filename, LogicLayer.DbFileMapDataSet.TableType.MDB);//调用PutInDataSet类
dsAccess = obj.Convert();//转换到DataSet中
}
if (exefile == ".DBF")
{
DbFileMapDataSet obj = new DbFileMapDataSet(sUploadPath1, filename, LogicLayer.DbFileMapDataSet.TableType.DBF);//调用PutInDataSet类 // .DBF
dsAccess = obj.Convert();//转换到DataSet中
}
if (exefile == ".XLS")
{
DbFileMapDataSet obj = new DbFileMapDataSet(sUploadPath1, filename, LogicLayer.DbFileMapDataSet.TableType.XLS);//调用PutInDataSet类
dsAccess = obj.Convert();//转换到DataSet中
}
if (exefile == ".XLSX")
{
DbFileMapDataSet obj = new DbFileMapDataSet(sUploadPath1, filename, LogicLayer.DbFileMapDataSet.TableType.XLSX);//调用PutInDataSet类
dsAccess = obj.Convert();//转换到DataSet中
}
if (exefile == ".XML")
{
DbFileMapDataSet obj = new DbFileMapDataSet(sUploadPath1, filename, LogicLayer.DbFileMapDataSet.TableType.XML);//调用PutInDataSet类
dsAccess = obj.Convert();//转换到DataSet中
}
dtAccess = dsAccess.Tables[0];
}
return dtAccess;
}
DbFileMapDataSet类代码如下面:
using System;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data;
using System.Collections;
using System.Text;
using System.IO;
using System.Data.SqlClient;
namespace Logss
{
/// <summary>
/// DbFileMapDataSet 的摘要说明。
/// </summary>
public class DbFileMapDataSet
{
/// <summary>
/// 传入的文件变量
/// </summary>
private DataSet my_Ds;//存放文件的数据集
// private string my_Err;//错误信息
private string my_TableName;//传入的文件名
private TableType my_TableType;//传入的文件类型
private string my_TablePath;//传入的文件路径
// private int my_TableIndex;//表的索引
OleDbCommandBuilder my_Builder;//命令串
private string my_DbfTemplatePath;//DBF模版存放路径
/// <summary>
/// 数据库连接变量
/// </summary>
private string my_StrConnection;//连接字符串
private string my_StrSelect;//select语句
/// <summary>
/// 可以处理的文件类型
/// </summary>
public enum TableType
{
MDB, XLS, XLSX, DBF, VFPDBF, DOC, TXT, XML, HTML
}
public DbFileMapDataSet(string TablePath,string TableName,TableType TableType)
{
///<summary>
///获得传入的路径,文件名及文件类型;
///</summary>
this.my_TablePath=TablePath;//路径
this.my_TableName=TableName;//文件名
this.my_TableType=TableType;//文件类型
}
public DbFileMapDataSet(string TablePath, string TableName, TableType TableType, string DbfTemplatePath)
{
///<summary>
///获得传入的路径,文件名及文件类型;
///</summary>
this.my_TablePath = TablePath;//路径
this.my_TableName = TableName;//文件名
this.my_TableType = TableType;//文件类型
this.my_DbfTemplatePath = DbfTemplatePath;//模版路径
}
public DataSet Convert()
{
DataSet iRtn_Ds=new DataSet();
switch (this.my_TableType)
{
case TableType.VFPDBF:
iRtn_Ds = this.VFPDbfToDs();
break;
case TableType.DBF:
iRtn_Ds = this.DbfToDs();
break;
case TableType.MDB:
iRtn_Ds = this.MdbToDs();
break;
case TableType.XLS:
iRtn_Ds = this.XlsToDs();
break;
case TableType.XML:
iRtn_Ds = this.XmlToDs();
break;
}
return iRtn_Ds;
}
public bool Convert(DataSet ds)
{
bool returnvalue = false;
switch (this.my_TableType)
{
case TableType.DBF:
returnvalue = this.DsToDbf(ds);
break;
case TableType.XLS:
returnvalue = this.DsToXls(ds);
break;
}
return returnvalue;
}
/// <summary>
/// 将DataTable导出至DBF模版
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public bool Convert(DataTable dt)
{
bool returnvalue = false;
switch (this.my_TableType)
{
case TableType.DBF:
returnvalue = this.DtToDbf(dt);
break;
}
return returnvalue;
}
/// <summary>
/// 将DataTable导出至指定DBF模版
/// </summary>
/// <param name="dt">内存中数据的一个表</param>
/// <param name="dbftemplatePath">指定DBF模版所在路径</param>
/// <returns></returns>
private bool DtToDbf(DataTable dt)
{
//删除文件
try
{
File.Delete(this.my_TablePath + this.my_TableName + ".dbf");
File.Copy(this.my_DbfTemplatePath + this.my_TableName + ".dbf", this.my_TablePath + this.my_TableName + ".dbf");
}
catch { }
//数据库连接定义
OdbcConnection my_conn; //数据连接
OdbcCommand my_Command;
OdbcDataAdapter my_Adapter;//数据适配器
//数据库连接
this.my_StrConnection = "Driver={Microsoft dBASE Driver (*.dbf)}; DriverID=277;Dbq=" + this.my_TablePath;
this.my_StrSelect = "SELECT * FROM " + this.my_TableName;
my_conn = new OdbcConnection(this.my_StrConnection);
my_Command = new OdbcCommand("", my_conn);
try
{
my_conn.Open();
my_Adapter = new OdbcDataAdapter(this.my_StrSelect, my_conn);
this.my_Ds = new DataSet();
//填充数据集
my_Adapter.Fill(this.my_Ds, this.my_TableName);
string[] ColumnName = new string[my_Ds.Tables[0].Columns.Count];
//my_Command.CommandText = "DELETE ALL ";
//my_Command.ExecuteNonQuery();
//my_Command.CommandText = "PACK ";
//my_Command.ExecuteNonQuery();
int i = 0;
foreach (DataRow dr in dt.Rows)
{
i = 0;
my_Command.CommandText = "insert into " + this.my_TableName + "(";
foreach (System.Data.DataColumn column in my_Ds.Tables[0].Columns)
{
my_Command.CommandText += column.ColumnName + ",";
ColumnName[i] = column.ColumnName;
i++;
}
my_Command.CommandText = my_Command.CommandText.Substring(0, my_Command.CommandText.Length - 1) + ") values ( ";
for (i = 0; i < ColumnName.Length; i++)
{
my_Command.CommandText += "'" + dr[ColumnName[i].ToString()].ToString() + "',";
}
my_Command.CommandText = my_Command.CommandText.Substring(0, my_Command.CommandText.Length - 1) + ") ";
my_Command.ExecuteNonQuery();
}
return true;
}
catch (Exception ex)
{
string a = ex.Message;
return false;
}
finally
{
my_conn.Close();
}
}
///<sumary>
///将dataset数据导入到excel中
///</sumary>
private bool DsToXls(DataSet ds)
{
try
{
File.Delete(this.my_TablePath + this.my_TableName + ".xls");
}
catch { }
//数据库连接定义
OleDbConnection my_conn; //数据连接
OleDbCommand my_Command;
//数据库连接
// this.my_StrConnection= "Microsoft Excel Driver (*.xls)};DriverId=790;Dbq="+this.my_TablePath;
this.my_StrConnection = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties=Excel 8.0;data source=" + this.my_TablePath + this.my_TableName + ".xls";
my_conn = new OleDbConnection(this.my_StrConnection);
my_conn.Open();
// try
// {
my_Command = new OleDbCommand("", my_conn);
//删除文件
// try
// {
// File.Delete(this.my_TablePath+this.my_TableName+".xls" );
// }
// catch{}
Int32[] columnSize = new Int32[ds.Tables[0].Columns.Count];
Int32[] rowSize = new Int32[ds.Tables[0].Rows.Count];
int i = 0;
//取字段最大长度
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
//数组初值
columnSize[i] = 0;
i++;
}
//取行数
i = 0;
foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
{
//数组初值
rowSize[i] = 0;
i++;
}
foreach (System.Data.DataRow dr1 in ds.Tables[0].Rows)
{
i = 0;
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
Byte[] a = Encoding.Unicode.GetBytes(dr1[column.ColumnName].ToString());
if (a.Length > columnSize[i])
{
columnSize[i] = a.Length;
}
i++;
}
}
//创建新表
my_Command.CommandText = " create table " + this.my_TableName + "( ";
System.Text.StringBuilder sql = new System.Text.StringBuilder();
i = 0;
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
if (columnSize[i] > 0)//
{
if (columnSize[i] > 220)
my_Command.CommandText += column.ColumnName + " varchar(220),";
else
my_Command.CommandText += column.ColumnName + " varchar(" + columnSize[i].ToString() + "),";
}
else
my_Command.CommandText += column.ColumnName + " varchar(20),";
i++;
}
my_Command.CommandText = my_Command.CommandText.Substring(0, my_Command.CommandText.Length - 1) + ")";
my_Command.ExecuteNonQuery();
// my_Command.CommandText = "delete from xj ";
// my_Command.ExecuteNonQuery();
foreach (System.Data.DataRow dr1 in ds.Tables[0].Rows)
{
my_Command.CommandText = "insert into " + this.my_TableName + " (";
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
my_Command.CommandText += column.ColumnName + ",";
}
my_Command.CommandText = my_Command.CommandText.Substring(0, my_Command.CommandText.Length - 1) + ") ";
my_Command.CommandText += " values( ";
i = 0;
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
my_Command.CommandText += "'" + dr1[column.ColumnName].ToString() + "',";
Byte[] a = Encoding.Unicode.GetBytes(dr1[column.ColumnName].ToString());
if (a.Length > columnSize[i])
columnSize[i] = a.Length;
i++;
}
my_Command.CommandText = my_Command.CommandText.Substring(0, my_Command.CommandText.Length - 1) + ") ";
my_Command.ExecuteNonQuery();
}
// i=0;
// foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
// {
// my_Command.CommandText = "ALTER TABLE "+this.my_TableName +" ALTER COLUMN "+column.ColumnName+" VARCHAR("+columnSize[i].ToString()+") ";
// my_Command.ExecuteNonQuery();
// i++;
// }
my_conn.Close();
return true;
}
/// <summary>
/// 将DataSet 表的内容导入到DBF
/// </summary>
/// <param name="ds"></param>
/// <returns></returns>
private bool DsToDbf(DataSet ds)
{
//数据库连接定义
OdbcConnection my_conn; //数据连接
OdbcCommand my_Command;
//数据库连接
this.my_StrConnection= "Driver={Microsoft dBASE Driver (*.dbf)}; DriverID=277;Dbq=" + this.my_TablePath;
my_conn = new OdbcConnection(this.my_StrConnection);
my_conn.Open();
// try
// {
my_Command = new OdbcCommand("",my_conn);
//删除文件
try
{
File.Delete(this.my_TablePath+this.my_TableName+".dbf" );
}
catch{}
Int32[] columnSize = new Int32[ds.Tables[0].Columns.Count];
Int32[] rowSize =new Int32[ds.Tables[0].Rows.Count];
int i=0;
//取字段最大长度
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
//数组初值
columnSize[i]=0;
i++;
}
//取行数
i=0;
foreach (System.Data.DataRow dr in ds.Tables[0].Rows)
{
//数组初值
rowSize[i]=0;
i++;
}
foreach (System.Data.DataRow dr1 in ds.Tables[0].Rows)
{
i=0;
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
Byte[] a = Encoding.Unicode.GetBytes(dr1[column.ColumnName].ToString());
if (a.Length>columnSize[i])
{
columnSize[i]=a.Length;
}
i++;
}
}
//创建新表
my_Command.CommandText =" create table "+this.my_TableName+"( ";
System.Text.StringBuilder sql=new System.Text.StringBuilder();
i=0;
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
if(columnSize[i]>0)//
{
if(columnSize[i]>220)
my_Command.CommandText += column.ColumnName+" varchar(220),";
else
my_Command.CommandText += column.ColumnName+" varchar("+columnSize[i].ToString()+"),";
}
else
my_Command.CommandText += column.ColumnName+" varchar(20),";
i++;
}
my_Command.CommandText=my_Command.CommandText.Substring(0,my_Command.CommandText.Length-1)+")";
my_Command.ExecuteNonQuery();
// my_Command.CommandText = "delete from xj ";
// my_Command.ExecuteNonQuery();
foreach (System.Data.DataRow dr1 in ds.Tables[0].Rows)
{
my_Command.CommandText = "insert into "+this.my_TableName+" (";
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
my_Command.CommandText += column.ColumnName+",";
}
my_Command.CommandText=my_Command.CommandText.Substring(0,my_Command.CommandText.Length-1)+") ";
my_Command.CommandText+=" values( ";
i=0;
foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
{
my_Command.CommandText += "'"+dr1[column.ColumnName].ToString()+"',";
Byte[] a = Encoding.Unicode.GetBytes(dr1[column.ColumnName].ToString());
if (a.Length>columnSize[i])
columnSize[i]=a.Length;
i++;
}
my_Command.CommandText=my_Command.CommandText.Substring(0,my_Command.CommandText.Length-1)+") ";
my_Command.ExecuteNonQuery();
}
// i=0;
// foreach (System.Data.DataColumn column in ds.Tables[0].Columns)
// {
// my_Command.CommandText = "ALTER TABLE "+this.my_TableName +" ALTER COLUMN "+column.ColumnName+" VARCHAR("+columnSize[i].ToString()+") ";
// my_Command.ExecuteNonQuery();
// i++;
// }
my_conn.Close();
return true;
}
///<summary>
///将DBF文件放入DataSet
///</summary>
private DataSet DbfToDs()
{
//数据库连接定义
OdbcConnection my_conn; //数据连接
OdbcDataAdapter my_Adapter;//数据适配器
//数据库连接
this.my_StrConnection= "Driver={Microsoft dBASE Driver (*.dbf)}; DriverID=277;Dbq=" + this.my_TablePath;
//this.my_StrConnection= "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + this.my_TablePath;
this.my_StrSelect="SELECT * FROM " + this.my_TableName;
my_conn = new OdbcConnection(this.my_StrConnection);
try
{
my_conn.Open();
my_Adapter = new OdbcDataAdapter(this.my_StrSelect,my_conn);
this.my_Ds=new DataSet();
//填充数据集
my_Adapter.Fill(this.my_Ds,this.my_TableName);
my_conn.Close();
}
catch
{
return VFPDbfToDs();
}
finally
{
my_conn.Close();
}
return this.my_Ds;
}
///<summary>
///将VFPDBF文件放入DataSet
///</summary>
private DataSet VFPDbfToDs()
{
//数据库连接定义
OdbcConnection my_conn; //数据连接
OdbcDataAdapter my_Adapter;//数据适配器
//数据库连接
this.my_StrConnection= "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + this.my_TablePath;
this.my_StrSelect="SELECT * FROM " + this.my_TableName;
my_conn = new OdbcConnection(this.my_StrConnection);
my_conn.Open();
my_Adapter = new OdbcDataAdapter(this.my_StrSelect,my_conn);
this.my_Ds=new DataSet();
//填充数据集
my_Adapter.Fill(this.my_Ds,this.my_TableName);
my_conn.Close();
return this.my_Ds;
}
///<summary>
///将MDB文件放入DataSet
///</summary>
private DataSet MdbToDs()
{
//数据库连接定义
OleDbConnection my_conn;
OleDbDataAdapter my_Adapter;
//数据库连接
this.my_StrConnection= "Provider=Microsoft.JET.OLEDB.4.0;data source=" + this.my_TablePath;
this.my_StrSelect="SELECT * FROM " + this.my_TableName;
my_conn = new OleDbConnection(this.my_StrConnection);
my_conn.Open();
my_Adapter = new OleDbDataAdapter(this.my_StrSelect,my_conn);
this.my_Ds=new DataSet();
//填充数据集
my_Adapter.Fill(this.my_Ds,this.my_TableName);
my_conn.Close();
return this.my_Ds;
}
///<summary>
///将XML文件放入DataSet
///</summary>
private DataSet XmlToDs()
{
//填充数据集
this.my_Ds=new DataSet();
this.my_Ds.ReadXml(this.my_TablePath+this.my_TableName,XmlReadMode.ReadSchema);
this.my_Ds.DataSetName="XmlData";
return this.my_Ds;
}
///<summary>
///将Excel文件放入DataSet
///</summary>
private DataSet XlsToDs()
{
OleDbConnection my_conn;
OleDbDataAdapter my_Adapter;
//数据库连接
//this.my_StrConnection= "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties=Excel 8.0;data source="+this.my_TablePath+this.my_TableName;
this.my_StrConnection = "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties=Excel 8.0;data source=" + (this.my_TablePath.EndsWith("\\") ? (this.my_TablePath) : (this.my_TablePath + "\\")) + this.my_TableName;
this.my_StrSelect="SELECT * FROM [SHEET1$]";
my_conn = new OleDbConnection(this.my_StrConnection);
my_conn.Open();
my_Adapter = new OleDbDataAdapter(this.my_StrSelect,my_conn);
this.my_Builder=new OleDbCommandBuilder(my_Adapter);
this.my_Ds=new DataSet();
//填充数据集
my_Adapter.Fill(this.my_Ds,"ExcelData");
my_conn.Close();
return this.my_Ds;
}
public static string CreateTempTable(DataTable UpLoadData, string TableName, string nd)
{
string CreateTmpTableName = "";
string StrSql = "";
TableName = TableName + nd;
int i = 0;
//如果该表已存在先删除该表
if (DataBaseExecute.SysDropTable(TableName))
{
//Int32[] columnSize = new Int32[UpLoadData.Columns.Count];
//string[] columnType = new string[UpLoadData.Columns.Count];
//取字段最大长度
//foreach (System.Data.DataColumn column in UpLoadData.Columns)
//{
// //数组初值
// columnSize[i] = 0;
// i++;
//}
//i = 0;
//foreach (System.Data.DataColumn column in UpLoadData.Columns)
//{
// //数组初值
// columnType[i] =(column.DataType as Type).ToString();
// i++;
//}
//动态计算表字段大小
//foreach (System.Data.DataRow dr1 in UpLoadData.Rows)
//{
// i = 0;
// foreach (System.Data.DataColumn column in UpLoadData.Columns)
// {
// //检查字符串的字符是否是中文
// int j = 0;
// for (int n = 0; n < dr1[column.ColumnName].ToString().Length; n++)
// {
// Regex rx = new Regex("^[\u4e00-\u9fa5]$");
// if (rx.IsMatch(dr1[column.ColumnName].ToString().Substring(n, 1)))
// {
// j = j + 2;
// }
// else
// {
// j = j + 1;
// }
// }
// if (j > columnSize[i])
// {
// columnSize[i] = j*2;
// }
// i++;
// }
//}
//if (columnSize.Length > 0)
//{
StrSql = " create table " + TableName + "( ";
i = 0;
foreach (System.Data.DataColumn column in UpLoadData.Columns)
{
//if (columnSize[i] > 0)//
//{
// StrSql += column.ColumnName + " varchar(" + columnSize[i].ToString() + "),";
//}
//else
StrSql += column.ColumnName + " varchar(300),";
i++;
}
StrSql = StrSql.Substring(0, StrSql.ToString().Length - 1) + ")";
//}
if (DataBaseExecute.SysCreateTable(StrSql))//创建临时表成功
{
//批量数据上传
SqlConnection conn = new SqlConnection(DbConfig.GetSetting());
conn.Open();
//SqlTransaction tran = conn.BeginTransaction();
SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(conn);
//指定目标数据库的表名
bcp.DestinationTableName = TableName;
bcp.BatchSize = 1000;
bcp.BulkCopyTimeout = 60;
//写入数据库表 dt 是数据源DataTable
try
{
bcp.WriteToServer(UpLoadData);
CreateTmpTableName = TableName;
bcp.Close();
}
catch (Exception ex)
{
bcp.Close();
}
conn.Close();
conn.Dispose();
}
}
else
{
//删除表出现异常
}
return CreateTmpTableName;
}
public static DataTable TableColumnInfo(string TableName)
{
DataTable dt = null;
dt = DataBaseExecute.SysDataColumnInfo(TableName);
return dt;
}
public static DataTable TableColumnStandardInfo(string TableName)
{
DataTable dt = null;
dt = DataBaseExecute.SysColumnsStandard(TableName);
return dt;
}
public static DataTable TableColumnsJoinInfo(string TableName)
{
DataTable dt = null;
dt = DataBaseExecute.SysColumnsJoin(TableName);
return dt;
}
public static bool TableColumnsJoinAdd(string tablename, string orgname, string fintablename, string finname, string findes, string bz)
{
return DataBaseExecute.SysColumnsJoinAdd(tablename, orgname, fintablename, finname, findes, bz);
}
public static bool TableColumnsJoinDelete(string tablename)
{
return DataBaseExecute.SysColumnsJoinDelete(tablename);
}
public static bool TableExists(string tablename)
{
return DataBaseExecute.SysExistsTable(tablename);
}
//数据验证
public static DataTable TableDataCheck(string checktype, string orgtablename, string fintablename)
{
DataTable dt = null;
dt = DataBaseExecute.SysCheckData(checktype, orgtablename, fintablename);
return dt;
}
public static DataTable TableXslb()
{
DataTable dt = null;
dt = DataBaseExecute.SysXslb();
return dt;
}
}
}