Excel文件上传并导入Sqlserver数据库
前台页面代码:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ImportUsers.aspx.cs" Inherits="SystemMang_UserMang_ImportUsers" %>
2
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head runat="server">
6 <title>导入用户</title>
7 <link href="http://www.cnblogs.com/Public/css/yg_style.css" rel="stylesheet" type="text/css" />
8 <link href="http://www.cnblogs.com/Public/css/main.css" rel="stylesheet" type="text/css" />
9 </head>
10 <body>
11 <form id="form1" runat="server">
12 <div id="tanc">
13 <div id="tanc_top">
14 <div id="tanc_top_left">
15 <!--<img src="http://www.cnblogs.com/Public/Images/chuangx_t_57.jpg" width="41" height="25" align="absmiddle" />-->
16 <span>导入用户</span>
17 </div>
18 <div id="tanc_top_right">
19 </div>
20 </div>
21 <table width="100%" style="height: 200px">
22 <tr>
23 <td colspan="2" nowrap="nowrap" align="center">
24 导入文件:<input id="fileImport" runat="server" type="file" />
25 </td>
26 <td style="width: 20px">
27 </td>
28 </tr>
29 <tr>
30 <td colspan="2" align="center">
31 <asp:Label ID="lblReturn" runat="server"></asp:Label>
32 </td>
33 </tr>
34 <tr>
35 <td>
36 </td>
37 </tr>
38 <tr>
39 <td colspan="4" align="center">
40 <div id="divLog" runat="server" style="width: 450px; height: 150px; overflow: scroll">
41 </div>
42 </td>
43 <td>
44 </td>
45 <td>
46 </td>
47 </tr>
48 </table>
49 <div id="tanc_down">
50 <table>
51 <tr>
52 <td align="center">
53 <asp:Button ID="btnImport" runat="server" CssClass="button_load" Text="导入" OnClick="btnImport_Click" />
54 </td>
55 </tr>
56 </table>
57 </div>
58 </div>
59 </form>
60 </body>
61 </html>
后台代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data;
using Microsoft.PILMS.WebBase;
using Microsoft.PILMS.Common;
using Ifmsoft.Framework.Data; //zi ding yi
using Microsoft.PILMS.BLL.SystemManagment;//zi ding yi
protected void btnImport_Click(object sender, EventArgs e)
{
// 检查导入文件
if (!CheckFile())
{
return;
}
//如果上传文件夹不存在 创建文件夹
string sDir = System.Configuration.ConfigurationManager.AppSettings["UpLoad"].ToString();
string downLoad = System.Configuration.ConfigurationManager.AppSettings["UpLoad"].ToString();
///上传路径
if (!Directory.Exists(sDir))
{
Directory.CreateDirectory(sDir);
}
if (!Directory.Exists(downLoad))
{
Directory.CreateDirectory(downLoad);
}
// 获得导入文件路径 转换格式 f Full date & time December 10, 2002 10:11 PM
string filePath = sDir+ DateTime.Now.ToFileTime().ToString("f") + ".xls";
fileImport.PostedFile.SaveAs(filePath); //获得客户端上传的内容并保存到filePath指定的路径
// 获得导入用户信息数据集
DataTable dt = new DataTable();
dt = Ifmsoft.Framework.Data.ExcelHelper.ExecuteDataTable(Ifmsoft.Framework.Data.ExcelHelper.GetExcelConnection(filePath, true, Ifmsoft.Framework.Data.ExcelHelper.ImportMixedType.Text), "Sheet1");
// 开始导入用户
string userList = "";
string errorContent = string.Empty;
try
{
//errorContent表示错误内容
userList = new UserMangBLL().BatchInsertUserInfo(dt, downLoad,ref errorContent);
}
catch (Exception ex)
{
ShowMessage(ex.Message);
return;
}
if (!errorContent.Equals(""))
{
lblReturn.Text = userList;
divLog.Visible = true;
divLog.InnerText = "导入失败:";
divLog.InnerHtml += "<table border='1'>" + errorContent + "</table>";
}
else
{
divLog.Visible = false;
lblReturn.Text = "导入完了。";
}
}
/// <summary>
/// 检查导入文件是否正确
/// </summary>
/// <returns>true:文件正确 false:文件错误</returns>
private bool CheckFile()
{
string filePath = fileImport.PostedFile.FileName;
// 导入文件是否存在
if (filePath.Equals(""))
{
ShowMessage("请选择导入文件。");
return false;
}
// 文件类型是否为xls
String fileExtension = Path.GetExtension(filePath).ToString().ToLower();
if (!fileExtension.Equals(".xls"))
{
ShowMessage("只能导入EXCEL文件。");
return false;
}
return true;
}
ExcelHelper代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data.OleDb;
using System.Data;
//using Ifmsoft.Framework.Common;
//using Ifmsoft.Framework.ExceptionHandling;
namespace Ifmsoft.Framework.Data
{
public enum ExcelEdition
{
Excel97,
Excel2000,
Excel2003,
Excel2007
}
public class ExcelHelper
{
private ExcelHelper() { }
/// <summary>
/// 获得Excel连接串
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="edition">Excel版本号</param>
/// <returns>Excel连接串</returns>
private static string CreateConnection(string filePath, ExcelEdition edition)
{
switch (edition)
{
case ExcelEdition.Excel97:
return " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath +
";Extended Properties=Excel 5.0";
case ExcelEdition.Excel2000:
return " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath +
";Extended Properties=Excel 8.0";
case ExcelEdition.Excel2003:
return " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath +
";Extended Properties=Excel 8.0";
case ExcelEdition.Excel2007:
return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath +
";Extended Properties=\"Excel 12.0;HDR=YES\"";
default:
return " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + filePath +
";Extended Properties=Excel 8.0";
}
}
/// <summary>
/// 格式化工作表名称“[sheet1$]”
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="sheetName">工作表名称</param>
/// <returns></returns>
public static string FormatSheetName(string sheetName)
{
return "[" + sheetName + "$]";
}
/// <summary>
/// 读取Excel文件到Dataset
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件路径</param>
/// <param name="edition">Excel版本号</param>
/// <returns></returns>
public static DataSet ExecuteDataset(string filePath, ExcelEdition edition)
{
return ExecuteDataset(filePath, "[sheet1$]", edition);
}
/// <summary>
/// 读取Excel文件到Dataset
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件路径</param>
/// <param name="sheetName">工作表名</param>
/// <param name="edition">Excel版本号</param>
/// <returns></returns>
public static DataSet ExecuteDataset(string filePath, string sheetName, ExcelEdition edition)
{
if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(sheetName))
{
throw new ArgumentNullException("参数不能为空");
}
if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在");
string connectionString = CreateConnection(filePath, edition);
string commandText = " SELECT * FROM " + sheetName;
DataSet ds = new DataSet();
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
using (OleDbDataAdapter da = new OleDbDataAdapter(commandText, connection))
{
da.Fill(ds, sheetName);
connection.Close();
}
}
return ds;
}
/// <summary>
/// 读取Excel文件到DataTable
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件路径</param>
/// <param name="edition">Excel版本号</param>
/// <returns></returns>
public static DataTable ExecuteDataTable(string filePath, ExcelEdition edition)
{
return ExecuteDataTable(filePath, "[sheet1$]", edition);
}
/// <summary>
/// 读取Excel文件到DataTable
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件路径</param>
/// <param name="sheetName">工作表名</param>
/// <param name="edition">Excel版本号</param>
/// <returns></returns>
public static DataTable ExecuteDataTable(string filePath, string sheetName, ExcelEdition edition)
{
//ValidationManager.ArgumentNotNullOrEmpty(filePath, "filePath");
//ValidationManager.ArgumentNotNullOrEmpty(sheetName, "sheetName");
if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(sheetName))
{
throw new ArgumentNullException("参数不能为空");
}
if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在");
string connectionString = CreateConnection(filePath, edition);
string commandText = " SELECT * FROM " + sheetName;
DataTable dt = new DataTable();
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
using (OleDbDataAdapter da = new OleDbDataAdapter(commandText, connection))
{
da.Fill(dt);
connection.Close();
}
}
return dt;
}
/// <summary>
/// 写入Excel文档(需有符合格式的文件模板)
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件名称</param>
/// <param name="dt">数据源</param>
/// <param name="edition">Excel版本信息</param>
public static string DataTableToExcel(string filePath, string outputDirectory, DataTable dt, ExcelEdition edition)
{
return DataTableToExcel(filePath, outputDirectory, "[sheet1$]", GetColumnNames(dt), dt, edition);
}
/// <summary>
/// 写入Excel文档(需有符合格式的文件模板)
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件名称</param>
/// <param name="sheetName">工作表名称</param>
/// <param name="dt">数据源</param>
/// <param name="edition">Excel版本信息</param>
public static string DataTableToExcel(string filePath, string outputDirectory, string sheetName,
DataTable dt, ExcelEdition edition)
{
return DataTableToExcel(filePath, outputDirectory, sheetName, GetColumnNames(dt), dt, edition);
}
/// <summary>
/// 写入Excel文档(需有符合格式的文件模板)
/// </summary>
/// <remarks>
/// 履 历:
/// NO 日期 版本 姓名 内容
/// 1 2008/10/06 V0L01 IFM)于鹏 初版
/// </remarks>
/// <param name="filePath">文件名称</param>
/// <param name="sheetName">工作表名称</param>
/// <param name="columnNames">列名</param>
/// <param name="dt">数据源</param>
/// <param name="edition">Excel版本信息</param>
public static string DataTableToExcel(string filePath, string outputDirectory, string sheetName,
string columnNames, DataTable dt, ExcelEdition edition)
{
//参数检查
if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(sheetName) || string.IsNullOrEmpty(outputDirectory))
{
throw new ArgumentNullException("参数不能为空");
}
if (!Directory.Exists(outputDirectory)) throw new DirectoryNotFoundException("目录不存在");
//if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在");
if (File.Exists(filePath))
{
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo.Attributes.ToString().IndexOf("ReadOnly") != -1)
{
try
{
fileInfo.Attributes = FileAttributes.Normal;
}
catch (Exception)
{
throw new ArgumentException("改变文件只读属性时出错,请手动去掉模板文件的只读属性");
}
}
}
else
{
throw new FileNotFoundException("文件不存在");
}
if (null == dt) return null;
//根据模板生成文件
string destFileName = CopyFromTemplate(filePath, outputDirectory);
//根据Excel版本生成连接串
string connectionString = CreateConnection(destFileName, edition);
OleDbTransaction transaction = null;
OleDbCommand cmd = null;
OleDbConnection connection = null;
try
{
connection = new OleDbConnection(connectionString);
//创建工作区格式
CreateSheet(connection, sheetName, columnNames);
if (connection.State != ConnectionState.Open) connection.Open();
transaction = connection.BeginTransaction(); //开启事务
cmd = new OleDbCommand();
cmd.Connection = connection;
cmd.Transaction = transaction;
foreach (DataRow row in dt.Rows)
{
//插入记录
cmd.CommandText = GetInsertRecordString(dt, row, sheetName);
cmd.ExecuteNonQuery();
}
transaction.Commit(); //提交事务
}
catch (Exception ex)
{
transaction.Rollback(); //回滚事务
connection.Close();
if (File.Exists(destFileName))
File.Delete(destFileName); //删除Excel文件
//包装异常再次抛出
throw new ApplicationException("写入Excel失败");
//throw ExceptionManager.WrapExcepion(ex, "写入Excel失败," + ex.Message, typeof(ExcelAccessException));
}
finally
{
cmd.Dispose();
transaction.Dispose();
connection.Dispose();
}
return destFileName;
}
///// <summary>
///// 写入Excel文档(需有符合格式的文件模板)
///// </summary>
///// <remarks>
///// 履 历:
///// NO 日期 版本 姓名 内容
///// 1 2008/10/06 V0L01 IFM)于鹏 初版
///// </remarks>
///// <param name="filePath">文件名称</param>
///// <param name="sheetName">工作表名称</param>
///// <param name="columnNames">列名</param>
///// <param name="dt">数据源</param>
///// <param name="edition">Excel版本信息</param>
//public static void DataTableToExcel(string filePath, string outputDirectory, string sheetName,
// string columnNames, DataTable dt, ExcelEdition edition)
//{
// //参数检查
// //ValidationManager.ArgumentNotNullOrEmpty(filePath, "filePath");
// //ValidationManager.ArgumentNotNullOrEmpty(outputDirectory, "outputDirectory");
// //ValidationManager.ArgumentNotNullOrEmpty(sheetName, "sheetName");
// if (!File.Exists(filePath)) throw new FileNotFoundException("文件不存在");
// if (!Directory.Exists(outputDirectory)) throw new DirectoryNotFoundException("目录不存在");
// if (null == dt) return;
// //根据模板生成文件
// string destFileName = CopyFromTemplate(filePath, outputDirectory);
// //根据Excel版本生成连接串
// string connectionString = CreateConnection(destFileName, edition);
// OleDbTransaction transaction = null;
// OleDbCommand cmd = null;
// OleDbConnection connection = null;
// try
// {
// connection = new OleDbConnection(connectionString);
// //创建工作区格式
// CreateSheet(connection, sheetName, columnNames);
// if (connection.State != ConnectionState.Open) connection.Open();
// transaction = connection.BeginTransaction(); //开启事务
// cmd = new OleDbCommand();
// cmd.Connection = connection;
// cmd.Transaction = transaction;
// foreach (DataRow row in dt.Rows)
// {
// //插入记录
// cmd.CommandText = GetInsertRecordString(dt, row, sheetName);
// cmd.ExecuteNonQuery();
// }
// transaction.Commit(); //提交事务
// }
// catch (Exception ex)
// {
// transaction.Rollback(); //回滚事务
// connection.Close();
// if (File.Exists(destFileName))
// File.Delete(destFileName); //删除Excel文件
// //包装异常再次抛出
// //throw ExceptionManager.WrapExcepion(ex, "写入Excel失败," + ex.Message, typeof(ExcelAccessException));
// }
// finally
// {
// cmd.Dispose();
// transaction.Dispose();
// connection.Dispose();
// }
//}
/// <summary>
/// 获取 Excel 连接对象
/// (用于读取 Excel 2000 及更高版本文件)。
/// </summary>
/// <param name="fullPath">文件的完全路径。</param>
/// <param name="firstRowAsHeader">是否将第一行作为表头处理。</param>
/// <param name="modeValue">Excel 导入混合类型,通常使用 ImportMixedType.Text。</param>
/// <returns>Excel 连接对象。</returns>
public static OleDbConnection GetExcelConnection(string fullPath, bool firstRowAsHeader, ImportMixedType modeValue)
{
return GetExcelConnection(fullPath, firstRowAsHeader, modeValue, ExcelVersion.Excel8);
}
/// <summary>
/// 获取 Excel 连接对象。
/// </summary>
/// <param name="fullPath">文件的完全路径。</param>
/// <param name="firstRowAsHeader">是否将第一行作为表头处理。</param>
/// <param name="modeValue">Excel 导入混合类型,通常使用 ImportMixedType.Text。</param>
/// <param name="excelVersionNumber">Excel 文件版本号。</param>
/// <returns>Excel 连接对象。</returns>
public static OleDbConnection GetExcelConnection(string fullPath, bool firstRowAsHeader, ImportMixedType modeValue, ExcelVersion excelVersionNumber)
{
if (fullPath == null)
throw new ArgumentNullException("fullPath", "参数值不能为空引用。");
if (fullPath.Trim() == string.Empty)
throw new ArgumentException("参数值不能为空字符串。", "fullPath");
if (!File.Exists(fullPath))
throw new FileNotFoundException(string.Format("访问给定路径下的文件失败。文件路径:{0}", fullPath));
string hdrString = "No";
if (firstRowAsHeader)
{
hdrString = "Yes";
}
string excelVersionString = string.Empty;
switch (excelVersionNumber)
{
case ExcelVersion.Excel5:
excelVersionString = "Excel 5.0";
break;
case ExcelVersion.Excel8:
excelVersionString = "Excel 8.0";
break;
}
// 构造连接字符串
string connectionString = string.Format(@"
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source={0};
Extended Properties=""{1};HDR={2};IMEX={3};""
", fullPath, excelVersionString, hdrString, modeValue);
return new OleDbConnection(connectionString);
#region Excel 连接串详解
//
// Connection String -- 连接字符串
//
// # 在书写连接字符串须十分仔细,因为如果连接串中存在错误,
// Jet Engine 不会给出恰当的错误细节。
//
// # Syntax 语法如下:
// Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<Full Path of Excel File>; Extended Properties="Excel 8.0; HDR=No; IMEX=1"
//
//
// Extended Properties -- 扩展属性
//
// # Excel <Excel 8.0/Excel 5.0>
// 指定 Excel Sheet 的版本。
// 对于 Excel 2000 及更高版本,应选用 Excel 8.0;
// 对于其他版本,应选用 Excel 5.0。
//
// # HDR= <Yes/No>
// 该属性用于为各列指定列头。
// 若该值为 Yes,则首行被作为列头处理;
// 若该值为 No,则由系统自动产生列头,形如:F1, F2 等。
//
// # IMEX= <0/1/2>
// IMEX 指 IMport EXport mode。该属性具有三种可能的值。
//
// * IMEX=0 和 IMEX=2 将导致 ImportMixedTypes 的值被忽略而使用 ‘Majority Types’ 的缺省值。
// 这种情况下,将获取前 8 行数据及其各列的数据类型。
//
// * IMEX=1 是将 ImportMixedTypes 值设置为 Text 类型的唯一方式。
// 这样,每样东东都被作为文本处理。
//
//
// 以上信息参考:
// http://www.codeproject.com/useritems/Excel_Connectivity.asp
//
#endregion Excel 连接串详解
}
/// <summary>
/// 读取给定连接给定表的内容至 DataTable。
/// </summary>
/// <param name="cn">给定连接</param>
/// <param name="sheetName">给定 WorkSheet 的名称</param>
/// <returns>包含给定 Sheet 数据的 DataTable</returns>
public static System.Data.DataTable ExecuteDataTable(OleDbConnection cn, string sheetName)
{
System.Data.DataTable dt = null;
if (sheetName == null)
throw new ArgumentNullException("sheetName", "参数值不能为空引用。");
if (sheetName.Trim() == string.Empty)
throw new ArgumentException("参数值不能为空字符串。", "sheetName");
string queryString = string.Format("SELECT * FROM [{0}$]", sheetName);
dt = new System.Data.DataTable(sheetName);
OleDbDataAdapter da = new OleDbDataAdapter(queryString, cn);
da.Fill(dt);
return dt;
}
#region 私有方法
/// <summary>
/// 根据模板创建副本
/// </summary>
/// <param name="filePath">原始文件路径</param>
/// <param name="outputDirectory">输入路径</param>
/// <returns>新文件路径</returns>
private static string CopyFromTemplate(string filePath, string outputDirectory)
{
FileInfo file = new FileInfo(filePath);
string destFileName = Path.Combine(outputDirectory, file.Name.Replace(file.Extension, string.Empty) +
"-" + DateTime.Now.ToString("yyyy-MM-dd") + "(" + Guid.NewGuid() + ")" + file.Extension);
File.Copy(filePath, destFileName);
return destFileName;
}
/// <summary>
/// 创建工作区
/// </summary>
/// <param name="connection">OleDB连接</param>
/// <param name="sheetName">工作区名称</param>
/// <param name="columnNames">列名</param>
private static void CreateSheet(OleDbConnection connection, string sheetName, string columnNames)
{
string createTableScript = GetCreateTableString(sheetName, columnNames.Split(','));
connection.Open();
using (OleDbCommand cmd = new OleDbCommand(createTableScript, connection))
{
cmd.ExecuteNonQuery();
}
connection.Close();
}
/// <summary>
/// 获得创建工作区格式脚本
/// </summary>
/// <param name="sheetName">工作区名称</param>
/// <param name="names">列名</param>
/// <returns>创建脚本</returns>
private static string GetCreateTableString(string sheetName, string[] names)
{
StringBuilder sb = new StringBuilder();
sb.Append(string.Format("CREATE TABLE {0} (", sheetName));
for (int i = 0; i < names.Length; i++)
{
if (i == names.Length - 1)
sb.Append(string.Format("{0} VARCHAR(100))", names[i]));
else
sb.Append(string.Format("{0} VARCHAR(100),", names[i]));
}
return sb.ToString();
}
/// <summary>
/// 获得插入记录脚本
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="row">当前数据行</param>
/// <returns>插入记录脚本</returns>
private static string GetInsertRecordString(DataTable dt, DataRow row, string sheetName)
{
StringBuilder sb = new StringBuilder();
sb.Append(string.Format("INSERT INTO {0} VALUES(", sheetName));
for (int i = 0; i < dt.Columns.Count; i++)
{
if (i == dt.Columns.Count - 1)
sb.Append(string.Format("'{0}')", row[i].ToString().Replace("'", "''")));
else
sb.Append(string.Format("'{0}',", row[i].ToString().Replace("'", "''")));
}
return sb.ToString();
}
/// <summary>
/// 获得列名
/// </summary>
/// <param name="dt">数据源</param>
/// <returns>全部列名</returns>
private static string GetColumnNames(DataTable dt)
{
StringBuilder sb = new StringBuilder();
foreach (DataColumn column in dt.Columns)
{
sb.Append(string.Format("[{0}],", column.ColumnName));
}
string columnNames = sb.ToString().TrimEnd(',');
return columnNames;
}
#endregion
#region 枚举
/// <summary>
/// Excel 导入混合类型。
/// </summary>
public enum ImportMixedType
{
/// <summary>
/// 多值(数)类型 0,慎用此值!
/// </summary>
Majority0 = 0,
/// <summary>
/// 文本类型,通常使用该值。
/// </summary>
Text = 1,
/// <summary>
/// 多值(数)类型 2,慎用此值!
/// </summary>
Majority2 = 2
}
/// <summary>
/// Excel 文件版本。
/// 读取 Excel 2000 及更高版本文件时应选用 Excel8;
/// 读取其他版本文件时均选用 Excel5。
/// </summary>
public enum ExcelVersion
{
/// <summary>
/// 读取低于 Excel 2000 的版本文件时应选用此值。
/// </summary>
Excel5 = 0,
/// <summary>
/// 读取 Excel 2000 及更高版本文件时应选用此值。
/// </summary>
Excel8 = 1
}
#endregion 枚举
}
}
BatchInsertUserInfo方法代码:
#region 批量导入用户信息
/// <summary>
/// 批量导入用户信息
/// </summary>
/// <param name="dt">导入用户数据集</param>
/// <returns>没有成功导入用户AccountId列表</returns>
public string BatchInsertUserInfo(DataTable dt,string downLoad,ref string fileName)
{
StringBuilder unsuccessUserList = new StringBuilder();
DataSet ds = new DataSet();
//导入的总行数
int allRows = dt.Rows.Count;
//导入失败行数
int falRows = 0;
for (int i = 0; i < allRows; i++)
{
//// 检查班级和小组是否为空 为空返回true
//bool boolval = false ;
////判断模板中每列的字符串为空 如果为空 不去导入这条用户信息
//for (int col = 0; col < dt.Columns.Count; col++)
//{
// if (dt.Rows[i][col].ToString().Trim() == string.Empty)
// {
// boolval = true;
// break;
// }
//}
//if (boolval)
//{
// falRows++;
// //输入数据为空 不插入这行
// // 把导入失败的用户AccountID加入到返回结果集中
// unsuccessUserList.Append("<tr><td>" + dt.Rows[i]["UserName"].ToString() + " コンテンツに空値を入力されました " + "</td></tr>");
// // 跳出本次循环
// continue;
//}
// 检查用户名是否已经存在
bool returnVal = CheckUserNameExist(dt.Rows[i]["UserName"].ToString().Trim());
if (!returnVal)
{
falRows++;
//输入数据为空 不插入这行
// 把导入失败的用户AccountID加入到返回结果集中
unsuccessUserList.Append("<tr><td>" + dt.Rows[i]["UserName"].ToString() + " 已存在" + "</td></tr>");
// 跳出本次循环
continue;
}
//// 检查用户部门是否存在
//以逗号拆分班和组字串
//string[] arrClassTeam = dt.Rows[i]["ClassNameTeamName"].ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
//bool boolct = false;
//boolct = CheckUserClassTeamRepeat(arrClassTeam);
//if (!boolct)
//{
// //定义两个数组 一个装班级名称 一个装小组名称
// string[] arrClass = new string[arrClassTeam.Length];
// string[] arrTeam = new string[arrClassTeam.Length];
// SplitStringToArray(arrClass, arrTeam, arrClassTeam);
// //去库中检验是否存在班级名和小组名称
// ds = GetClassIDAndTeamID(arrClass, arrTeam);
// //如果班级名称、小组名称 与 查询出来的班ID 和组ID长度一致 说明班名称和组名称没错
// if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
// {
// if (ds.Tables[0].Rows.Count == arrClass.Length)
// {
// boolct = false;
// }
// else
// {
// boolct = true;
// }
// }
// else
// {
// boolct = true;
// }
//}
//判断用户是否重复 模板中的每一项是否为空 模板中班级和小组是否正确
//if(boolct)
//{
// falRows++;
// // 把导入失败的用户AccountID加入到返回结果集中
// unsuccessUserList.Append("<tr><td>" + dt.Rows[i]["UserName"].ToString() + " ご入力されたクラスまたはグループ情報が不正です" + "</td></tr>");
// // 跳出本次循环
// continue;
//}
//**********************
//注释掉讨论区同步
//**********************
//try
//{
// 获得用户数据实体
UserMangEntity entity = new UserMangEntity();
#region 用户基本信息
entity.UserName = dt.Rows[i]["UserName"].ToString();
//讨论区中密码明文
string passWord = dt.Rows[i]["Password"].ToString();
///密码加密出理
SHA1Managed shaPassWord = new SHA1Managed();
byte[] hashPassWord = shaPassWord.ComputeHash(Encoding.UTF8.GetBytes(dt.Rows[i]["Password"].ToString()));
entity.Password = Convert.ToBase64String(hashPassWord);
entity.UserStatus = 1; //启用
entity.UserType = int.Parse(dt.Rows[i]["UserTypeID"].ToString());
entity.OUKeyID = dt.Rows[i]["OUKeyID"].ToString().Trim();
DataSet getOUds = GetOUNameByCode(entity);//根据导入的OUKeyID获得组织名称
entity.ProvinceID = "500000";
entity.CityID = "500000";
entity.County = "500000";
entity.UserActualName = dt.Rows[i]["Name"].ToString();
entity.EMail = dt.Rows[i]["Email"].ToString();
#endregion
#region 后台用户基本信息,保持同步 add 姜浩 2011/11/11
entity.OPAdminUserName=dt.Rows[i]["UserName"].ToString();
entity.OPAdminUserPassword=Convert.ToBase64String(hashPassWord);
entity.OPActualName = dt.Rows[i]["Name"].ToString();
entity.OPStatus = 1;
entity.OPRemark = "default";
entity.OPAdminType = 0;
#endregion
// //同步讨论区
// int WSUserType = entity.UserType > 0 ? 3 : 0; //学生是0 教师是1
// ForumWSDL ncservice = new ForumWSDL();
// ncservice.Url = System.Configuration.ConfigurationManager.AppSettings["ForumService.ForumWSDL"];
bool flag = true;
// try
// {
// flag = ncservice.RegisterUsers(entity.UserName, passWord, entity.EMail, WSUserType);
// }
// catch(Exception ex)
// {
// //unsuccessUserList = ex.Message;
// //同步失败
// }
//
if (!flag)
{
//失败
unsuccessUserList.Append("<tr><td>" + dt.Rows[i]["UserName"].ToString() + " 与网络上公告栏的数据相同,请稍后再试。" + "</td></tr>");
continue;
}
// 检查所属部门是否存在或为空,默认导入根级别
bool returnOUVal = CheckOUNameExist(entity.OUKeyID);
if (!returnOUVal)
{
entity.OUID = GlobalConst.RootOUID;
DataSet OUds = GetOUName(entity);
entity.OUName = OUds.Tables[0].Rows[0][0].ToString();
entity.OUIsPrimary = "0";
int result = 0;
result = InsertStudentUserInfo(entity, ds);
//输入数据为空 不插入这行
// 把导入的用户AccountID加入到返回结果集中
unsuccessUserList.Append("<tr><td>" + dt.Rows[i]["UserName"].ToString() + " 用户已经导入,但所属部门不存在,其所属机构挂在"+ OUds.Tables[0].Rows[0][0].ToString() + "</td></tr>");
continue;
}
//添加用户信息
else
{
entity.OUName = getOUds.Tables[0].Rows[0][0].ToString();
entity.OPDepartment = getOUds.Tables[0].Rows[0][0].ToString();
DataSet OUds = GetOUID(entity);
entity.OUID = OUds.Tables[0].Rows[0][0].ToString();
entity.OUIsPrimary = "0";
int result = 0;
result = InsertStudentUserInfo(entity, ds);
//if (result < 1)
//{
// //删除讨论区用户
// ncservice.DeleteUser(entity.UserName);
//}
}
//}
//catch (Exception ex)
//{
// WriteError(ex.Message,downLoad);
// // 把导入失败的用户AccountID加入到返回结果集中
// unsuccessUserList.Append("<tr><td>" + dt.Rows[i]["UserName"].ToString() + " インポート失敗 " + "</td></tr>");
// // 跳出本次循环
// continue;
//}
}
WriteError(unsuccessUserList.ToString(),downLoad);
fileName = unsuccessUserList.ToString();
return "导入用户 " + allRows.ToString() + "人、成功 " + (allRows - falRows).ToString() + " 人、失敗 " + falRows.ToString() + "人";
}
#endregion