JAVA下载和导出文件到excel中等操作。
补充ps:此篇博文不建议参考,只建议学习思想,当今处理excel导出报表多用模板导出,此种风格过于久远,是老系统写法,理解思想即可
这条推文推荐入门级阅读,笔者自己研究了一遍别人的代码,理解了一下导出数据的思想,大致思路如下:
1.分别建立一个LinkedHashMap来保存表头和表的内容数据,而内容数据可能会有多条,所以也需要使用一个List集合将装有表数据的LinkedHashMap集合包装起来。
注:LinkedHashMap继承于HashMap,有助于快速插数据和删除数据,当然,此处使用主要为了有序插入数据。
2.建立输出流(OutputStream ),用来写导出的数据;
3.使用SXSSFWorkbook的API导入数据到Excel中,这里提两句,HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;XSSFWorkbook和SXSSFWorkbook:都是操作Excel2007后的版本,扩展名是.xlsx;具体的区别笔者就不详细展开了,感兴趣的可以百度或者在CSDN搜索起来.....
4.用XSSFCellStyle 处理导出的单元格格式,可以设置
5.循环拼接单元格,逐个写入数据
@RequestMapping("/XXXXXX")
public String doExportStore(HttpServletResponse response, @RequestParam String oid)
{
// 用于前端传值的,可以不用理会
String id = "ediStoreListPl";
//需要导出的数据(包括表头和数据)
List<LinkedHashMap<String, Object>> list = new ArrayList<LinkedHashMap<String,Object>>();
// 导出数据
LinkedHashMap<String, Object> dataMap = new LinkedHashMap<String, Object>();
// 导出表头
LinkedHashMap<String, String> titleMap = new LinkedHashMap<String, String>();
OutputStream out = null;
// 记载导出时间的,用于调性能之类,可以不用理会
long startTime = System.currentTimeMillis();
Date curDate = DateUtil.getCurrentDate();
String curDateStr = DateUtils.formatDateTime4FileName(curDate);
Integer scpGuideBatchOid = Integer.valueOf(oid);
SXSSFWorkbook sxssfWorkbook = null;
try
{
// 处理前端的数据,不用理会
PagedList<RopEdiStore> pl = exportPagedList(id, RopEdiStore.class);
QueryObject qo = pl.getQo();
String storeName = (String)qo.get("storeName");
qo.put("storeName", StringTools.getLikeStr(storeName));
qo.put("scpGuideBatchOid", scpGuideBatchOid);
pl.setQo(qo);
// 从数据库中读出需要下载的数据,具体的sql笔者不罗列了,这和你需要下载的数据有关
List<RopEdiStore> ropEdiStoreList = autoService.getRopEdiStoreListForExport(pl);
if(CollectionUtils.isNotEmpty(ropEdiStoreList))
{
// 处理查询出来的数据
for(RopEdiStore ropEdiStore : ropEdiStoreList)
{
dataMap = new LinkedHashMap<String, Object>();
dataMap.put("0", ropEdiStore.getMarketId());
dataMap.put("1", ropEdiStore.getStoreId());
dataMap.put("2", ropEdiStore.getStoreName());
dataMap.put("3", null == ropEdiStore.getOpenDate() ? "" : DateUtils.formatDate(ropEdiStore.getOpenDate(), "yyyy-MM-dd"));
dataMap.put("4", null == ropEdiStore.getCloseDate() ? "" : DateUtils.formatDate(ropEdiStore.getCloseDate(), "yyyy-MM-dd"));
dataMap.put("5", ropEdiStore.getStatus());
dataMap.put("6", ropEdiStore.getProvince());
dataMap.put("7",ropEdiStore.getCity());
dataMap.put("8", ropEdiStore.getStoreCate());
list.add(dataMap);
}
}
// excel数据头部分
titleMap.put("0", "Market ID");
titleMap.put("1", "Store ID");
titleMap.put("2", "Store Name");
titleMap.put("3", "Open Date");
titleMap.put("4", "Close Date");
titleMap.put("5", "Status");
titleMap.put("6", "Province");
titleMap.put("7", "City");
titleMap.put("8", "Store Category");
String sheetName = "sheet1";
// 执行导出操作,见下面另一段代码
sxssfWorkbook = autoService.exportStoreData(titleMap, list, sheetName);
Sheet sheet = sxssfWorkbook.getSheet(sheetName);
setStoreSheet(sheet);
String charCoding = "UTF-8";
String fileName = "ria_store_"+curDateStr+".xlsx";
response.setContentType("application/octet-stream;charset="+charCoding);
response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
out = response.getOutputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
sxssfWorkbook.write(bos);
bos.writeTo(out);
out.flush();
}
catch (Exception e)
{
logger.error("export excel failed:",e);
}
finally
{
try
{
if(sxssfWorkbook != null)
{
// SXSSFWorkbook导出excel时,产生的临时文件
sxssfWorkbook.dispose();
}
if(out != null)
{
out.close();
}
}
catch (IOException e2)
{
logger.error("close io error", e2);
}
}
return null;
}
具体的导出逻辑:
public SXSSFWorkbook exportStoreData(
LinkedHashMap<String, String> titleMap,
List<LinkedHashMap<String, Object>> list, String sheetName)
{
SXSSFWorkbook sxssfWorkbook = null;
try
{
// get SXSSFWorkbook
sxssfWorkbook = new SXSSFWorkbook();
Sheet sheet = sxssfWorkbook.createSheet(sheetName);
Font font= sxssfWorkbook.createFont();
// 语言,处理国际化的,可以不用理会
String cnFont = ConfigManager.getConfig().getString("ria.font-zh_CN");
String usFont = ConfigManager.getConfig().getString("ria.font-en_US");
String lang = AuthedUser.get().getVars().getLang();
if("en_US".equalsIgnoreCase(lang))
{
font.setFontName(usFont);
}
else
{
font.setFontName(cnFont);
}
// 冻结最左边的两列、冻结最上面的一行
// 即:滚动横向滚动条时,左边的第一、二列固定不动;滚动纵向滚动条时,上面的第一行固定不动。
// sheet.createFreezePane(2, 1);
// 设置并获取到需要的样式
XSSFCellStyle xssfCellStyleHeader = getAndSetXSSFCellStyleHeader(sxssfWorkbook);
XSSFCellStyle xssfCellStyle = (XSSFCellStyle) sxssfWorkbook.createCellStyle();
// 创建第一行,作为header表头
if(null != titleMap && !titleMap.isEmpty())
{
Row header = sheet.createRow(0);
// 循环创建header单元格(根据实际情况灵活创建即可)
int cellnum = 0;
for(Map.Entry<String, String> entry: titleMap.entrySet())
{
Cell cell = header.createCell(cellnum);
xssfCellStyleHeader.setFont(font);
cell.setCellStyle(xssfCellStyleHeader);
cell.setCellValue(entry.getValue());
sheet.setColumnWidth(0, 32 * 100);
cellnum++;
}
}
if(null != list && !list.isEmpty())
{
// 遍历创建行,导出数据
for (int rownum = 1; rownum <= list.size(); rownum++)
{
Map<String, Object> dataMap = list.get(rownum-1);
if(null == dataMap || dataMap.isEmpty())
{
continue;
}
Row row = sheet.createRow(rownum);
// 循环创建单元格
int cellCount = 0;
// 根据单元格所属,录入相应内容
for(Map.Entry<String, Object> entry: dataMap.entrySet())
{
Cell cell = row.createCell(cellCount);
if(cellCount == 3 || cellCount == 4)
{
xssfCellStyle.setAlignment(HorizontalAlignment.CENTER);
}
xssfCellStyle.setFont(font);
cell.setCellStyle(xssfCellStyle);
if(null != entry.getValue())
{
cell.setCellValue(entry.getValue().toString());
}
else
{
cell.setCellValue("");
}
cellCount++;
}
}
}
}
catch (Exception e)
{
logger.error("cause error", e);
throw new SysException(e);
}
return sxssfWorkbook;
}