开发中难免会遇到要导出数据到excel的,网上有很多方法,但是看起来都很复杂的样子,写得代码非常多,让人望而止步。我做一个简单的导出excel表格功能.只需4步就能实现
1、添加依赖
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.10</version>
</dependency>
2、页面调用
$('#btn_dc').on('click', function () {
location.href='yxjgl.do?action=get_export_data&JGBM='+$('#jg').val()+'&name='+(moment().format('YYYY-MM-DD')+"导出意向金数据")
});
3、controller代码
@RequestMapping(params = ("action=get_export_data"))
@ResponseBody
public void get_export_data(HttpServletRequest request, HttpServletResponse response) {
initMap(request);
//使用LinkedHashMap,因为防止下面下面循环数据错乱,因为这个是有序的map
//查询数据库数据
List<LinkedHashMap> exportlist = yxjmanagementservice.get_export_data(map);
//表格列名用ArrayList装载
List<String> columns = new ArrayList<>();
//设置excel表格中的列名
columns.add("长者姓名");
columns.add("性别");
columns.add("年龄");
columns.add("联系电话");
columns.add("收费金额");
columns.add("收费时间");
columns.add("收费人");
//点击导出按钮的时候,页面上显示的标题,同时也是sheet的名称
String filename = map.get("name").toString();
try {
//处理一下中文乱码问题
response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1") + ".xls");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//以上均为数据准备,下面开始调用导出excel工具类
exportToExcel(response, exportlist, filename, columns);
}
4、exportToExcel、isNumber方法
public static int exportToExcel(HttpServletResponse response, List<LinkedHashMap> 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);
// //设置样式,字体
WritableCellFormat wcf = new WritableCellFormat(font1);
//背景颜色
wcf.setBackground(jxl.format.Colour.YELLOW);
wcf.setAlignment(Alignment.CENTRE); //平行居中
wcf.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
//判断一下表头数组是否有数据
if (columns != null && columns.size() > 0) {
//循环写入表头
for (int i = 0; i < columns.size(); i++) {
ws.setColumnView(i, 20);//设置列宽
/*
* 添加单元格(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(".") && 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 {
content = String.valueOf(map.get(o));
ws.addCell(new Label(j, i + 1, content));
}
j++;
}
}
} 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;
}
public static Boolean isNumber(String tg) {
if (isNotEmpty(tg)) {
try {
Double.valueOf(tg);
return true;
} catch (NumberFormatException e) {
}
}
return false;
}