第四天 -- 《2014-07-19 三层架构》 -- 多条件查询、Excel文件第三方组件基本操作
一、上午《01、回顾》--《06、实现查询功能》
1、实现多条件查询
可以在UI层根据用户选择了哪些条件,将条件参数放到字典Dictionary<string,object>里面传递到BLL层,最后传到DAL层可以根据字典里面包含的内容,拼接SQL语句并且创建SqlParameter参数。具体例子见下:
1 //UI层点击查询按钮后,根据用户选择的多个条件,组织一个字典。 2 private void btnSearch_Click(object sender, EventArgs e) 3 {//点击查询按钮后,根据多条件查询学员 4 Dictionary<string, string> dics = new Dictionary<string, string>(); 5 if (cboSearchClass.Text != "请选择") 6 {//如果用户选择某个班级作为条件之一。 7 dics.Add("cname", cboSearchClass.Text); 8 } 9 if (!string.IsNullOrEmpty(txtSearchName.Text.Trim())) 10 {//如果用户输入了一个学员名作为模糊查询条件。 11 dics.Add("pcname", txtSearchName.Text.Trim()); 12 } 13 //还有其他一些多条件,此处不一一写出。 14 15 this.dgvList.DataSource = pm.SearchPersonList(dics, false);//调用BLL层查询方法。 16 } 17 18 19 //BLL层查询方法 20 public List<MODEL.Person> SearchPersonList(Dictionary<string, string> dics, bool isdel) 21 {//isdel参数为true表示只查询已删除的记录。isdel为false时表示只查询没删的记录。 22 return ps.SearchPersonList(dics, isdel);//调用DAL层查询方法 23 } 24 25 26 //DAL层多条件查询方法 27 public List<MODEL.Person> SearchPersonList(Dictionary<string, string> dics, bool isdel) 28 { 29 string sql = "select pid,pcid,cname,ptype,ploginname,pcname,ppyname,ppwd,pgender,pemail,pareas,pisdel,paddtime from person inner join classes on person.pcid=classes.cid where pisdel=@isdel"; 30 31 List<SqlParameter> ps = new List<SqlParameter>();//多条件 32 ps.Add(new SqlParameter("isdel", isdel)); 33 34 //下面代码就是根据用户指定的查询多条件,进行sql拼接,sql参数添加等等。 35 if(dics.ContainsKey("cname")) 36 { 37 sql += " and cname=@cname"; 38 ps.Add(new SqlParameter("cname",dics["cname"])); 39 } 40 if(dics.ContainsKey("pcname")) 41 { 42 sql += " and pcname like @pcname"; 43 //模糊查询的%不是在sql语句中创建,而是在参数中添加 44 ps.Add(new SqlParameter("pcname","%" + dics["pcname"] + "%" )); 45 } 46 47 DataTable dt = SqlHelper.ExecuteTable(sql, ps.ToArray()); 48 List<MODEL.Person> lists = null; 49 //判断有没有数据行 50 if (dt.Rows.Count > 0) 51 { 52 lists = new List<MODEL.Person>(); 53 //遍历表,将表的每一行数据转换为对应的实体对象 54 foreach (DataRow row in dt.Rows) 55 { 56 //每一行数据就对应着一个对象 57 MODEL.Person temp = new MODEL.Person(); 58 //调用方法,将当前数据行转换为peron对象 59 PersonRowToPersonObject(row, temp); 60 //将对象添加到集合中 61 lists.Add(temp); 62 } 63 } 64 return lists; 65 }
二、下午《01、什么是NPOI》--《03、实现excel数据的导入》
1、NPOI基本使用代码示例
1 //新建Excel文件,导出实体对象到文件 2 private void btnOutput_Click(object sender, EventArgs e) 3 {// 4 //1.创建工作薄,因为数据是写在工作表中的,而工作表是属于工作薄的 5 HSSFWorkbook workbook = new HSSFWorkbook(); 6 //2.创建工作表 下面这个句代码表示 在 workbook创建一张工作表 7 //HSSFSheet sheet = new HSSFSheet(workbook); 8 HSSFSheet sheet = workbook.CreateSheet("classes");//也可以这样写,表示由workbook创建一个新sheet 9 //3.遍历数据源,Dgv控件的每一行数据 10 #region 循环遍历,添加工作薄中的工作表的行数据 11 for (int i = 0; i < this.dgvClassList.Rows.Count; i++) 12 { 13 //遍历控件的每一行,获取绑定项(即实体对象) 14 MODEL.Classes cla = this.dgvClassList.Rows[i].DataBoundItem as MODEL.Classes; 15 //4.创建工作行 16 HSSFRow row = sheet.CreateRow(i); 17 //5.1创建第一列 18 HSSFCell cell1 = row.CreateCell(0); 19 //5.2为当前列赋值 20 cell1.SetCellValue(cla.Cid); 21 22 //创建第二列 23 HSSFCell cell2 = row.CreateCell(1); 24 cell2.SetCellValue(cla.Cname); 25 26 //创建第三列 27 HSSFCell cell3 = row.CreateCell(2); 28 cell3.SetCellValue(cla.Ccount); 29 30 //创建第四列 31 HSSFCell cell4 = row.CreateCell(3); 32 cell4.SetCellValue(cla.Cimg); 33 34 //创建第五列 35 HSSFCell cell5 = row.CreateCell(4); 36 cell5.SetCellValue(cla.Cisdel); 37 38 //创建第六列 39 HSSFCell cell6 = row.CreateCell(5); 40 cell6.SetCellValue(cla.CaddTime.ToString()); 41 } 42 #endregion 43 //将生成的工作薄写入物理文件 44 using (FileStream fs = new FileStream(txtOutPut.Text.Trim(), FileMode.Create)) 45 { 46 workbook.Write(fs); 47 MessageBox.Show("ok"); 48 } 49 }
1 //点击按钮,将Excel中数据导入到实体集合,最后绑定到表格控件上。 2 private void btnInput_Click(object sender, EventArgs e) 3 { 4 5 List<MODEL.Classes> lists = new List<MODEL.Classes>(); 6 using (FileStream fs = new FileStream(txtInput.Text.Trim(), FileMode.Open)) 7 { 8 //1.通过读取的数据创建工作薄。这个工作薄中当然有工作表 9 HSSFWorkbook workbook = new HSSFWorkbook(fs); 10 //2.从工作薄中取出工作表 11 HSSFSheet sheet = workbook.GetSheet("classes"); 12 //3.遍历工作表的行 13 for (int i = sheet.FirstRowNum; i <= sheet.LastRowNum; i++) 14 { 15 //可以取出一行数据 16 HSSFRow row = sheet.GetRow(i); 17 18 //每一行数据对应着一个对象 19 MODEL.Classes cla = new MODEL.Classes(); 20 //取出第1列的单元格,通过强类型的方法获取这个单元中的值,将值 转换为double类型 21 cla.Cid = (int)(row.GetCell(0).NumericCellValue); 22 cla.Cname = row.GetCell(1).StringCellValue; 23 cla.Ccount = (int)(row.GetCell(2).NumericCellValue); 24 cla.Cimg = row.GetCell(3).StringCellValue; 25 cla.Cisdel = row.GetCell(4).BooleanCellValue; 26 cla.CaddTime = Convert.ToDateTime(row.GetCell(5).StringCellValue); 27 lists.Add(cla); 28 } 29 this.dgvClassList.DataSource = lists; 30 } 31 }
又如下例子:将DataTable写到Excel文件
1 public static void WriteExcel(DataTable dt, string filePath) 2 { 3 if (!string.IsNullOrEmpty(filePath) && null != dt && dt.Rows.Count > 0) 4 { 5 NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();//工作簿 6 NPOI.SS.UserModel.ISheet sheet = book.CreateSheet(dt.TableName);//页 7 8 NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);//先创建第一行,将列名写进去 9 for (int i = 0; i < dt.Columns.Count; i++) 10 { 11 row.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName); 12 } 13 14 //再循环之后的每一行 15 for (int i = 0; i < dt.Rows.Count; i++) 16 { 17 NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(i + 1); 18 for (int j = 0; j < dt.Columns.Count; j++) 19 {//循环每一个单元格 20 row2.CreateCell(j).SetCellValue(Convert.ToString(dt.Rows[i][j]));//都以字符串格式写入单元格 21 } 22 } 23 //将生成的工作薄写入物理文件 24 using (FileStream fs = new FileStream(filePath, FileMode.Create)) 25 { 26 book.Write(fs); 27 MessageBox.Show("ok"); 28 } 29 30 } 31 }
2、EEPlus基本使用代码示例(注意索引都以1开始,比如Excel表格第一个单元格是[1,1])
1 //从Excel文件读取数据 2 ICollection<Student> students = new List<Student>(); 3 using (FileStream stream = File.OpenRead(fileName, FileMode.Open)) 4 { 5 ExcelPackage package = new ExcelPackage(stream); 6 7 ExcelWorksheet sheet = package.Workbook.Worksheets[1]; 8 9 if (sheet == null) 10 {//如果不存在指定sheet,报错 11 MessageBox.Show("Excel format error!"); 12 return; 13 } 14 if (!sheet.Cells[1, 1].Value.Equals("Name") || 15 !sheet.Cells[1, 2].Value.Equals("Age") || 16 !sheet.Cells[1, 3].Value.Equals("Gender") || 17 !sheet.Cells[1, 4].Value.Equals("English Score") || 18 !sheet.Cells[1, 5].Value.Equals("Math Score")) 19 {//如果不存在指定列名,报错 20 MessageBox.Show("Excel format error!"); 21 return; 22 } 23 24 int lastRow = sheet.Dimension.End.Row;//最后一行(但有可能被用户按delete键删掉了单元格内容,) 25 while (sheet.Cells[lastRow, 1].Value == null) 26 {//通过循环,找到真正有内容(首列)的最后一行。 27 lastRow--; 28 } 29 30 for (int i = 2; i <= lastRow; i++) 31 { 32 students.Add(new Student 33 { 34 Name = sheet.Cells[i, 1].Value.ToString(), 35 Age = int.Parse(sheet.Cells[i, 2].Value.ToString()), 36 Gender = (Gender)Enum.Parse(typeof(Gender), sheet.Cells[i, 3].Value.ToString()), 37 EnglishScore = int.Parse(sheet.Cells[i, 4].Value.ToString()), 38 MathScore = int.Parse(sheet.Cells[i, 5].Value.ToString()) 39 40 }); 41 } 42 }
1 using (FileStream stream = new FileStream(fileName, FileMode.Create)) 2 { 3 ExcelPackage package = new ExcelPackage(stream); 4 5 package.Workbook.Worksheets.Add("Students"); 6 ExcelWorksheet sheet = package.Workbook.Worksheets[1]; 7 8 #region write header 9 sheet.Cells[1, 1].Value = "Name"; 10 sheet.Cells[1, 2].Value = "Age"; 11 sheet.Cells[1, 3].Value = "Gender"; 12 sheet.Cells[1, 4].Value = "English Score"; 13 sheet.Cells[1, 5].Value = "Math Score"; 14 sheet.Cells[1, 6].Value = "Average Score"; 15 16 using (ExcelRange range = sheet.Cells[1, 1, 1, 6]) 17 {//设置列头的风格 18 range.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;//实线 19 range.Style.Fill.BackgroundColor.SetColor(Color.Gray);//底色 20 range.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick;//边框线为细线 21 range.Style.Border.Bottom.Color.SetColor(Color.Black);//下边框颜色 22 range.AutoFitColumns(4);//设置列宽 23 } 24 #endregion 25 26 #region write content 27 int pos = 2; 28 IEnumerable students = dataGrid.ItemsSource;//从控件上获取实体对象集合 29 foreach (Student s in students) 30 { 31 sheet.Cells[pos, 1].Value = s.Name; 32 sheet.Cells[pos, 2].Value = s.Age; 33 sheet.Cells[pos, 3].Value = s.Gender; 34 sheet.Cells[pos, 4].Value = s.EnglishScore; 35 sheet.Cells[pos, 5].Value = s.MathScore; 36 sheet.Cells[pos, 6].FormulaR1C1 = "AVERAGE(RC[-1], RC[-2])";//还可以设置公式。让Excel自动求平均值。棒棒哒 37 38 if (s.MathScore > 90 && s.EnglishScore > 90) 39 { 40 using (ExcelRange range = sheet.Cells[pos, 1, pos, 6]) 41 { 42 range.Style.Font.Color.SetColor(Color.Blue);//还可以根据实体属性值,设置字体颜色 43 } 44 } 45 else if (s.MathScore < 80 && s.EnglishScore < 80) 46 { 47 using (ExcelRange range = sheet.Cells[pos, 1, pos, 6]) 48 { 49 range.Style.Font.Color.SetColor(Color.Red); 50 } 51 } 52 53 using (ExcelRange range = sheet.Cells[pos, 1, pos, 6]) 54 { 55 range.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; 56 range.Style.Border.Bottom.Color.SetColor(Color.Black); 57 range.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Left;//设置区域左对齐 58 } 59 60 pos++; 61 } 62 #endregion 63 64 package.Save(); 65 }
3、Excel文件操作注意事项
(1)电话号码写入
Excel中保存电话号码需要注意加’,Excel中会把看起来像数字的都保存成数字,加上’以后就强制保存为字符串文本。
浙公网安备 33010602011771号