由于项目中加入了新的功能,可以使管理员向数据库中导入Excel数据。因此,在商品管理这块需要对Excel进行 *** 作,在网上查了些资料,根据项目的实际情况进行了一定的优化,这里简单的介绍下。
1C#代码。
<span style="font-family:Microsoft YaHei;font-size:18px;">/// <summary>
/// 上传Excel文件,并将数据导入到数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lbtnSure_Click(object sender, EventArgs e)
{
// 定义变量,并赋初值
string url = thisfileUpLoadPostedFileFileName;
string urlLocation = "";
// 判断传输地址是否为空
if (url == "")
{
// 提示“请选择Excel文件”
PageClientScriptRegisterStartupScript(PageGetType(), "message", "<script defer>alert('请选择97~2003版Excel文件!');</script>");
return;
}
// 判断获取的是否为地址,而非文件名
if (urlIndexOf("\\") > -1)
{
// 获取文件名
urlLocation = urlSubstring(urlLastIndexOf("\\") + 1);//获取文件名
}
else
{
// url为文件名时,直接获取文件名
urlLocation = url;
}
// 判断指定目录下是否存在文件夹,如果不存在,则创建
if (!DirectoryExists(ServerMapPath("~\\up")))
{
// 创建up文件夹
DirectoryCreateDirectory(ServerMapPath("~\\up"));
}
//在系统中建文件夹up,并将excel文件另存
thisfileUpLoadSaveAs(ServerMapPath("~\\up") + "\\" + urlLocation);//记录文件名到服务器相对应的文件夹中
// ResponseWrite(urlLocation);
// 取得保存到服务器端的文件路径
string strpath = ServerMapPath("~\\up") + "\\" + urlLocation;
// 取得config中的字段
string connectionString = ConfigurationManagerAppSettings["Connect"]ToString();
string strCon = ConfigurationManagerAppSettings["strUpLoad"]ToString();
// 替换变量
strCon = strConReplace("$Con$", strpath);
// 初始化导入Excel对象
ImportExcel excel = new ImportExcel();
// 调用方法,将Excel文件导入数据库
excelTransferData(strCon, "t_Goods", connectionString);
}</span>
2TransferData类。
<span style="font-family:Microsoft YaHei;font-size:18px;">public void TransferData(string strCon, string sheetName, string connectionString)
{
DataSet ds = new DataSet();
try
{
//获取全部数据
OleDbConnection conn = new OleDbConnection(strCon);
connOpen();
string strExcel = "";
OleDbDataAdapter myCommand = null;
strExcel = stringFormat("select from [{0}$]", sheetName);
myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommandFill(ds, sheetName);
//如果目标表不存在则创建,excel文件的第一行为列标题,从第二行开始全部都是数据记录
string strSql = stringFormat("if not exists(select from sysobjects where name = '{0}') create table {0}(", sheetName); //以sheetName为表名
foreach (SystemDataDataColumn c in dsTables[0]Columns)
{
strSql += stringFormat("[{0}] varchar(255),", cColumnName);
}
strSql = strSqlTrim(',') + ")";
using (SystemDataSqlClientSqlConnection sqlconn = new SystemDataSqlClientSqlConnection(connectionString))
{
sqlconnOpen();
SystemDataSqlClientSqlCommand command = sqlconnCreateCommand();
commandCommandText = strSql;
commandExecuteNonQuery();
sqlconnClose();
}
//用bcp导入数据
//excel文件中列的顺序必须和数据表的列顺序一致,因为数据导入时,是从excel文件的第二行数据开始,不管数据表的结构是什么样的,反正就是第一列的数据会插入到数据表的第一列字段中,第二列的数据插入到数据表的第二列字段中,以此类推,它本身不会去判断要插入的数据是对应数据表中哪一个字段的
using (SystemDataSqlClientSqlBulkCopy bcp = new SystemDataSqlClientSqlBulkCopy(connectionString))
{
bcpSqlRowsCopied += new SystemDataSqlClientSqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcpBatchSize = 100;//每次传输的行数
bcpNotifyAfter = 100;//进度提示的行数
bcpDestinationTableName = sheetName;//目标表
bcpWriteToServer(dsTables[0]);
}
}
catch (Exception ex)
{
throw new Exception(ex);
}
}
//进度显示
void bcp_SqlRowsCopied(object sender, SystemDataSqlClientSqlRowsCopiedEventArgs e)
{
}
} </span>
4Web界面样式。
服务器硬件上没什么特别的要求,内存稍微高点,4核CPU,硬盘有个2TB也就够了,其它都是次要的。至于配置,建议安装Windows server2008服务器专用 *** 作系统+SQL2008数据库,这样性能比较高。(系统和数据库文件,通用Excel网有下载的)
其它的软件上没有什么要求。1、打开要导入的Excel文件,观察第一列是为字段还是数据
打开SQLServer,在需要导入的数据点击右键 任务-导入数据出现导入导出向导。
点击下一步 ,进入选择数据源页面,注意红框设置。
点击下一步 ,进入选择目标页面,注意红框设置。
点击下一步 ,进入指定表复制或查询页面,注意红框设置。
点击下一步 ,进入选择源表和源视图页面,注意红框设置。
下一步,直到完成。出现执行结果页面。
最后在SqlServer查询表。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)