java导出数据到excel表格的最简单实现
导出excel整理
开发中难免会遇到要导出数据到excel的,网上有很多方法,但是看起来都很复杂的样子,写得又非常多代码,让人望而止步.我做一个简单的导出excel表格功能.这是我在工作上用到的.
1.需要用到的jar
<dependency>
|
我将会从前端请求开始一直到controller的测试方法,最后到工具类.
首先是前端页面,我用的是layui,项目使用的框架是springboot+springcloud,对这个导出功能没有太大影响,在其他框架也是可以用的,除非你的不是maven,那也无所谓,下载jar就可以了.
前端页面js如下:
自己写一个跳转发方法,跳转到controller触发导出方法
Controller中的方法,代码如下:
这是我做的一个测试代码,数据都是随便填写,如果是从数据库查询到的数据,自己做个改动就可以了,这些都是简单的,我就不做演示.
@RequestMapping(value = "exportStatisticsReport", method = RequestMethod.GET)
public void exportStatisticsReport(HttpServletRequest request, HttpServletResponse response){
Map<String,Object> map = getParameterNames(request);
//使用LinkedHashMap,因为这个是有序的map
LinkedHashMap<String,Object> reportData = new LinkedHashMap<>();
//装载数据,就是要导出到excel的数据
reportData.put("test1","流水号");
reportData.put("test2","辖区");
reportData.put("test3","业务状态");
reportData.put("test4","企业名称");
reportData.put("test5","网点");
//把要导出到excel的数据的LinkedHashMap装载到这个List里面,这是导出工具类要求封装格式.
List<Map<String, Object>> exportData = new ArrayList<>();
exportData.add(reportData);
//表格列名用ArrayList装载
List<String> columns = new ArrayList<>();
//设置excel表格中的列名
columns.add("流水号");
columns.add("辖区");
columns.add("业务状态");
columns.add("企业名称");
columns.add("网点");
//点击导出按钮的时候,页面上显示的标题,同时也是sheet的名称
String filename ="测试导出excel";
try {
//处理一下中文乱码问题
response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes("gb2312"), "ISO8859-1")+".xls");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//以上均为数据准备,下面开始调用导出excel工具类
ExportExcel.exportToExcel(response, exportData, filename, columns);
}
最后,我们再来看看导出excel的工具类
至于工具类中是如何实现的,我们不需要去关心,里面的注释我写得非常清楚,有兴趣的可以去看看.我们要关注的是该方法的参数列表.
这个方法需要用到的参数有以下4个:
1.HttpServletResponse response:这个不用解释吧
2.List<Map<String, Object>> objData:这个是装载要导出到excel的数据,在controller方法里面已经写得非常清楚.
3.String sheetName:这个是excel表格中sheet的名称,同时也可以作为下载的时候显示的文件名.
4.List<String> columns:这个参数是装载excel表格列名的集合,在controller方法里面也写得非常清楚了.
我们只要按照方法参数规定的格式提供参数给方法,就可以了.
导出excel工具类中的第一个方法代码如下: 下面这个代码看看就好,要用的时候直接拿去用
这个工具类可以在这里下载:
https://gitee.com/qsa2019/export_excel_tool_class.git
public class ExportExcel {
public static int exportToExcel(HttpServletResponse response,
List<Map<String, Object>> objData, String sheetName,
List<String> columns) {
int flag = 0;
//声明工作簿jxl.write.WritableWorkbook
WritableWorkbook wwb;
try {
//根据传进来的file对象创建可写入的Excel工作薄
OutputStream os = response.getOutputStream();
wwb = jxl.Workbook.createWorkbook(os);
/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。
* createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet ws = wwb.createSheet(sheetName, 0);
SheetSettings ss = ws.getSettings();
ss.setVerticalFreeze(1);//冻结表头
WritableFont font1 = new WritableFont(WritableFont.createFont("微软雅黑"), 10, WritableFont.BOLD);
// WritableFont font2 =new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);
WritableCellFormat wcf = new WritableCellFormat(font1);
// WritableCellFormat wcf2 = new WritableCellFormat(font2);
// WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式,字体
//创建单元格样式
//WritableCellFormat wcf = new WritableCellFormat();
//背景颜色
// wcf.setBackground(jxl.format.Colour.YELLOW);
// wcf.setAlignment(Alignment.CENTRE); //平行居中
// wcf.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
// wcf3.setAlignment(Alignment.CENTRE); //平行居中
// wcf3.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
// wcf3.setBackground(Colour.LIGHT_ORANGE);
// wcf2.setAlignment(Alignment.CENTRE); //平行居中
// wcf2.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
/*
* 这个是单元格内容居中显示
* 还有很多很多样式
*/
// wcf.setAlignment(Alignment.CENTRE);
//判断一下表头数组是否有数据
if (columns != null && columns.size() > 0) {
//循环写入表头
for (int i = 0; i < columns.size(); i++) {
ws.setColumnView(i, 28);//设置列宽
// ws.setRowView(i+1, 600, false); //设置行高
/*
* 添加单元格(Cell)内容addCell()
* 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型
* 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
* Label(i, 0, columns[i], wcf)
* 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
ws.addCell(new Label(i, 0, columns.get(i), wcf));
}
//判断表中是否有数据
if (objData != null && objData.size() > 0) {
//循环写入表中数据
for (int i = 0; i < objData.size(); i++) {
//转换成map集合{activyName:测试功能,count:2}
Map<String, Object> map = objData.get(i);
//循环输出map中的子集:既列值
int j = 0;
DecimalFormat decimalFormat = new DecimalFormat("0.00");
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
for (Object o : map.keySet()) {
//ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
String content = "";
if (map.get(o).toString().contains(".") && CommonUtils.isNumber(map.get(o).toString())) {
content = decimalFormat.format(Float.valueOf(map.get(o).toString()));
ws.addCell(new Label(j, i + 1, content));
} else if (map.get(o).toString().contains("-") && map.get(o).toString().contains(":")) {
content = String.valueOf(map.get(o)).split("\\.")[0];
ws.addCell(new Label(j, i + 1, content));
}
//图片处理
// else if (map.get(o).toString().contains("http") || map.get(o).toString().contains("https")){
// ws.setColumnView(j, 15);//设置列宽
// String path ="/resources/"+ String.valueOf(map.get(o)).split("upload/")[1];
// File imgFile = new File(path);
// WritableImage image = new WritableImage(j,i+1,1,1,imgFile);
// ws.addImage(image);
// }
else {
content = String.valueOf(map.get(o));
ws.addCell(new Label(j, i + 1, content));
}
j++;
}
/* for(int b=0;b<map.size();b++){
ws.addCell(new Label(b,i+1,String.valueOf(map.get(String.valueOf(b)))));
}*/
}
} else {
flag = -1;
}
//写入Exel工作表
wwb.write();
//关闭Excel工作薄对象
wwb.close();
//关闭流
os.flush();
os.close();
}
} catch (IllegalStateException e) {
System.err.println(e.getMessage());
} catch (Exception ex) {
flag = 0;
ex.printStackTrace();
}
return flag;
}
最后测试一下:
点击导出按钮,页面底部就出现这个:说明导出成功!!!