对于导入导出这个功能,真的是研究了好久,最后终于学会使用。现在讲导入导出的具体操作方法进行整理,方便以后使用。
我所做的web项目使用的框架是springboot+shiro+mybatis+layui+jsp
现在先看看项目架构是如何搭建:
首先先建好 entity、dao、service、serviceImpl、controller、common、architect 等包名
现在先进行导出操作:
1 在pom.xml 文件中引入freemarker的依赖
org.freemarker
freemarker
2.3.22
junit
junit
4.10
2 在architect包下建立子包 utils包 然后在utils包中建立导入导出所使用的工具类 类名为:TemplateParseUtil
代码附录如下:
package com.wlsj.fgw.architect.utils;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.junit.Test;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: kdafang[[email protected]]
* @Date: 2018-8-9 10:11
*/
public class TemplateParseUtil {
/**
* 解析模板生成Excel
* @param templateDir 模板目录
* @param templateName 模板名称
* @param excelPath 生成的Excel文件路径
* @param data 数据参数
* @throws IOException
* @throws TemplateException
*/
public static void parse(String templateDir,String templateName,String excelPath,Map data) throws IOException, TemplateException {
//初始化工作
Configuration cfg = new Configuration();
//设置默认编码格式为UTF-8
cfg.setDefaultEncoding("UTF-8");
//全局数字格式
cfg.setNumberFormat("0.00");
//设置模板文件位置
cfg.setDirectoryForTemplateLoading(new File(templateDir));
cfg.setObjectWrapper(new DefaultObjectWrapper());
//加载模板
Template template = cfg.getTemplate(templateName,"utf-8");
OutputStreamWriter writer = null;
try{
//填充数据至Excel
writer = new OutputStreamWriter(new FileOutputStream(excelPath),"UTF-8");
template.process(data, writer);
writer.flush();
}finally{
writer.close();
}
}
/**
* 解析模板返回字节数组
* @param templateDir 模板目录
* @param templateName 模板名称
* @param data 数据参数
* @throws IOException
* @throws TemplateException
*/
public static byte[] parse(String templateDir,String templateName,Map data) throws TemplateException, IOException{
Configuration cfg = new Configuration();
cfg.setDefaultEncoding("UTF-8");
cfg.setNumberFormat("0.00");
cfg.setDirectoryForTemplateLoading(new File(templateDir));
cfg.setObjectWrapper(new DefaultObjectWrapper());
Template template = cfg.getTemplate(templateName,"utf-8");
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
Writer out = new OutputStreamWriter(outStream,"UTF-8");
template.process(data, out);
return outStream.toByteArray();
}
/**
* 自定义模板字符串解析
* @param templateStr 模板字符串
* @param data 数据
* @return 解析后的字符串
* @throws IOException
* @throws TemplateException
*/
public static String parse(String templateStr, Map data)
throws IOException, TemplateException {
Configuration cfg = new Configuration();
cfg.setNumberFormat("#.##");
//设置装载模板
StringTemplateLoader stringLoader = new StringTemplateLoader();
stringLoader.putTemplate("myTemplate", templateStr);
cfg.setTemplateLoader(stringLoader);
//加载装载的模板
Template temp = cfg.getTemplate("myTemplate", "utf-8");
Writer out = new StringWriter();
temp.process(data, out);
return out.toString();
}
@Test
public void excelTest(){
//测试Excel文件生成
Map data = new HashMap();
try {
parse("C:\\Users\\kdafang\\Desktop\\qqq", "town1.ftl", "C:\\Users\\kdafang\\Desktop\\qqq\\11.xls", data);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TemplateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3 因为我使用的是layui前端框架,所以 前端代码使用layui 的格式来描写 现在就以这个前端页面的导出为例:
4 在jsp页面 创建一个按钮 代码如下:
数据导出
js 代码如下:
$(".excel_btn").click(function()
{ //获取选中数据
var checkStatus = table.checkStatus('TableId')
, data = checkStatus.data;
if (data.length == 0) {
$.post("/project/excelProject", {"pIds[]": null}, function (data) {
if (data.code == 200) {
window.location.href = "/upload/excel/project.xls";
layer.msg('下载全部数据成功!', {
time: 500,
});
} else {
layer.msg('下载失败,请联系管理员', {
time: 5000,
});
}
})
return;
} else {
var excelList = [];
for (var i in data) {
excelList.push(data[i].projectCreateId);
}
layer.confirm('是否要导出选择项?', {
btn: ['确定', '取消'] //按钮
}, function () {
$.post("/project/excelProject", {"pIds[]": excelList}, function (data) {
if (data.code == 200) {
window.location.href = "/upload/excel/project.xls";
layer.msg('下载成功!', {
time: 500,
});
} else {
layer.msg('下载失败,请联系管理员', {
time: 5000,
});
}
})
}, function () {
layer.msg('关闭', {
time: 1000, //1秒后自动关闭
});
});
}
});
});
controller 代码如下:
/**
* @function: 数据导出
* @author: [email protected] lyz
* @date: 2018/9/11 15:37
*/
@ResponseBody
@RequestMapping("excelProject")
public Map excelProject(@RequestParam("pIds[]") int pIds[], HttpServletRequest request){
Map map = new HashMap();
List list=new ArrayList<>();
if(pIds.length==0){
list = projectService.findProjectById(null);
}else {
for (Integer pids : pIds) {
List tmpList= projectService.findProjectById(Integer.toString(pids));
list.add(tmpList.get(0));
}
}
//生成excel
Map data = new HashMap();
data.put("listData",list);
data.put("size",list.size());
Calendar date = Calendar.getInstance();
String year = String.valueOf(date.get(Calendar.YEAR));
data.put("year",year);
String path = request.getSession().getServletContext().getRealPath("/") + "upload/freemarker/";
String ftlName="project.ftl";
String fileName= request.getSession().getServletContext().getRealPath("/")+ "upload/excel/project.xls";
try {
TemplateParseUtil.parse(path, ftlName, fileName, data);
map.put("code","200");
}catch (Exception e){
map.put("msg","excel生成失败");
}
return map;
}
因为 代码实在太多,如果有想深入了解的朋友 可以关注我的公众号:3分钟秒懂大数据 进行详细咨询