一 。 导出
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")
@ResponseBody
public 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")
@ResponseBody
public 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年excel
HSSFWorkbook 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代码:
//导入Excel
upload.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>