使用Java导出Excel表格并由浏览器直接下载——基于POI框架
非异步方法
/**
* 使用Java导出Excel表格并由浏览器直接下载——基于POI框架
*
* @param response
* @return
* @throws IllegalAccessException
* @throws IOException
*/
@RequestMapping(value = "/export2", method = RequestMethod.GET)
public ResponseObj<Boolean> export2(HttpServletResponse response) throws IllegalAccessException, IOException {
//文件名
String fileName = "活动报名情况一览表";
//sheet名
String sheetName = "sheet";
List<String> titleList = new ArrayList<>();
titleList.add("name");
titleList.add("address");
List<Student> dataList = new ArrayList<>();
dataList.add(new Student("张三", "连云港"));
dataList.add(new Student("李四", "连云港"));
// //如果我不想设置任何列为下拉选项,那我调用的时候将最后一个参数传入null即可。如果想设置某一列或某几列为下拉选项,那我调用的时候只需要这样(省略其他代码):
// String[] params = new String[]{"是","否"};
// //从第一行开始,到最后一行结束,设置第4列为下拉选项
// OutExcelQuery outExcelQuery = new OutExcelQuery(1,-1,3,3,params);
OutExcelQuery outExcelQuery = null;
HSSFWorkbook workbook = service.createExcel(sheetName, titleList, dataList, outExcelQuery);
//输出Excel文件
OutputStream output = response.getOutputStream();
response.reset();
//中文名称要进行编码处理
response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GB2312"),
"ISO-8859-1") + ".xls");
response.setContentType("application/x-xls");
workbook.write(output);
output.close();
return new ResponseObj<>(true, null);
}
/**
* 生成Excel表格
* @param sheetName sheet名称
* @param titleList 表头列表
* @param dataList 数据列表
* @param outExcelQuery 下拉选项设置
* @return HSSFWorkbook对象
* */
public static HSSFWorkbook createExcel(String sheetName, List<String> titleList,
List dataList, OutExcelQuery outExcelQuery) throws IllegalAccessException {
//创建HSSFWorkbook对象(excel的文档对象)
HSSFWorkbook wb = new HSSFWorkbook();
//创建sheet对象(excel的表单)
HSSFSheet sheet=wb.createSheet(sheetName);
//在sheet里创建第一行,这里即是表头
HSSFRow rowTitle=sheet.createRow(0);
//写入表头的每一个列
for (int i = 0; i < titleList.size(); i++) {
//创建单元格
rowTitle.createCell(i).setCellValue(titleList.get(i));
}
int count = 0;
//写入每一行的记录
if (dataList!=null){
for (int i = 0; i < dataList.size(); i++) {
count++;
//创建新的一行,递增
HSSFRow rowData = sheet.createRow(i+1);
//通过反射,获取POJO对象
Class cl = dataList.get(i).getClass();
//获取类的所有字段
Field[] fields = cl.getDeclaredFields();
for (int j = 0; j < titleList.size(); j++) {
//设置字段可见,否则会报错,禁止访问
fields[j].setAccessible(true);
//创建单元格
rowData.createCell(j).setCellValue((String) fields[j].get(dataList.get(i)));
}
}
}
//如果开启了下拉选项
if (outExcelQuery!=null){
//如果表格中的记录数不是0
if (count!=0){
// 获取下拉列表数据
String[] strs = outExcelQuery.getParams();
//设置哪些行的哪些列为下拉选项
CellRangeAddressList rangeList =
new CellRangeAddressList(outExcelQuery.getRowStart(),
//结束行为-1时,说明设置所有行
outExcelQuery.getRowEnd()==-1?count:outExcelQuery.getRowEnd(),
outExcelQuery.getColStart(),outExcelQuery.getColEnd());
//绑定下拉数据
DVConstraint constraint = DVConstraint.createExplicitListConstraint(strs);
//绑定两者的关系
HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList,constraint);
//添加到sheet中
sheet.addValidationData(dataValidation);
}
}
return wb;
}
网友评论