一 。 导出
1.引入
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.14</version></dependency>
2.Controller代码
写有大量数据的xlsx文件时,POI为我们提供了SXSSFWorkBook类来处理,代替HSSFWorkbook。但是还是有很多问题,推荐使用阿里开源EasyExcel
/*** 导出数据到Excel表格* @param response* @param* @throws IOException*/@RequestMapping(value = "export")@ResponseBodypublic void export(HttpServletResponse response,GradeEntity gradeEntity) throws IOException {//查询数据Integer id = gradeEntity.getId();Map<String ,Object> map = new HashMap<>();map.put("id",id);List<GradeEntity> gradeList = gradeService.selectLists(map);HSSFWorkbook wb = new HSSFWorkbook();//创建工作簿 HSSFWorkbook:Excel的文档对象HSSFFont font = wb.createFont();//设置字体大小 为什么要用wb.createFont呢 因为wb是主 font是包含这个里面的HSSFCellStyle style = wb.createCellStyle(); //设置单元格格式style.setAlignment(HorizontalAlignment.CENTER);//居中对齐格式style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中font.setFontHeightInPoints((short) 28);//设置字体HSSFSheet sheet = wb.createSheet("等级信息表");////为每一列添加居中样式sheet.setDefaultColumnStyle(0,style);sheet.setDefaultColumnStyle(1,style);sheet.setDefaultColumnStyle(2,style);sheet.setDefaultColumnStyle(3,style);sheet.setDefaultColumnStyle(4,style);sheet.setDefaultColumnStyle(5,style);sheet.setDefaultColumnStyle(6,style);HSSFRow row = null; //创建行row = sheet.createRow(0);//创建第一行单元格.就像数组一样是0开头的row.setHeight((short) (26.5 * 20));//设置行高row.createCell(0).setCellValue("等级信息表"); //设置第一行单元格设置值HSSFPatriarch patr = sheet.createDrawingPatriarch();//HSSFPatriarch poi的划线方法HSSFComment comment = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));// 设置注释内容comment.setString(new HSSFRichTextString("状态 0:关闭,1:开启!"));//设置单元格合并 参数是:起始行号,终止行号, 起始列号,终止列号CellRangeAddress rowRegion = new CellRangeAddress(0, 0, 0, 2);sheet.addMergedRegion(rowRegion);//sheet是页 这个的意思在文档Sheet的第一行row = sheet.createRow(1);/* row.setHeight((short) (22.50 * 20));*///设置单元格格式row.setHeight((short) (20.29 * 20));//第一行标签row.createCell(0).setCellValue("编号");row.createCell(1).setCellValue("等级名称");row.createCell(2).setCellValue("等级图标");row.createCell(3).setCellValue("等级值");row.createCell(4).setCellValue("等级");row.createCell(5).setCellValue("排序");row.createCell(6).setCellValue("状态");//遍历集合数据,产生数据行for (int i = 0; i < gradeList.size(); i++) {row = sheet.createRow(i + 2);GradeEntity grade = gradeList.get(i);//往表格添加数据row.createCell(0).setCellValue(grade.getId());row.createCell(1).setCellValue(grade.getName());row.createCell(2).setCellValue(grade.getIcon());row.createCell(3).setCellValue(grade.getIntegral());row.createCell(4).setCellValue(grade.getGrade());row.createCell(5).setCellValue(grade.getSort());row.createCell(6).setCellValue(grade.getStatus());//日期格式化/* SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = sdf.format(userInfo1.getCreateDate());row.createCell(6).setCellValue(time);*///状态处理 数据库存放的是0,1 我写的麻烦 你们自己处理吧Integer status = grade.getStatus();String status1 = null;if (status == 0) {status1 = "关闭";row.createCell(6).setCellValue(status1);} else {row.createCell(6).setCellValue("开启");}}sheet.setDefaultRowHeight((short) (20.29 * 20));for (int i = 0; i <= 6; i++) {sheet.autoSizeColumn(i);//自动行高}response.setContentType("UTF-8"); //设置格式为UTF-8 不然可能会乱码response.setContentType("application/vnd.ms-excel;charset=utf-8");//output流得到流OutputStream os = response.getOutputStream();String fileName = "用户报名信息";//导出得文件名字String downloadFileName=new String(fileName.getBytes("utf-8"),"iso8859-1");response.setHeader("Content-Disposition", "attachment;filename="+downloadFileName+".xls");wb.write(os);os.flush();//刷新流os.close();//关闭流}
3.layui前端按钮(其他按钮自定)
<script type="text/html" id="tableBar">@if(shiro.hasPermission("/grade/update")){<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>@}@if(shiro.hasPermission("/grade/delete")){<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>@}<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="export" href="/grade/export" >导出</a></script>@}
二.导入Excel 到数据库
————————Controller代码:
/*** 导入数据到数据库** @param request* @param* @throws IOException*/@RequestMapping(value = "/import")@ResponseBodypublic GradeEntity imports(MultipartFile file, HttpServletRequest request) throws IOException {GradeEntity grade= new GradeEntity();try {/*List<GradeEntity> typeLists = new ArrayList<GradeEntity>();*///使用POI解析Excel文件//如果是xls,使用HSSFWorkbook;2003年的excel 如果是xlsx,使用XSSFWorkbook 2007年excelHSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream()); //前台传过来的文件/*HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(ResourceUtils.getFile("F:/import.xls")));*/ //写死的路径//根据名称获得指定Sheet对象HSSFSheet hssfSheet = workbook.getSheetAt(0);for (Row row : hssfSheet) {int rowNum = row.getRowNum();if (rowNum == 0) {//跳出第一行 一般第一行都是表头没有数据意义continue;}//编号if (row.getCell(0) != null) {//第1列数据row.getCell(0).setCellType(CellType.STRING);grade.setId(Integer.parseInt(row.getCell(0).getStringCellValue()));}//等级名称if (row.getCell(1) != null) {//第2列row.getCell(1).setCellType(CellType.STRING);grade.setName(row.getCell(1).getStringCellValue());}//等级图标if (row.getCell(2) != null) {//第3列row.getCell(2).setCellType(CellType.STRING);grade.setIcon(row.getCell(2).getStringCellValue());}//等级值// 转换为Integer类if (row.getCell(3) != null) {//第4列row.getCell(3).setCellType(CellType.STRING);grade.setIntegral(Integer.parseInt(row.getCell(3).getStringCellValue()));}/*// 转换为日期类型if(row.getCell(4)!=null){//第5列row.getCell(4).setCellType(Cell.CELL_TYPE_NUMERIC);grade.setAddtime( HSSFDateUtil.getJavaDate(row.getCell(4).getNumericCellValue()));}*///等级if (row.getCell(4) != null) {//第5列row.getCell(4).setCellType(CellType.STRING);grade.setGrade(Integer.parseInt(row.getCell(4).getStringCellValue()));}//排序if (row.getCell(5) != null) {//第6列row.getCell(5).setCellType(CellType.STRING);grade.setSort(Integer.parseInt(row.getCell(5).getStringCellValue()));}//状态if (row.getCell(6) != null) {//第7列row.getCell(6).setCellType(CellType.STRING);if ("开启".equals(grade.getSort())) {grade.setStatus(1);} else {grade.setStatus(0);}}/* typeLists.add(grade);*///调用service执行保存typeLists的方法gradeService.insert(grade);//添加每一条数据}} catch (Exception e) {e.printStackTrace();}return grade;//使用layui前端上传文件 所以需要返回一个值(也可不返回,依照前端而定)}
—————layui前端实现:
JS代码:
//导入Excelupload.render({elem: '#import', url: "/grade/import",accept: 'file',exts: 'xls|xlsx' //只允许上传Excel文件,done: function(res){alert("导入成功!")//刷新表格tableResult.reload();}});
HTMl代码:<div class=" layui-upload"><button type="button" class="layui-btn layui-btn-normal" id="import">导入</button><!--导入Excel--></div>
