JAVA数据导出excel并下载
引言:
最近工作需要对数据库查询的数据导出excel表,并且下载这个文件。
话不多说直接看如何把数据写入excel表,具体代码如下:
/**
* 导出Excel.
*
* @param response
* @param filedNames excel标题&字段 此参数为map,实例为new LinkedHashMap<String, Object>();
* @param titleName 导出文件名
* @param filedParams 内容范例.
*/
public static void exportToExcel(final HttpServletResponse response, final String[] filedNames,
final String titleName, final List<LinkedHashMap> filedParams) {
// 第一步,创建一个webbook,对应一个Excel文件
final XSSFWorkbook wb = new XSSFWorkbook();
// HSSFWorkbook wb = new HSSFWorkbook();
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
final XSSFSheet sheet = wb.createSheet(titleName);
// 设置表格默认列宽度为25个字节
sheet.setDefaultColumnWidth(25);
sheet.autoSizeColumn(0);
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
XSSFRow row = sheet.createRow(0);
// 第四步,创建单元格,并设置值表头设置表头居中
final XSSFCellStyle style = wb.createCellStyle();
style.setWrapText(true);
//数据样式居中
style.setAlignment(HorizontalAlignment.CENTER);
// 声明列对象
XSSFCell cell = null;
Iterator<LinkedHashMap> it = filedParams.iterator();
try {
int i = 0;
// 创建标题
for (String filed : filedNames) {
cell = row.createCell(i);
cell.setCellValue(filed);
cell.setCellStyle(style);
i++;
}
int index = 0;
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
Map<String, Object> data = it.next();
int j = 0;
//设置序号
if (!data.isEmpty()) {
cell = row.createCell(j);
cell.setCellStyle(style);
cell.setCellValue(index);
j++;
}
for (String key : data.keySet()) {
cell = row.createCell(j);
cell.setCellStyle(style);
XSSFRichTextString text = new XSSFRichTextString(data.get(key) + "");
cell.setCellValue(text);
j++;
}
}
// 文件名
String fileName;
final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
final Date date = new Date();
final String time = format.format(date);
// 输出的文件名+以毫秒为单位返回当前时间
// ISO8859-1不能改为UTF-8,否则文件名是乱码
fileName = URLEncoder.encode(titleName + time + ".xlsx", "UTF-8");
// application应用;octet-stream八进制;charset字符集(请求应用)
response.setContentType("application/octet-stream;charset=UTF-8");
// Content-Disposition内容配置;attachment附件;(下载完成提示)
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
final OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
参数:String[] filedNames 是表格的标题行,通过循环设置excle表的标题;
参数:String titleName 是excle表里面的sheet名称;
参数:List<LinkedHashMap> filedParams 这里使用LinkedHashMap,是因为和HashMap相比的数据具有有序性,可以保证数据插入不会错乱。