一 。 导出
    1.引入

    1. <dependency>
    2. <groupId>org.apache.poi</groupId>
    3. <artifactId>poi</artifactId>
    4. <version>3.17</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.apache.poi</groupId>
    8. <artifactId>poi-ooxml</artifactId>
    9. <version>3.17</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>org.apache.poi</groupId>
    13. <artifactId>poi-ooxml-schemas</artifactId>
    14. <version>3.14</version>
    15. </dependency>

    2.Controller代码

    写有大量数据的xlsx文件时,POI为我们提供了SXSSFWorkBook类来处理,代替HSSFWorkbook。但是还是有很多问题,推荐使用阿里开源EasyExcel

    1. /**
    2. * 导出数据到Excel表格
    3. * @param response
    4. * @param
    5. * @throws IOException
    6. */
    7. @RequestMapping(value = "export")
    8. @ResponseBody
    9. public void export(HttpServletResponse response,GradeEntity gradeEntity) throws IOException {
    10. //查询数据
    11. Integer id = gradeEntity.getId();
    12. Map<String ,Object> map = new HashMap<>();
    13. map.put("id",id);
    14. List<GradeEntity> gradeList = gradeService.selectLists(map);
    15. HSSFWorkbook wb = new HSSFWorkbook();//创建工作簿 HSSFWorkbook:Excel的文档对象
    16. HSSFFont font = wb.createFont();//设置字体大小 为什么要用wb.createFont呢 因为wb是主 font是包含这个里面的
    17. HSSFCellStyle style = wb.createCellStyle(); //设置单元格格式
    18. style.setAlignment(HorizontalAlignment.CENTER);//居中对齐格式
    19. style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
    20. font.setFontHeightInPoints((short) 28);//设置字体
    21. HSSFSheet sheet = wb.createSheet("等级信息表");//
    22. //为每一列添加居中样式
    23. sheet.setDefaultColumnStyle(0,style);
    24. sheet.setDefaultColumnStyle(1,style);
    25. sheet.setDefaultColumnStyle(2,style);
    26. sheet.setDefaultColumnStyle(3,style);
    27. sheet.setDefaultColumnStyle(4,style);
    28. sheet.setDefaultColumnStyle(5,style);
    29. sheet.setDefaultColumnStyle(6,style);
    30. HSSFRow row = null; //创建行
    31. row = sheet.createRow(0);//创建第一行单元格.就像数组一样是0开头的
    32. row.setHeight((short) (26.5 * 20));//设置行高
    33. row.createCell(0).setCellValue("等级信息表"); //设置第一行单元格设置值
    34. HSSFPatriarch patr = sheet.createDrawingPatriarch();//HSSFPatriarch poi的划线方法
    35. HSSFComment comment = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
    36. // 设置注释内容
    37. comment.setString(new HSSFRichTextString("状态 0:关闭,1:开启!"));
    38. //设置单元格合并 参数是:起始行号,终止行号, 起始列号,终止列号
    39. CellRangeAddress rowRegion = new CellRangeAddress(0, 0, 0, 2);
    40. sheet.addMergedRegion(rowRegion);
    41. //sheet是页 这个的意思在文档Sheet的第一行
    42. row = sheet.createRow(1);
    43. /* row.setHeight((short) (22.50 * 20));*/
    44. //设置单元格格式
    45. row.setHeight((short) (20.29 * 20));
    46. //第一行标签
    47. row.createCell(0).setCellValue("编号");
    48. row.createCell(1).setCellValue("等级名称");
    49. row.createCell(2).setCellValue("等级图标");
    50. row.createCell(3).setCellValue("等级值");
    51. row.createCell(4).setCellValue("等级");
    52. row.createCell(5).setCellValue("排序");
    53. row.createCell(6).setCellValue("状态");
    54. //遍历集合数据,产生数据行
    55. for (int i = 0; i < gradeList.size(); i++) {
    56. row = sheet.createRow(i + 2);
    57. GradeEntity grade = gradeList.get(i);
    58. //往表格添加数据
    59. row.createCell(0).setCellValue(grade.getId());
    60. row.createCell(1).setCellValue(grade.getName());
    61. row.createCell(2).setCellValue(grade.getIcon());
    62. row.createCell(3).setCellValue(grade.getIntegral());
    63. row.createCell(4).setCellValue(grade.getGrade());
    64. row.createCell(5).setCellValue(grade.getSort());
    65. row.createCell(6).setCellValue(grade.getStatus());
    66. //日期格式化
    67. /* SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    68. String time = sdf.format(userInfo1.getCreateDate());
    69. row.createCell(6).setCellValue(time);*/
    70. //状态处理 数据库存放的是0,1 我写的麻烦 你们自己处理吧
    71. Integer status = grade.getStatus();
    72. String status1 = null;
    73. if (status == 0) {
    74. status1 = "关闭";
    75. row.createCell(6).setCellValue(status1);
    76. } else {
    77. row.createCell(6).setCellValue("开启");
    78. }
    79. }
    80. sheet.setDefaultRowHeight((short) (20.29 * 20));
    81. for (int i = 0; i <= 6; i++) {
    82. sheet.autoSizeColumn(i);//自动行高
    83. }
    84. response.setContentType("UTF-8"); //设置格式为UTF-8 不然可能会乱码
    85. response.setContentType("application/vnd.ms-excel;charset=utf-8");
    86. //output流得到流
    87. OutputStream os = response.getOutputStream();
    88. String fileName = "用户报名信息";//导出得文件名字
    89. String downloadFileName=new String(fileName.getBytes("utf-8"),"iso8859-1");
    90. response.setHeader("Content-Disposition", "attachment;filename="+downloadFileName+".xls");
    91. wb.write(os);
    92. os.flush();//刷新流
    93. os.close();//关闭流
    94. }

    3.layui前端按钮(其他按钮自定)

    1. <script type="text/html" id="tableBar">
    2. @if(shiro.hasPermission("/grade/update")){
    3. <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
    4. @}
    5. @if(shiro.hasPermission("/grade/delete")){
    6. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
    7. @}
    8. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="export" href="/grade/export" >导出</a>
    9. </script>
    10. @}

    二.导入Excel 到数据库
    ————————Controller代码:

    1. /**
    2. * 导入数据到数据库
    3. *
    4. * @param request
    5. * @param
    6. * @throws IOException
    7. */
    8. @RequestMapping(value = "/import")
    9. @ResponseBody
    10. public GradeEntity imports(MultipartFile file, HttpServletRequest request) throws IOException {
    11. GradeEntity grade= new GradeEntity();
    12. try {
    13. /*List<GradeEntity> typeLists = new ArrayList<GradeEntity>();*/
    14. //使用POI解析Excel文件
    15. //如果是xls,使用HSSFWorkbook;2003年的excel 如果是xlsx,使用XSSFWorkbook 2007年excel
    16. HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream()); //前台传过来的文件
    17. /*HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(ResourceUtils.getFile("F:/import.xls")));*/ //写死的路径
    18. //根据名称获得指定Sheet对象
    19. HSSFSheet hssfSheet = workbook.getSheetAt(0);
    20. for (Row row : hssfSheet) {
    21. int rowNum = row.getRowNum();
    22. if (rowNum == 0) {//跳出第一行 一般第一行都是表头没有数据意义
    23. continue;
    24. }
    25. //编号
    26. if (row.getCell(0) != null) {//第1列数据
    27. row.getCell(0).setCellType(CellType.STRING);
    28. grade.setId(Integer.parseInt(row.getCell(0).getStringCellValue()));
    29. }
    30. //等级名称
    31. if (row.getCell(1) != null) {//第2列
    32. row.getCell(1).setCellType(CellType.STRING);
    33. grade.setName(row.getCell(1).getStringCellValue());
    34. }
    35. //等级图标
    36. if (row.getCell(2) != null) {//第3列
    37. row.getCell(2).setCellType(CellType.STRING);
    38. grade.setIcon(row.getCell(2).getStringCellValue());
    39. }
    40. //等级值
    41. // 转换为Integer类
    42. if (row.getCell(3) != null) {//第4列
    43. row.getCell(3).setCellType(CellType.STRING);
    44. grade.setIntegral(Integer.parseInt(row.getCell(3).getStringCellValue()));
    45. }
    46. /*// 转换为日期类型
    47. if(row.getCell(4)!=null){//第5列
    48. row.getCell(4).setCellType(Cell.CELL_TYPE_NUMERIC);
    49. grade.setAddtime( HSSFDateUtil.getJavaDate(row.getCell(4).getNumericCellValue()));
    50. }*/
    51. //等级
    52. if (row.getCell(4) != null) {//第5列
    53. row.getCell(4).setCellType(CellType.STRING);
    54. grade.setGrade(Integer.parseInt(row.getCell(4).getStringCellValue()));
    55. }
    56. //排序
    57. if (row.getCell(5) != null) {//第6列
    58. row.getCell(5).setCellType(CellType.STRING);
    59. grade.setSort(Integer.parseInt(row.getCell(5).getStringCellValue()));
    60. }
    61. //状态
    62. if (row.getCell(6) != null) {//第7列
    63. row.getCell(6).setCellType(CellType.STRING);
    64. if ("开启".equals(grade.getSort())) {
    65. grade.setStatus(1);
    66. } else {
    67. grade.setStatus(0);
    68. }
    69. }
    70. /* typeLists.add(grade);*/
    71. //调用service执行保存typeLists的方法
    72. gradeService.insert(grade);//添加每一条数据
    73. }
    74. } catch (Exception e) {
    75. e.printStackTrace();
    76. }
    77. return grade;//使用layui前端上传文件 所以需要返回一个值(也可不返回,依照前端而定)
    78. }

    —————layui前端实现:
    JS代码:

    1. //导入Excel
    2. upload.render({
    3. elem: '#import'
    4. , url: "/grade/import"
    5. ,accept: 'file'
    6. ,exts: 'xls|xlsx' //只允许上传Excel文件
    7. ,done: function(res){
    8. alert("导入成功!")
    9. //刷新表格
    10. tableResult.reload();
    11. }
    12. });
    1. HTMl代码:
    2. <div class=" layui-upload">
    3. <button type="button" class="layui-btn layui-btn-normal" id="import">导入</button><!--导入Excel-->
    4. </div>