您的位置:首页 > 编程语言 > Java开发

Java利用POI实现导出excel文件

2017-03-03 16:53 295 查看
项目中要实现导出excel功能,下面是一个公共方法:

环境:JDK1.8,poi-3.14

项目中js请求是ajax请求。

因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。

本例中我们先将excel文件下载到服务端,然后前台点击导出excel按钮,从服务端下载相应的文件。

下面代码片是DataExportUtil工具类,控制层传入3个参数就可以实现excel导出:

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.context.ContextLoader;

/**
* 导出excel工具类
* 导出的excel是存在于项目的src/main/webapp/export目录下,如修改,请在84行设置
* @author
*
*/
public class DataExportUtil
{
/**
* 导出excle
* @param sheetName 表名
* @param titleColumns 表头
* @param list 要导出的数据
* @throws IOException
*/
public static String exportDataToExcel(String sheetName, String[] titleColumns, List


下面是js请求的代码,ajax请求我们是封装了下的:

$('#export-table-excle').on('click',function(){
var tableHeader = "项目名称,项目编号,客户名称,客户联系人,活动名称,活动日期,活动地点,我方参与人员,活动目的,会议纪要,关键问题及困难说明,评分";
var params = {
"other": {
"isManager": isManager,
"shortNo": shortNo,
"tableHeader": tableHeader,
"sheetName": "客户公关活动汇总"
}
}
demo.ajax.postUrl("/summary/getExcel.serv", params,
function (ret) {
if (ret != null && ret.code != null && ret.code.code != null && ret.code.code == '0000') {
var name = ret.bo; //name是excel的文件名
var url = "127.0.0.1:8080/demo/export/" + name; //在项目webapp下的export文件夹下载文件
window.open("http://" + url);
}
else {
//服务器操作失败,不关闭对话框
}
return;
}
);

});


下面是控制层代码:

@RequestMapping(value = "/getExcel.serv", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ServiceData getExcel(HttpServletRequest request, @RequestBody FormData<SummaryListModel> form) throws Exception
{
//返回统一的服务端数据
ServiceData ret = new ServiceData();
Map<String, Object> map = new HashMap<String, Object>();
//传入url参数
if (form.getOther().containsKey("shortNo") && form.getOther().containsKey("isManager"))
{
String shortNo = (String)form.getOther().get("shortNo");
String isManager = (String)form.getOther().get("isManager");
//设置查询条件
map.put("shortNo", shortNo);
map.put("isManager", isManager);
}
String tableHeader = (String)form.getOther().get("tableHeader");
String[] titleColumns = tableHeader.trim().split(","); //获取表头
String sheetName = (String)form.getOther().get("sheetName"); //获取表名
List<Object[]> dataList = new ArrayList<Object[]>();
dataList = summaryService.getList(map); //查询数据库中数据,获取数据
String name = DataExportUtil.exportDataToExcel(sheetName, titleColumns, dataList); //调用导出excel工具类
ret.setCode(request, ServiceData.RetCode.Success);
ret.setBo(name);
return ret;
}


如果js使用的不是基于ajax的请求,如果是form表单提交,那么控制层可以写为:

@RequestMapping(value = "/getExcel.serv", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ServiceData getExcel(HttpServletRequest request, HttpServletResponse response, @RequestBody FormData<SummaryListModel> form) throws Exception
{
//返回统一的服务端数据
ServiceData ret = new ServiceData();
Map<String, Object> map = new HashMap<String, Object>();
//传入url参数
if (form.getOther().containsKey("shortNo") && form.getOther().containsKey("isManager"))
{
String shortNo = (String)form.getOther().get("shortNo");
String isManager = (String)form.getOther().get("isManager");
//设置查询条件
map.put("shortNo", shortNo);
map.put("isManager", isManager);
}
String tableHeader = (String)form.getOther().get("tableHeader");
String[] titleColumns = tableHeader.trim().split(","); //获取表头
String sheetName = (String)form.getOther().get("sheetName"); //获取表名

try{
//设置header
response.setHeader("Content-Disposition","attachment; filename=\""+new String((sheetName).getBytes("gb2312"),"ISO-8859-1")+".xls\"");
OutputStream out = response.getOutputStream();
List<Object[]> dataList = new ArrayList<Object[]>();
dataList = summaryService.getList(map); //查询数据库中数据,获取数据
//此时将工具类中的参数改为4个,exportDataToExcel、writeToFile方法上加上OutputStream out,工具类中的writeToFile方法try中修改为
//workbook.write(out);  这一条语句就ok了,浏览器会自动弹出选择文件夹的框
String name = DataExportUtil.exportDataToExcel(out,sheetName, titleColumns, dataList); //调用导出excel工具类
ret.setCode(request, ServiceData.RetCode.Success);
ret.setBo(name);
out.close();
}catch (IOException e) {
e.printStackTrace();
}

return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java HSSF Excel