poi导出excel

这篇文章写了一个最基本的POI导出xls格式的excel,从前端到后端的整个流程,代码如下。

web前端的代码很普通,只需要一个url,即可。

后端java的代码要用到poi的接口,将数据放置到对应的excel表格。

先说一下poi组织excel的层次,最上级的是Workbook,相当于一个excel文件,次一级是sheet,每个workbook可以有多个sheet(用过excel的都明白这个,不多做解释),每一行记录是一个Row,每个单元格是一个Cell。也可以设置单元格中数据的字体,样式等等,具体更多的功能,大家查API就可以了。

这里重点说一下,xls格式的excel用的具体类和xlsx格式的excel的具体类不一样,xls用的是HSSFWorkbook,xlsx用的是XSSFWorkbook。

好了,理论说完之后,代码亮相。


前端的代码:

/*导出文件*/
$("#export").click(function() {
var startDate = $("[name='startDate']").val();
var endDate = $("[name='endDate']").val();
window.open ('${pageContext.request.contextPath}/web/moneyExportUser.action?startDate=' + startDate + '&endDate=' + endDate);
});

这里用的window.open方法用来打开一个导出确认窗口,第一个参数就是跳转的路径,这个函数还有很多参数,具体可以百度。


后台的poi代码:

/**
* 我的资金列表导出
* @throws IOException 
*/
public void moneyExport() throws IOException {
Workbook workbook = null;
OutputStream os;
String moneyListFileName = new String("现金交易订单.xls");
Account moneyAccount = accountService.getAccount(webUser.getId(), 3); // 获得现金账户
// 计算现金账户余额
money = NumberUtil.add(
NumberUtil.sub(moneyAccount.getInAccount(),
moneyAccount.getOutAccount()),
NumberUtil.sub(moneyAccount.getUpAccount(),
moneyAccount.getDownAccount()));
money = NumberUtil.numberScale(money, 2);
TradeMoney tradeMoney = new TradeMoney();
tradeMoney.setUserId(webUser.getId());
tradeMoney.setTradeType(searchType);
try {
response.getOutputStream();// 取得输出流
response.reset();// 清空输出流
response.setHeader("Content-disposition", "attachment; filename="
+ new String(moneyListFileName.getBytes("GB2312"),
"ISO8859-1"));
// 设定输出文件头
response.setContentType("application/excel");// 定义输出类型
os = response.getOutputStream();
tradeMoneyList = tradeMoneyService.list(tradeMoney, pageNum,
numPerPage, startDate, endDate);
total = tradeMoneyList.getTotalCount();
tradeMoneyList = tradeMoneyService.list(tradeMoney, pageNum,
(int)total, startDate, endDate);
workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("现金交易订单");
Row row = sheet.createRow(0);
row.createCell(0).setCellValue("序号");
row.createCell(1).setCellValue("时间");
row.createCell(2).setCellValue("类型");
row.createCell(3).setCellValue("交易金额(元)");
row.createCell(4).setCellValue("结余(元)");
row.createCell(5).setCellValue("备注");
if (tradeMoneyList.size() != 0) {
List<String> idList = new ArrayList<String>();
for (int i = 0; i < tradeMoneyList.size(); i++) {
idList.add(tradeMoneyList.get(i).getId());
}


for (int i = 1; i <= tradeMoneyList.size(); i++) {
row = sheet.createRow(i);
row.createCell(0).setCellValue(i);
row.createCell(1).setCellValue(
tradeMoneyList.get(i - 1).getTradeTime());
if (tradeMoneyList.get(i - 1).getTradeType() == 1) {
row.createCell(2).setCellValue("充值");
} else if (tradeMoneyList.get(i - 1).getTradeType() == 2) {
row.createCell(2).setCellValue("提现");
}
row.createCell(3).setCellValue(
Double.parseDouble(tradeMoneyList.get(i - 1)
.getTradeMoney() + ""));
row.createCell(5).setCellValue(
tradeMoneyList.get(i - 1).getRemark());
}
}
workbook.write(os);
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}

上面代码中的tradeMoneyList是一个自己写的分页的list,继承arrayList,跟arrayList的原理是一样的,大家只要知道就可以了。

这里没有回调函数,直接将数据能过workbook.write(os);写入输出流,并传到前端的,也不需要做什么特殊处理。

重点就是response设置的几个参数,包括数据的类型,文件的名字等等,文件的名字如果是中文,要注意转换编码,以防会有乱码。

前端的window.open()方法会自动接收后端outputStream的数据,很简单的吧。

当然前端也有其他方式用来导出,有用iframe的,其他方法可以用作参考学习比较。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值