第四天 -- 《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中会把看起来像数字的都保存成数字,加上’以后就强制保存为字符串文本。

 

posted on 2017-09-04 11:13  困兽斗  阅读(273)  评论(0)    收藏  举报

导航