智能销售系统(九)POI项目/数据字典

1.项目中添加POISpringMVC集成

 1.1 导出

   1.1.1 Employee
@Entity
@Table(name = "employee")
public class Employee extends BaseDomain{
    @Excel(name = "用户名")//一定要和Excel表上面对应上
    private String username;
    private String password;
    @Excel(name = "邮件")
    private String email;
    @Excel(name = "年龄")
    private Integer age;
    @Excel(name = "头像",type = 2,savePath = "/images/head")
    private String headImage;//图片  头像

    @ManyToOne(fetch = FetchType.LAZY)//多对一.多个员工属于一个部门
    @JoinColumn(name = "department_id")
    @ExcelEntity
    private Department department;//部门
  • Department
@Entity
@Table(name = "department")
public class Department extends BaseDomain{

    @Excel(name = "部门")
    private String name;
   1.1.2 准备一个按钮《导出》---Employss.jsp
<button type="submit" class="easyui-linkbutton" iconCls="icon-search">下载</button>
image.png
   1.1.3 EmployeeController加一个导出功能
    //download下载
    @RequestMapping("/download")
    public String download(ModelMap map, EmployeeQuery query, HttpServletRequest request){
        //要导出的数据 获取到
        List<Employee> list = employeeService.queryAll(query);
        //主要是为了显示头像
        //拿到项目的运行路径-----【绝对路径】
        String realPath = request.getServletContext().getRealPath("");//拿到运行然后拼接
        //进行拼接,把头像的路径e.getHeadImage()拼接出来----【遍历导出的数据list】
        list.forEach(e->System.out.println(realPath + e.getHeadImage()));
        //设置导出的Excel的一些参数,表头、页名、版本
        ExportParams exportParams = new ExportParams("title", "sheetName", ExcelType.XSSF);
        //这个就是导出来的数据 锁定多少列。不可以动
        exportParams.setFreezeCol(1);
        //数据集合
        map.put(NormalExcelConstants.DATA_LIST,list );
        //导出实体
        map.put(NormalExcelConstants.CLASS,Employee.class);
        //文件名称
        map.put(NormalExcelConstants.FILE_NAME,"employee");
        //参数
        map.put(NormalExcelConstants.PARAMS,exportParams);
        return NormalExcelConstants.EASYPOI_EXCEL_VIEW;
    }
}
   1.1.4 当点击导出的时候,出现报错
404--视图解析器 自动加了前缀后缀
    在配置一个视图解析器【applicationController-mvc.xml】
    <!--新搞一个视图解析器【但是现在两个视图器。所以要配置优先级】-->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="1"/>
    </bean>

导出现在没有头像,因为头像找得是绝对路径。他现在无法定位到,他找的是盘符。

  • EmployeeController中加上----拿到头像路径【把真实路径拼接出来】
        //主要是为了显示头像
        //拿到项目的运行路径-----【绝对路径】
        String realPath = request.getServletContext().getRealPath("");//拿到运行然后拼接
        //进行拼接,把头像的路径e.getHeadImage()拼接出来----【遍历导出的数据list】
        list.forEach(e->System.out.println(realPath + e.getHeadImage()));
   1.1.5 根据查询条件导出

把<a>标签 改成<button>
<button>----是直接提交表单 把路径直接填到from表单上面
后台在接收一下,在参数加上EmployeeQuery的参数。查询的时候改成Query的根据条件查询方法

 1.2 导入

   1.2.1 新建Controller
@Controller
@RequestMapping("/uploading")
public class uploadingController {
    @Autowired
    private IDepartmentService departmentService;
    @Autowired
    private IEmployeeService employeeService;

    @RequestMapping("/index")
    public String index(){
        return "uploading";
    }
}
   1.2.2 在WEB-INF/views/下面加一个页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%@ include file="/WEB-INF/views/head.jsp"%>
</head>
<body>
<form action="/uploading/employeeJudge" method="post" enctype="multipart/form-data">
    <%--enctype="multipart/form-data ---【上传就要加这个属性】--%>
    <input class="easyui-filebox" name="empFile" style="width:80%"
           data-options="prompt:'选择一个文件...',buttonText: '选择文件'" />
    <button class="easyui-linkbutton">上传</button>
</form>
</body>
</html>
上传必须要加enctype="multipart/form-data"
   1.2.3 接收文件里面的数据
  • 在Controller中在加方法--拿到数据
    @RequestMapping("/employeeJudge")
    public String employeeJudge(MultipartFile empFile)throws Exception{
        ImportParams params = new ImportParams();
        params.setHeadRows(1);//不要第0行
        List<Employee> list = ExcelImportUtil.importExcel(empFile.getInputStream(), Employee.class, params);
        list.forEach(e->{
            Department department = e.getDepartment();//拿部门
            if (department!=null){
                String name = e.getDepartment().getName();//拿到部门名称
                Department byName = departmentService.findByName(name);//根据部门名称拿到对应部门
                e.setDepartment(byName);//把部门放到员工对象去
            }
            employeeService.save(e);//把员工保存到数据库
        });
        return "uploading";
    }
  • DepartmentRepository-----------Department findByName(String name);
  • IDepartmentService ----------- Department findByName(String name);
  • DepartmentServiceImpl
    @Autowired
    private DepartmentRepository departmentRepository;

    @Override
    public Department findByName(String name) {
        return departmentRepository.findByName(name);
    }
   1.2.4 在EmployeeServiceImpl的判断里面加一句判断

传的时候会报错空指针,因为你在保存的时候加了密码加密的方法。传过去的时候没有密码,密码为空 就报500空指针
我们在EmployeeServiceImpl设一个初始密码

  • 就是一个三目运算,如果有密码就用它的,如果没有密码就设置初始密码。。。。
//这里加一句代码,设置初始面。因为上传时如果没有密码会报错---[三目运算 如果有就用他的,没有就默认]
String password = StringUtils.isNotBlank(employee.getPassword())?employee.getPassword():"123456";

 1.3 Excel导入校验

导入的时候想要做一些验证。比如用户名不能为空、年龄大于18小于60、邮件不能为空、用户名不能重复

  • 我们要做的就是 导入---成功的话就不管,如果失败的话就自动下载一个文件,这个文件里面写着失败的某条,并且把失败原因写在里面
   1.3.1 导入规范包JSR 303
        <!--JSR 303  规范包-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>
   1.3.2 Employee
    @Excel(name = "用户名")//一定要和Excel表上面对应上
    @NotNull//该字段不能为空
    private String username;
    private String password;
    @Excel(name = "邮件")
    @NotNull
    private String email;
    @Excel(name = "年龄")
    @Max(value = 60,message = "年龄不能超过60")
    @Min(value = 18,message = "年龄不能小于18")
    private Integer age;
   1.3.3 在Controller的方法中添加上验证
    //注入闸门写的工具类  专门自定义的验证
    @Autowired
    private EmployeeExcelVerifyHandler handler;
    ...
      @RequestMapping("/employeeJudge")
    public String employeeJudge(MultipartFile empFile, HttpServletResponse response)throws Exception{
        ImportParams params = new ImportParams();
        params.setHeadRows(1);//不要第0行
        params.setNeedVerfiy(true);//让他支持验证
        params.setVerifyHandler(handler);//加上咋们自己定义的验证
        //拿到导入的数据
        ExcelImportResult<Employee> result= ExcelImportUtil.importExcelMore(empFile.getInputStream(), Employee.class, params);
        //成功数据保存
        result.getList().forEach(e->{
            Department department = e.getDepartment();//拿部门
            if (department!=null){
                String name = e.getDepartment().getName();//拿到部门名称
                Department byName = departmentService.findByName(name);//根据部门名称拿到对应部门
                e.setDepartment(byName);//把部门放到员工对象去
            }
            employeeService.save(e);//把员工保存到数据库
        });

        //上面是正确了就保存,下面是错误了,导出来
        boolean verfiyFail = result.isVerfiyFail();//确认是否有错误数据
        if (verfiyFail) {//判断如果有错误信息就。。执行下面方法
            Workbook failWorkbook = result.getFailWorkbook();//当判断有就用流导出来
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Content-disposition", "attachment;filename=employee.xlsx");
            response.setHeader("Pragma", "No-cache");//设置不要缓存
            OutputStream ouputStream = response.getOutputStream();
            failWorkbook.write(ouputStream);
            ouputStream.flush();
            ouputStream.close();
        }
        return "uploading";
    }
   1.3.4 唯一性校验
  • 上面只是判断了不为空可年龄范围,下面来规范用户名不重复(唯一性校验)

  • 新建接口----【工具类EmployeeExcelVerifyHandler 】

/**
 * 自定义验证
 */
@Component//不知道什么层 的注解
public class EmployeeExcelVerifyHandler implements IExcelVerifyHandler<Employee>{

    @Autowired
    private IEmployeeService employeeService;

    @Override
    public ExcelVerifyHandlerResult verifyHandler(Employee employee) {
        ExcelVerifyHandlerResult excelVerifyHandlerResult = new ExcelVerifyHandlerResult(true);

        //通过用户名获取用户
        Employee byUsername = employeeService.findByUsername(employee.getUsername());

        if (byUsername!=null){
            //excelVerifyHandlerResult不为空,就代表这个用户是存在的,就应该添加失败
            excelVerifyHandlerResult = new ExcelVerifyHandlerResult(false,"用户名重复");
        }
        return excelVerifyHandlerResult;
    }
}

扫描之后就可以加入注入

  • 成功之后直接接入
  • 如果有错误数据---导出打印


    SpringMVC扫描

2、数据字典

  • 对于相同的表的抽取,注:没有什么业务意义的


EasyUIPOI官方文档:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容