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 } }