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 NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.Util;
using NPOI.HSSF.Util;
using System.Text;
using NPOI.HPSF;
using NPOI.SS.Formula.Functions;
using Telerik.Web.UI;
namespace VRS.Util
{
public partial class Import : BasePage
{
DataService.BLL.admin_user_role bllAUR = new DataService.BLL.admin_user_role();
DataService.BLL.admin_config bll_config = new DataService.BLL.admin_config();
DataService.BLL.base_major bll_major = new DataService.BLL.base_major();
DataService.BLL.pro_type_manage bll_type_manage = new DataService.BLL.pro_type_manage();
DataService.BLL.admin_user bll_user = new DataService.BLL.admin_user();
DataService.BLL.admin_school bll_school = new DataService.BLL.admin_school();
protected override void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
var user = DataService.BLL.admin_user.load_login();
var user_login = bll_user.GetModel(user.user_id);
if (null != user_login && user_login.role_id == "0")
{
tr_school.Visible = true;
BindSchool(dp_school, "");
}
}
}
protected void btnSure_Click(object sender, EventArgs e)
{
var user = DataService.BLL.admin_user.load_login();
var user_login = bll_user.GetModel(user.user_id);
var school_id = "";
if (null != user_login )
{
if (user_login.role_id == "0")
{
if (string.IsNullOrEmpty(dp_school.SelectedValue))
{
RadAjaxManager1.Alert("请选择学校!");
return;
}
school_id = dp_school.SelectedValue;
}
else
{
school_id = user_login.school_id;
}
}
if (fileUpload.UploadedFiles.Count > 0)
{
string dirPath = Server.MapPath("~/Upload/");
if (!Directory.Exists(dirPath))
Directory.CreateDirectory(dirPath);
string fileName = Guid.NewGuid().ToString() + fileUpload.UploadedFiles[0].GetExtension();
string savePath = dirPath + fileName;
fileUpload.UploadedFiles[0].SaveAs(savePath);
string cmd = Request.Params["cmd"];
string msg = "上传成功!";
bool state = false;
switch (cmd)
{
/*
case "ImportUsers"://导入用户
state = ImportUsers(savePath);
break;
case "ImportStudents"://导入学生
state = ImportStudents(savePath, out msg);
break;
case "ImportXueyuan"://导入学员
state = ImportXueyuan(savePath, out msg);
break;
*/
case "ImportSchoolStudents"://导入学校学生
state = ImportSchoolStudents(savePath, school_id, out msg);
if (File.Exists(savePath))
{
File.Delete(savePath);
}
break;
}
//if (state)
//msg = "上传成功!";
//msg = "上传成功,导入失败!";
RadAjaxManager1.ResponseScripts.Add("alert('" + msg + "');CloseAndRebind();");
}
else
{
RadAjaxManager1.Alert("请选择excel文件,再点击上传!");
}
}
///
/// 导入教员
///
///
private bool ImportUsers(string filePath)
{
try
{
var table = ExcelToDataTable(filePath, "", 0, true, false);
if (null != table)
{
DataService.BLL.admin_user bll = new DataService.BLL.admin_user();
for (int i = 0, len = table.Rows.Count; i < len; i++)
{
var row = table.Rows[i];
var userId = row["账号"].ToString();
var model = new DataService.Model.admin_user();
var isExists = false;
if (bll.ExistsByJobNumber(userId))
{
model = bll.GetModelByJobNumber(userId);
isExists = true;
}
//姓名、账号、性别、手机号码、备注
model.real_name = row["姓名"].ToString();
model.sex = row["性别"].ToString();
model.mobile = row["手机号码"].ToString();
model.r1 = row["备注"].ToString();
if (isExists)
{
bll.Update(model);
}
else
{
model.user_id = BasePage.GetNewId("AU");
model.password = BasePage.GetMD5("12345"); //默认12345
model.login_name = row["账号"].ToString();
model.job_number = row["账号"].ToString();
model.create_time = DateTime.Now;
var config = bll_config.GetModelList(" is_use =1 ").FirstOrDefault();
var app_key = config.app_key;
model.r2 = app_key;
bll.Add(model);
DataService.Model.admin_user_role model_user_role = new DataService.Model.admin_user_role();
model_user_role.user_role_id = BasePage.GetNewId("AUR");
model_user_role.user_id = model.user_id;
model_user_role.role_id = new DataService.BLL.admin_role().GetModelList(string.Format(" role_name = '教员' ")).First().role_id; //教员
bllAUR.Add(model_user_role);
}
}
return true;
}
}
catch { }
return false;
}
///
/// 导入学生 $$$$
///
///
private bool ImportStudents(string filePath, out string msg)
{
try
{
msg = "上传成功";
var table = ExcelToDataTable(filePath, "", 0, true, false);
if (null != table && table.Rows.Count > 1)
{
var list_dep_excel = new List();
var dep = string.Empty;
#region ===检查上传的字段====
for (int i = 0; i < table.Rows.Count; i++)
{
var row = table.Rows[i];
dep = row["部门"].ToString();
if (!string.IsNullOrWhiteSpace(dep))
{
if (!list_dep_excel.Contains(dep.Trim()))
{
list_dep_excel.Add(dep.Trim());
}
}
else
{
msg = "存在专业为空的记录,请检查上传文件";
return false;
}
#region 检查性别
var sex_name = row["性别"].ToString();
if (string.IsNullOrWhiteSpace(sex_name))
{
msg = "存在性别为空的记录,请检查上传文件";
return false;
}
#endregion
#region 身份证号
var id_card = row["身份证号"].ToString();
if (string.IsNullOrWhiteSpace(id_card))
{
msg = "存在身份证号为空的记录,请检查上传文件";
return false;
}
if (id_card.Length == 18 && !BasePage.Is_valid_idcard18(id_card))
{
msg = "18位身份证号码格式错误!错误身份证号: " + id_card;
return false;
}
#endregion
#region 检查姓名
var real_name = row["姓名"].ToString();
if (string.IsNullOrWhiteSpace(real_name))
{
msg = "存在姓名为空的记录,请检查上传文件";
return false;
}
#endregion
}
#endregion
var major_list = bll_type_manage.GetModelList(string.Format(" parent_id = 'sign_dep' "));
List error_major = new List();
foreach (var item in list_dep_excel)
{
var model = major_list.FirstOrDefault(s => s.type_name == item);
if (null == model)
{
error_major.Add(item);
}
}
if (error_major.Count > 0)
{
msg = "请先在部门管理模块配置部门,以下部门不存在:" + string.Join(",", error_major.ToArray());
return false;
}
int insertCount = 0;
int updateCount = 0;
DataService.BLL.admin_user bll = new DataService.BLL.admin_user();
for (int i = 0, len = table.Rows.Count; i < len; i++)
{
var row = table.Rows[i];
var id_card = row["身份证号"].ToString().Trim();
var model = new DataService.Model.admin_user();
var isExists = false;
if (bll.ExistsByIdcard(id_card))
{
model = bll.GetModelByIdcard(id_card);
isExists = true;
}
//姓名 性别 身份证号 部门
model.real_name = row["姓名"].ToString().Trim();
model.sex = row["性别"].ToString();
if (isExists)
{
if (bll.Update(model))
{
updateCount++;
}
}
else
{
//学号不让修改
model.user_id = BasePage.GetNewId("USER");
model.password = BasePage.GetMD5("12345"); //默认12345
model.create_time = DateTime.Now;
model.id_card = id_card;
if (bll.Add(model))
{
insertCount++;
}
}
}
msg = "上传成功";
if (insertCount > 0)
{
msg += ",添加记录数:" + insertCount;
}
if (updateCount > 0)
{
msg += ",修改记录数:" + updateCount;
}
return true;
}
else
{
msg = "上传失败:表格内容为空";
return false;
}
}
catch (Exception ex)
{
msg = "上传失败:" + ex.Message;
return false;
}
}
///
/// 导入学员 $$$$
///
///
private bool ImportXueyuan(string filePath, out string msg)
{
try
{
msg = "上传成功";
var table = ExcelToDataTable(filePath, "", 0, true, false);
var user = DataService.BLL.admin_user.load_login();
var userModel = bll_user.GetModel(user.user_id);
if (null != table && table.Rows.Count > 1)
{
var list_dep_excel = new List();
var dep = string.Empty;
#region ===检查上传的字段====
for (int i = 0; i < table.Rows.Count; i++)
{
var row = table.Rows[i];
#region
/*
dep = row["部门"].ToString();
if (!string.IsNullOrWhiteSpace(dep))
{
if (!list_dep_excel.Contains(dep.Trim()))
{
list_dep_excel.Add(dep.Trim());
}
}
else
{
msg = "存在专业为空的记录,请检查上传文件";
return false;
}
*/
#endregion
#region 检查性别
/*
var sex_name = row["性别"].ToString();
if (string.IsNullOrWhiteSpace(sex_name))
{
msg = "存在性别为空的记录,请检查上传文件";
return false;
}
*/
#endregion
#region 身份证号
/*
var id_card = row["身份证号"].ToString();
if (string.IsNullOrWhiteSpace(id_card))
{
msg = "存在身份证号为空的记录,请检查上传文件";
return false;
}
if (id_card.Length == 18 && !BasePage.Is_valid_idcard18(id_card))
{
msg = "18位身份证号码格式错误!错误身份证号: " + id_card;
return false;
}
*/
#endregion
#region 检查姓名
var real_name = row["姓名"].ToString();
if (string.IsNullOrWhiteSpace(real_name))
{
msg = "存在姓名为空的记录,请检查上传文件";
return false;
}
#endregion
#region 登录账号
var id_card = row["登录账号"].ToString();
if (string.IsNullOrWhiteSpace(id_card))
{
msg = "存在登录账号为空的记录,请检查上传文件";
return false;
}
if (id_card.Length < 5)
{
msg = "登录账号的长度小于5!请检查登录账号: " + id_card;
return false;
}
/*
if (bll_user.ExistsByIdcard(id_card))
{
msg = "登录账号已经存在!请检查登录账号: " + id_card;
return false;
}
*/
#endregion
#region 手机号码
var mobile = row["手机号码"].ToString();
if (string.IsNullOrWhiteSpace(mobile))
{
msg = "存在手机号码为空的记录,请检查上传文件";
return false;
}
if (!BasePage.IsMobile(mobile))
{
msg = "手机号码格式不正确,请检查手机号:" + mobile;
return false;
}
#endregion
}
#endregion
#region
/*
var major_list = bll_type_manage.GetModelList(string.Format(" parent_id = 'sign_dep' "));
List error_major = new List();
foreach (var item in list_dep_excel)
{
var model = major_list.FirstOrDefault(s => s.type_name == item);
if (null == model)
{
error_major.Add(item);
}
}
if (error_major.Count > 0)
{
msg = "请先在部门管理模块配置部门,以下部门不存在:" + string.Join(",", error_major.ToArray());
return false;
}
*/
#endregion
int insertCount = 0;
int updateCount = 0;
DataService.BLL.admin_user bll = new DataService.BLL.admin_user();
for (int i = 0, len = table.Rows.Count; i < len; i++)
{
var row = table.Rows[i];
var id_card = row["登录账号"].ToString().Trim();
var model = new DataService.Model.admin_user();
var isExists = false;
if (bll.ExistsByIdcard(id_card))
{
model = bll.GetModelByIdcard(id_card);
isExists = true;
}
//姓名 性别 身份证号 部门
model.real_name = row["姓名"].ToString().Trim();
//model.sex = row["性别"].ToString();
//model.dep_name = row["部门"].ToString();
model.mobile = row["手机号码"].ToString();
if (isExists)
{
if (bll.Update(model))
{
updateCount++;
}
}
else
{
//学号不存在,进行新增
model.user_id = BasePage.GetNewId("USER");
model.password = BasePage.GetMD5("12345"); //默认12345
model.create_time = DateTime.Now;
model.id_card = id_card;
model.role_id = bll_user.getStudentRoleId();
//model.province_id = userModel.province_id;
//model.province = userModel.province;
//model.city_id = userModel.city_id;
//model.city = userModel.city;
//model.unit_id = userModel.unit_id;
//model.unit_name = userModel.unit_name;
if (bll.Add(model))
{
insertCount++;
}
}
}
msg = "上传成功";
if (insertCount > 0)
{
msg += ",添加记录数:" + insertCount;
}
if (updateCount > 0)
{
msg += ",修改记录数:" + updateCount;
}
return true;
}
else
{
msg = "上传失败:表格内容为空";
return false;
}
}
catch (Exception ex)
{
msg = "上传失败:" + ex.Message;
return false;
}
}
///
/// 导入学校学生 $$$$
///
///
private bool ImportSchoolStudents(string filePath,string school_id, out string msg)
{
try
{
msg = "上传成功";
/*
var user = DataService.BLL.admin_user.load_login();
var user_login = bll_user.GetModel(user.user_id);
if (user_login.role_id=="0")
{
msg = "上传失败,请用老师角色上传文件!";
return false;
}
*/
var table = ExcelToDataTable(filePath, "", 0, true, false);
if (null != table && table.Rows.Count >=1)
{
var list_dep_excel = new List();
var dep = string.Empty;
List list_login_name = new List();
#region ===检查上传的字段====
for (int i = 0; i < table.Rows.Count; i++)
{
var row = table.Rows[i];
#region
var grade = row["班级"].ToString();
if (string.IsNullOrWhiteSpace(grade))
{
msg = "存在班级为空的记录,请检查上传文件";
return false;
}
#endregion
#region 检查姓名
var real_name = row["姓名"].ToString();
if (string.IsNullOrWhiteSpace(real_name))
{
msg = "存在姓名为空的记录,请检查上传文件";
return false;
}
#endregion
#region 登录账号
var id_card = row["登录账号"].ToString();
if (string.IsNullOrWhiteSpace(id_card))
{
msg = "存在登录账号为空的记录,请检查上传文件";
return false;
}
if (id_card.Length < 5)
{
msg = "登录账号的长度小于5!请检查登录账号: " + id_card;
return false;
}
var login_name = row["登录账号"].ToString().Trim();
list_login_name.Add(login_name);
/*
if (bll_user.ExistsByIdcard(id_card))
{
msg = "登录账号已经存在!请检查登录账号: " + id_card;
return false;
}
*/
#endregion
#region 手机号码
var mobile = row["手机号码"].ToString();
if (!string.IsNullOrWhiteSpace(mobile) && !BasePage.IsMobile(mobile))
{
msg = "手机号码格式不正确,请检查手机号:" + mobile;
return false;
}
#endregion
}
#endregion
#region 判断学校数量上限 2 学生 、1 老师 限制提示
var array_login_name = list_login_name.ToArray();
List list = new List();
foreach (var item in array_login_name)
{
list.Add("'" + item + "'");
}
int exist_count = 0;
if (list.Count > 0)
{
var id_list = string.Join(",", list.ToArray());
string where = string.Format("login_name in ({0}) ", id_list);
exist_count = bll_user.GetModelList(where).Count;
}
var prepare_count = list.Count - exist_count;
if (prepare_count > 0)
{
var school = bll_school.GetModel(school_id);
var role_student_id = bll_user.getStudentRoleId();
var role_teacher_id = bll_user.getTeacherRoleId();
if (ddp_role.SelectedValue == role_student_id) //=========导入学生=========
{
if (!string.IsNullOrEmpty(school.r2) && school.r2 != "-1")
{
var limit_number = int.Parse(school.r2);
//只统计已启用用户$$$
var exist_number = bll_user.GetStartedUsers(school_id, role_student_id);
if ((exist_number + prepare_count) > limit_number)
{
//msg = string.Format("当前学校学生已达上限{0},导入失败!", limit_number);
msg = string.Format("当前学校学生已达上限,导入失败!");
return false;
}
}
}
else if (ddp_role.SelectedValue == role_teacher_id) //========导入老师======
{
if (!string.IsNullOrEmpty(school.r1) && school.r1 != "-1")
{
var limit_number = int.Parse(school.r1);
//只统计已启用用户$$$
var exist_number = bll_user.GetStartedUsers(school_id, role_teacher_id);
if ((exist_number + prepare_count) > limit_number)
{
//msg = string.Format("当前学校老师已达上限{0},导入失败!", limit_number);
msg = string.Format("当前学校老师已达上限,导入失败!");
return false;
}
}
}
}
#endregion
int insertCount = 0;
int updateCount = 0;
List list_Insert = new List();
List< DataService.Model.admin_user > list_update = new List();
DataService.BLL.admin_user bll = new DataService.BLL.admin_user();
for (int i = 0, len = table.Rows.Count; i < len; i++)
{
var row = table.Rows[i];
var login_name = row["登录账号"].ToString().Trim();
var model = new DataService.Model.admin_user();
var isExists = false;
// var user_exists = bll.GetModelBylogin_name(user_login.school_id, login_name);
var user_exists = bll.GetModelBylogin_name(login_name);
if (null != user_exists)
{
model = user_exists;
isExists = true;
}
//班级 姓名 手机号码 登录账号(不变)
model.grade = row["班级"].ToString();
model.real_name = row["姓名"].ToString().Trim();
model.job_number = row["学号"].ToString();
model.mobile = row["手机号码"].ToString();
if (isExists)
{
/*
if (bll.Update(model))
{
updateCount++;
}
*/
list_update.Add(model);
updateCount++;
}
else
{
//string password = GetString(6);//随机
//string password = "12345"; //默认
string password = "12345";
var random_value = dp_random.SelectedValue;
if (random_value == "1")
{
password = GetString6();//随机
}
model.user_id = BasePage.GetNewId("USER");
model.password = BasePage.GetMD5(password); //默认12345
model.create_time = DateTime.Now;
model.login_name = login_name; //登录账号
model.school_id = school_id;
//model.role_id = bll_user.getStudentRoleId();
model.role_id = ddp_role.SelectedValue;
//model.r6 = password;//随机
#region $$$$ 只保存学生密码
//model.r6 = password;
if (model.role_id == "2")
{
model.r6 = password;
}
#endregion
#region 其它角色只能是12345
if (model.role_id != "2")
{
var password_en = EncryptionAndDecryption.EncryptByLgzn("12345");
model.password = password_en;
}
#endregion
/*
if (bll.Add(model))
{
insertCount++;
}
*/
list_Insert.Add(model);
insertCount++;
}
}
var total = bll.BatchAdd_Update(list_Insert, list_update);
msg = "上传成功";
if (total == (insertCount + updateCount))
{
if (insertCount > 0)
{
msg += ",添加记录数:" + insertCount;
}
if (updateCount > 0)
{
msg += ",修改记录数:" + updateCount;
}
}
return true;
}
else
{
msg = "上传失败:表格内容为空";
return false;
}
}
catch (Exception ex)
{
msg = "上传失败:" + ex.Message;
return false;
}
}
//批量导入的时候生成随机密码,注意随机密码去除大写的i以及小写的L
public string GetString_old(int count)
{
//string t62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
string t62 = "0123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ"; //去除了两个字母
long ticks = DateTime.Now.Ticks;
string gen = "";
int ind = 0;
while (ind < count)
{
byte low = (byte)((ticks >> ind * 6) & 61);
gen += t62[low];
ind++;
}
return gen;
}
public string GetString(int count)
{
var d = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0));
var array = new string[] { "2", "3", "4", "5", "6", "7", "8", "a", "b", "d", "e", "f", "h", "m", "n", "t", "y" };
var new_array = array.OrderBy(s => Guid.NewGuid()).ToArray();
var sb = new StringBuilder();
for(int i=0; i< count;i++)
{
sb.Append(new_array[i]);
}
return sb.ToString();
}
public string GetString6()
{
var d = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0));
var array1 = new string[] { "a", "b", "d", "e", "f", "h", "m", "n", "t", "y" };
var array2 = new string[] { "2", "3", "4", "5", "6", "7", "8" };
var new_array1 = array1.OrderBy(s => Guid.NewGuid()).ToArray();
var new_array2 = array2.OrderBy(s => Guid.NewGuid()).ToArray();
var temp = new_array1[1] + new_array1[2] + new_array1[3]
+ new_array2[1] + new_array2[2] + new_array2[3];
return temp;
}
public static DataTable ExcelToDataTable(string filePath, string sheetName, int startRow, bool isFirstRowColumn, bool cshz)
{
DataTable dataTable = null;
FileStream fs = null;
DataColumn column = null;
DataRow dataRow = null;
IWorkbook workbook = null;
ISheet sheet = null;
IRow row = null;
ICell cell = null;
int cellCount = 0;
// int startRow = 0;
try
{
using (fs = File.OpenRead(filePath))
{
// 2007版本
if (filePath.IndexOf(".xlsx") > 0)
workbook = new XSSFWorkbook(fs);
// 2003版本
else if (filePath.IndexOf(".xls") > 0)
workbook = new HSSFWorkbook(fs);
if (workbook != null)
{
if (sheetName != null)
{
sheet = workbook.GetSheet(sheetName);
if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
{
if (cshz)
{
return null;
}
sheet = workbook.GetSheetAt(0);
}
}
else
{
sheet = workbook.GetSheetAt(0);
}
dataTable = new DataTable();
if (sheet != null)
{
int rowCount = sheet.LastRowNum;//总行数
if (rowCount > 0)
{
IRow firstRow = sheet.GetRow(startRow);//第一行
int rowindex = 0; //搜索空行,并跳过
while (firstRow == null && rowindex < rowCount)
{
rowindex++;
firstRow = sheet.GetRow(rowindex);
} //如果全为空行则返回null值
if (rowindex == rowCount) return null;
cellCount = firstRow.LastCellNum;//列数
startRow = firstRow.RowNum;
// 构建datatable的列
if (isFirstRowColumn)
{
//如果第一行是列名,则从第二行开始读取
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
cell = firstRow.GetCell(i);
if (cell != null)
{
if (cell.ToString() != null)
{
column = new DataColumn(cell.ToString());
dataTable.Columns.Add(column);
}
}
}
startRow++;
}
else
{
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
column = new DataColumn("column" + (i + 1));
dataTable.Columns.Add(column);
}
}
// 填充行
for (int i = startRow; i <= rowCount; ++i)
{
row = sheet.GetRow(i);
if (row == null) continue;
cellCount = row.LastCellNum; //全文行之间的列数不一样的话,继续添加列
if (cellCount > dataTable.Columns.Count)
{
for (int c = dataTable.Columns.Count; c < cellCount; c++)
{
column = new DataColumn("column" + (c + 1));
dataTable.Columns.Add(column);
}
}
dataRow = dataTable.NewRow();
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
cell = row.GetCell(j);
if (cell == null)
{
dataRow[j] = "";
}
else
{
// CellType(Unknown = -1, Numeric = 0, String = 1, Formula = 2, Blank = 3, Boolean = 4, Error = 5,)
switch (cell.CellType)
{
case CellType.Blank:
dataRow[j] = "";
break;
case CellType.Numeric:
short format = cell.CellStyle.DataFormat;
// 对时间格式(2015.12.5、2015 / 12 / 5、2015 - 12 - 5等)的处理
if (format == 14 || format == 31 || format == 57 || format == 58)
dataRow[j] = cell.DateCellValue;
else
dataRow[j] = cell.NumericCellValue;
break;
case CellType.String:
dataRow[j] = cell.StringCellValue;
break;
}
}
}
dataTable.Rows.Add(dataRow);
}
}
}
}
}
return dataTable;
}
catch (Exception ex)
{
if (fs != null)
{
fs.Close();
}
return null;
}
}
///
///
///
/// DataTable
/// 当前 FileStream 对象将封装的文件的相对路径或绝对路径。
public static void DateTableToExcel(DataTable dt, string path)
{
MemoryStream stream = (MemoryStream)ExcelTools.RenderDataTableToExcel(dt);
byte[] buffer = stream.ToArray();
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
fs.Write(buffer, 0, buffer.Length);
fs.Flush();
}
/*
MemoryStream memoryStream = new MemoryStream();
byte[] buffer = new byte[length];
int i;
//将字节逐个放入到Byte中
while ((i = stream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, i);
}
result = memoryStream.ToArray();//文件流Byte,需要文件流可直接return,不需要下面的保存代码
memoryStream.Close();
*/
}
public static byte[] DateTableToExcelBytes(DataTable dt)
{
MemoryStream stream = (MemoryStream)ExcelTools.RenderDataTableToExcel(dt);
byte[] buffer = stream.ToArray();
return buffer;
}
///
///
///
/// DataTable
/// 当前 FileStream 对象将封装的文件的相对路径或绝对路径。
public static void DateTableToExcelWithTitle(DataTable dt, DataTable source, string path, string title)
{
MemoryStream stream = (MemoryStream)ExcelTools.RenderDataTableToExcelWithTitle(dt, source, title);
byte[] buffer = stream.ToArray();
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
fs.Write(buffer, 0, buffer.Length);
fs.Flush();
}
}
}
public static class ExcelTools
{
public static HSSFWorkbook workbook;
public static void InitializeWorkbook()
{
////create a entry of DocumentSummaryInformation
if (workbook == null)
workbook = new HSSFWorkbook();
}
#region
///
/// 将DataTable转成Stream输出.
///
/// The source table.
///
public static Stream RenderDataTableToExcel(DataTable SourceTable)
{
workbook = new HSSFWorkbook();
InitializeWorkbook();
MemoryStream ms = new MemoryStream();
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);
// handling header.
foreach (DataColumn column in SourceTable.Columns)
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
// handling value.
int rowIndex = 1;
foreach (DataRow row in SourceTable.Rows)
{
HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
foreach (DataColumn column in SourceTable.Columns)
{
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
}
rowIndex++;
}
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
sheet = null;
headerRow = null;
workbook = null;
return ms;
}
///
/// 将DataTable转成Stream输出.
///
/// The source table.
///
public static Stream RenderDataTableToExcelWithTitle(DataTable SourceTable, DataTable source, string title)
{
workbook = new HSSFWorkbook();
InitializeWorkbook();
MemoryStream ms = new MemoryStream();
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
HSSFRow titleRow = (HSSFRow)sheet.CreateRow(0);
var cell_title = titleRow.CreateCell(0);
var titleStyle = createTitleStyle(workbook);
cell_title.CellStyle = titleStyle;
cell_title.SetCellValue(title);
var cell_style = createCellStyle(workbook);
HSSFRow headerRow = (HSSFRow)sheet.CreateRow(1);
// handling header.
foreach (DataColumn column in SourceTable.Columns)
{
var cell_head = headerRow.CreateCell(column.Ordinal);
cell_head.CellStyle = cell_style;
cell_head.SetCellValue(column.ColumnName);
}
// handling value.
int rowIndex = 2;
foreach (DataRow row in SourceTable.Rows)
{
HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
foreach (DataColumn column in SourceTable.Columns)
{
var cell_data = dataRow.CreateCell(column.Ordinal);
cell_data.CellStyle = cell_style;
cell_data.SetCellValue(row[column].ToString());
}
rowIndex++;
}
#region 成绩分数段统计
// 不及格 60分以下
decimal man_dn60 = 0;
//及格 60-69
decimal man_bt60_70 = 0;
//中等 70-79
decimal man_bt70_80 = 0;
//良好 80-89
decimal man_bt80_90 = 0;
//优秀 90-100
decimal man_up90 = 0;
//总计多少分
decimal total_score = 0;
//总计多少人
decimal total_man = 0;
VRS.Management.VSAT.ResultStudentStatistics.compute_score(source, out man_dn60, out man_bt60_70, out man_bt70_80, out man_bt80_90, out man_up90, out total_score, out total_man);
var avg_score = Math.Round(total_score / total_man, 1);
var avg_score_string = avg_score.ToString();
decimal bjg_rate = Math.Round(man_dn60 * 100 / total_man, 1);
decimal jg_rate = Math.Round(man_bt60_70 * 100 / total_man, 1);
decimal zd_rate = Math.Round(man_bt70_80 * 100 / total_man, 1);
decimal lh_rate = Math.Round(man_bt80_90 * 100 / total_man, 1);
decimal yx_rate = Math.Round(man_up90 * 100 / total_man, 1);
rowIndex++;
var row_index_cjtj = rowIndex;
var headerRow_cjtj = (HSSFRow)sheet.CreateRow(rowIndex);
var cell_head_cjtj = headerRow_cjtj.CreateCell(0);
cell_head_cjtj.CellStyle = cell_style;
cell_head_cjtj.SetCellValue("成绩统计");
rowIndex++;
var row_pjcj = (HSSFRow)sheet.CreateRow(rowIndex);
var cell_head1 = row_pjcj.CreateCell(0);
cell_head1.CellStyle = cell_style;
cell_head1.SetCellValue("平均成绩");
var cell_head2 = row_pjcj.CreateCell(1);
cell_head2.CellStyle = cell_style;
cell_head2.SetCellValue(avg_score_string);
//优秀 良好 中等 及格 不及格
//优秀
rowIndex++;
var row_yx = (HSSFRow)sheet.CreateRow(rowIndex);
var cell_head_yx = row_yx.CreateCell(0);
cell_head_yx.CellStyle = cell_style;
cell_head_yx.SetCellValue("优秀");
var cell_head_yx_1 = row_yx.CreateCell(1);
cell_head_yx_1.CellStyle = cell_style;
cell_head_yx_1.SetCellValue(man_up90.ToString());
var cell_head_yx_2 = row_yx.CreateCell(2);
cell_head_yx_2.CellStyle = cell_style;
cell_head_yx_2.SetCellValue(yx_rate + "%");
//良好
rowIndex++;
var row_lh = (HSSFRow)sheet.CreateRow(rowIndex);
var cell_head_lh = row_lh.CreateCell(0);
cell_head_lh.CellStyle = cell_style;
cell_head_lh.SetCellValue("良好");
var cell_head_lh_1 = row_lh.CreateCell(1);
cell_head_lh_1.CellStyle = cell_style;
cell_head_lh_1.SetCellValue(man_bt80_90.ToString());
var cell_head_lh_2 = row_lh.CreateCell(2);
cell_head_lh_2.CellStyle = cell_style;
cell_head_lh_2.SetCellValue(lh_rate + "%");
//中等
rowIndex++;
var row_zd = (HSSFRow)sheet.CreateRow(rowIndex);
var cell_head_zd = row_zd.CreateCell(0);
cell_head_zd.CellStyle = cell_style;
cell_head_zd.SetCellValue("中等");
var cell_head_zd_1 = row_zd.CreateCell(1);
cell_head_zd_1.CellStyle = cell_style;
cell_head_zd_1.SetCellValue(man_bt70_80.ToString());
var cell_head_zd_2 = row_zd.CreateCell(2);
cell_head_zd_2.CellStyle = cell_style;
cell_head_zd_2.SetCellValue(zd_rate + "%");
//及格
rowIndex++;
var row_jg = (HSSFRow)sheet.CreateRow(rowIndex);
var cell_head_jg = row_jg.CreateCell(0);
cell_head_jg.CellStyle = cell_style;
cell_head_jg.SetCellValue("及格");
var cell_head_jg_1 = row_jg.CreateCell(1);
cell_head_jg_1.CellStyle = cell_style;
cell_head_jg_1.SetCellValue(man_bt60_70.ToString());
var cell_head_jg_2 = row_jg.CreateCell(2);
cell_head_jg_2.CellStyle = cell_style;
cell_head_jg_2.SetCellValue(jg_rate + "%");
//不及格
rowIndex++;
var row_bjg = (HSSFRow)sheet.CreateRow(rowIndex);
var cell_head_bjg = row_bjg.CreateCell(0);
cell_head_bjg.CellStyle = cell_style;
cell_head_bjg.SetCellValue("不及格");
var cell_head_bjg_1 = row_bjg.CreateCell(1);
cell_head_bjg_1.CellStyle = cell_style;
cell_head_bjg_1.SetCellValue(man_dn60.ToString());
var cell_head_bjg_2 = row_bjg.CreateCell(2);
cell_head_bjg_2.CellStyle = cell_style;
cell_head_bjg_2.SetCellValue(bjg_rate + "%");
#endregion
if (SourceTable.Rows.Count >= 2)
{
var length = sheet.GetRow(1).LastCellNum;
for (var j = 1; j < length; j++)
{
sheet.AutoSizeColumn(j);
}
}
// 合并日期占两行(4个参数,分别为起始行,结束行,起始列,结束列)
// 行和列都是从0开始计数,且起始结束都会合并
// 这里是合并excel中日期的两行为一行
CellRangeAddress region = new CellRangeAddress(0, 0, 0, SourceTable.Columns.Count - 1);
RegionUtil.SetBorderTop(1, region, sheet);
RegionUtil.SetBorderLeft(1, region, sheet);
RegionUtil.SetBorderRight(1, region, sheet);
sheet.AddMergedRegion(region);
//成绩统计行
CellRangeAddress region_cjtj = new CellRangeAddress(row_index_cjtj, row_index_cjtj, 0, 2);
RegionUtil.SetBorderTop(1, region_cjtj, sheet);
RegionUtil.SetBorderLeft(1, region_cjtj, sheet);
RegionUtil.SetBorderRight(1, region_cjtj, sheet);
sheet.AddMergedRegion(region_cjtj);
CellRangeAddress region_pjcj = new CellRangeAddress(row_index_cjtj + 1, row_index_cjtj + 1, 1, 2);
RegionUtil.SetBorderTop(1, region_pjcj, sheet);
RegionUtil.SetBorderLeft(1, region_pjcj, sheet);
RegionUtil.SetBorderRight(1, region_pjcj, sheet);
sheet.AddMergedRegion(region_pjcj);
workbook.Write(ms);
ms.Flush();
ms.Position = 0;
sheet = null;
headerRow = null;
workbook = null;
return ms;
}
/**
* 设置单元格的边框(细)且为红色
* @param workbook
* @param cellnum
* @return
*/
public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook)
{
HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
//设置上下左右四个边框宽度
style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
//设置上下左右四个边框颜色
style.TopBorderColor = HSSFColor.Black.Index;
style.BottomBorderColor = HSSFColor.Black.Index;
style.LeftBorderColor = HSSFColor.Black.Index;
style.RightBorderColor = HSSFColor.Black.Index;
style.VerticalAlignment = VerticalAlignment.Center;
style.Alignment = HorizontalAlignment.Center;
return style;
}
public static HSSFCellStyle createTitleStyle(HSSFWorkbook workbook)
{
HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle();
style.VerticalAlignment = VerticalAlignment.Center;
style.Alignment = HorizontalAlignment.Center;
// 生成一个字体
HSSFFont font = (HSSFFont)workbook.CreateFont();
font.FontHeight = 300;
font.Color = HSSFColor.Black.Index;
font.IsBold = true;
font.FontName = "宋体";
// 把字体 应用到当前样式
style.SetFont(font);
return style;
}
public static void WriteSteamToFile(MemoryStream ms, string FileName)
{
FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
byte[] data = ms.ToArray();
fs.Write(data, 0, data.Length);
fs.Flush();
fs.Close();
data = null;
ms = null;
fs = null;
}
public static void WriteSteamToFile(byte[] data, string FileName)
{
FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
fs.Write(data, 0, data.Length);
fs.Flush();
fs.Close();
data = null;
fs = null;
}
public static Stream WorkBookToStream(HSSFWorkbook InputWorkBook)
{
MemoryStream ms = new MemoryStream();
InputWorkBook.Write(ms);
ms.Flush();
ms.Position = 0;
return ms;
}
public static HSSFWorkbook StreamToWorkBook(Stream InputStream)
{
HSSFWorkbook WorkBook = new HSSFWorkbook(InputStream);
return WorkBook;
}
public static HSSFWorkbook MemoryStreamToWorkBook(MemoryStream InputStream)
{
HSSFWorkbook WorkBook = new HSSFWorkbook(InputStream as Stream);
return WorkBook;
}
public static MemoryStream WorkBookToMemoryStream(HSSFWorkbook InputStream)
{
//Write the stream data of workbook to the root directory
MemoryStream file = new MemoryStream();
InputStream.Write(file);
return file;
}
public static Stream FileToStream(string FileName)
{
FileInfo fi = new FileInfo(FileName);
if (fi.Exists == true)
{
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
return fs;
}
else return null;
}
public static Stream MemoryStreamToStream(MemoryStream ms)
{
return ms as Stream;
}
#endregion
#region
///
/// 将DataTable转成Workbook(自定资料形态)输出.
///
/// The source table.
///
public static HSSFWorkbook RenderDataTableToWorkBook(DataTable SourceTable)
{
workbook = new HSSFWorkbook();
InitializeWorkbook();
MemoryStream ms = new MemoryStream();
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);
// handling header.
foreach (DataColumn column in SourceTable.Columns)
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
// handling value.
int rowIndex = 1;
foreach (DataRow row in SourceTable.Rows)
{
HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
foreach (DataColumn column in SourceTable.Columns)
{
dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
}
rowIndex++;
}
return workbook;
}
///
/// 将DataTable资料输出成Excel.
///
/// The source table.
/// Name of the file.
public static void RenderDataTableToExcel(DataTable SourceTable, string FileName)
{
MemoryStream ms = RenderDataTableToExcel(SourceTable) as MemoryStream;
WriteSteamToFile(ms, FileName);
}
///
/// 從位元读取取资料到DataTable.
///
/// The excel file stream.
/// Name of the sheet.
/// Index of the header row.
/// if set to true [have header].
///
public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex, bool HaveHeader)
{
workbook = new HSSFWorkbook(ExcelFileStream);
InitializeWorkbook();
HSSFSheet sheet = (HSSFSheet)workbook.GetSheet(SheetName);
DataTable table = new DataTable();
HSSFRow headerRow = (HSSFRow)sheet.GetRow(HeaderRowIndex);
int cellCount = headerRow.LastCellNum;
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
string ColumnName = (HaveHeader == true) ? headerRow.GetCell(i).StringCellValue : "f" + i.ToString();
DataColumn column = new DataColumn(ColumnName);
table.Columns.Add(column);
}
int rowCount = sheet.LastRowNum;
int RowStart = (HaveHeader == true) ? sheet.FirstRowNum + 1 : sheet.FirstRowNum;
for (int i = RowStart; i <= sheet.LastRowNum; i++)
{
HSSFRow row = (HSSFRow)sheet.GetRow(i);
DataRow dataRow = table.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
dataRow[j] = row.GetCell(j).ToString();
}
ExcelFileStream.Close();
workbook = null;
sheet = null;
return table;
}
///
/// 從位元流读取资料到DataTable.
///
/// The excel file stream.
/// Index of the sheet.
/// Index of the header row.
/// if set to true [have header].
///
public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex, bool HaveHeader)
{
workbook = new HSSFWorkbook(ExcelFileStream);
InitializeWorkbook();
HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(SheetIndex);
DataTable table = new DataTable();
HSSFRow headerRow = (HSSFRow)sheet.GetRow(HeaderRowIndex);
int cellCount = headerRow.LastCellNum;
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
string ColumnName = (HaveHeader == true) ? headerRow.GetCell(i).StringCellValue : "f" + i.ToString();
DataColumn column = new DataColumn(ColumnName);
table.Columns.Add(column);
}
int rowCount = sheet.LastRowNum;
int RowStart = (HaveHeader == true) ? sheet.FirstRowNum + 1 : sheet.FirstRowNum;
for (int i = RowStart; i <= sheet.LastRowNum; i++)
{
HSSFRow row = (HSSFRow)sheet.GetRow(i);
DataRow dataRow = table.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
dataRow[j] = row.GetCell(j).ToString();
}
table.Rows.Add(dataRow);
}
ExcelFileStream.Close();
workbook = null;
sheet = null;
return table;
}
#endregion
}
}