导入导出

导出数据到一个表格中,导出是不需要分页的。工资条
导入:类似批量插入。添加很多员工。
表的模板要和表中的数据对应起来,导入的时候就能自动插入了。
使用第三方工具导入导出
POI:
maven仓库搜POI,选择版本,点击拷贝依赖,粘贴到pom.xml中;
面向对象,POI中处理Excel的概念:
workbook:整个Excel文件
sheet:一页数据(一张纸)
row:行
column:列
cell:单元格
POI的官方文档:
快速入门;
1、按钮添加
员工中ftl:

请求用什么?
不能用异步请求,因为响应的是文件,用同步的方式发生请求。

2、controller中添加方法:
创建工作簿(从文档拷贝)

测试一下,效果,点击左下角出现文件。文件名称是.do后缀,所以要设置文件下载的响应头。
文件下载的响应头:需要配置,拷贝(xmind)里;

提供数据:
将创建Excel相关的代码抽成一个工具:

在业务层中来创建该方法:

查询员工数据,遍历数据集:每个员工就是一行,行中每个属性就是一格。

在数据之前有一行显示属性名称的标题行:

循环中第一行要+1:


异步请求为什么不行:
以function回调函数的形式去接受,在function中只能把后台响应回来的数据,通过毁掉函数来处理,最后是一堆的字符串。文件上传和下载的时候,只能用同步请求的方式来处理。
导入功能:
提供一个Excel模板,规定好文件的格式:
标题
每一列的单元格格式与数据库中设计的列格式要一致。
将模板存放在

模态框:导出


导入按钮的点击事件:
显示模态框。

文件上传:

用异步请求方式去提交,导入成功或者失败的结果

controller中导入的方法:异步JsonResult返回
参数:涉及到文件上传,文件上传的格式必须是MultipartFile
配置文件上传解析器:
文件上传一定要配mvc.xml中,id的值是不能修改的,

控制文件大小:

启动报错:

没有依赖:就找不到类。添加文件上传的依赖。
再试一下。
业务层接收到文件之后的处理:
把接受到的文件以Excel的方式去读取并操作:
传流的方式来读,不传流是创建一个新的,

读取:getSheetAt/row...
看着表从什么地方开始读,获取总行数,循环去读。
开始读的索引位置:1,忽略掉标题行,
读取时要根据某种格式去读,年龄的类型是文本,

测试:导入选择文件,点击保存。
发现最后一行没有读到,那么lastRowNum不是指行数,而是行的索引数。

将模板中年龄的格式是数值时:对应就不用Integer.valueOf()
要指定的方式获取,得到的是Double

类型不匹配的时候:会报错,

如:模板中有标题和一个样例,让用户根据样例来填数据。
模板中不填数据的时候是空的,有可能出现空指针异常,业务层可以加个判断来排除空值的情况。
POI的工具:esaypoi、easyexcel
用的方式是贴注解,文档看实例。
工具需要依赖:
maven中央仓库中搜,拷贝粘贴。
在domain中铁注解,@ExcelProperty(value=“列名”,index=0)

文档中有使用方法,


添加依赖多了,因为传递性依赖导致依赖冲突。

数据字典
数据字典的作用:


一, 在一定程度上,通过系统维护人员即可改变系统的行为(功能),不需要开发人员的介入。使得系统的变化更快,能及时响应客户和市场的需求。
二, 提高了系统的灵活性、通用性,减少了主体和属性的耦合度
三, 简化了主体类的业务逻辑
四, 能减少对系统程序的改动,使数据库、程序和页面更稳定。特别是数据量大的时候,能大幅减少开发工作量
五, 使数据库表结构和程序结构条理上更清楚,更容易理解,在可开发性、可扩展性、可维护性、系统强壮性上都有优势。
修改添加数据可通过页面进行管理;
我们不用建太多的表,数据字典只需要两张表:字典目录、字典明细。
字典目录:
字典明细:通过外键与字典目录关联起来。
逆向工程生成基本文件:


字典目录:
拷贝controller,service修改,分页等功能。
拷贝页面:



做了目录的列表查询;
添加
修改添加的模态框:

测试添加功能;
编辑

编辑需要json

明细:
怎删改查
还是拷贝替换基本的功能,
实现、分页;
模态框数据的回显,


查看页面显示是否正常;
要实现的界面效果:

界面设计


左侧显示的标题是列表组:
bootstrap拷贝:


把数据变成动态:
把打开字典明细时,把字典目录全部查出来;
返回视图之前查询字典目录,共享出去。

页面上:循环将数据拿出来显示


点击字典目录,就会去查询目录下的明细:
同步还是异步?
根据目录的id来查询字典的明细(一对多),查询语句的id=被点击的目录的id
分页查询的语句要加条件,高级查询一样的:

xml中对id的的字句:

用在明细的List方法中,

目录是链接;将href改成订台的动态的目录id。

点击之后的目录应该回显一下:
点击过的目录添加一个active的class样式,颜色突出。

bug:点下一页,又是重新查所有的数据:
点击下一页就是提交高级查询的表单,如何让表单将条件带过去;
加一个隐藏域:

模态框:
添加明细的时候:模态框的字典目录自动显示刚才选择的目录名称:
新增和编辑都会显示目录的名称:
把目录的名称设置到模态框的名称中,a链接的内容



测试是:报错parent_id不能为空,原因:表单中没有把目录的id传过去后台,加个隐藏域方目录的id,在提交表单时把目录的id带到后台去。


明细编辑的回显:

前台的回显:

序号用于排序,下拉框里用得越多的显示越靠前。
在分页的时候去排:

排序也让分页插件自己去加上去:
第三个参数,就是排序的规则:

添加时明细序号在用户不填的情况下,自动在最大的序号加一:
查询当前字典目录下最大的序号:

查询最大序号的SQL语句


mapper中的方法返回值在排除null后,可以是int基本类型;
保存之前:看用户填没填,不填就自动给他加上序号。

如果将即将保存的默认序号(max + 1)回显到input中的效果会更好,需要在前台去查max再然后+1 显示出来。
需求:在没有选择目录的情况下,点击添加,需要提示:请先选中目录,选中就之间 显示明细列表。
小伙砸,欢迎再看分享给其他小伙伴!共同进步!




