使用MyRowHandler处理类来处理大量数据的导出:
实现RowHandler的方法:
public class XXXX(实现层方法名) implements RowHandler {
private HSSFWorkbook wb;
private HSSFSheet sheet ;
private HSSFRow row;
private HSSFCell cell;
private int dataNum=0;
private int rowStart = 1;
private int rowI = 0;
public void setWb(HSSFWorkbook wb) {
this.wb = wb;
setSheet();
//处理需要导出数据的业务
List<T> lists = xxxxx(处理数据方法);
handleRow(lists);
}
@Override
public void handleRow(Object arg0){
dataNum++;
if(dataNum%50000==0){
//每5万条记录分页
setSheet();
}
//在这里处理逻辑,插入数据到excel
Map map = (Map) arg0;
row = sheet.createRow((int) rowI + 1);
row.createCell((short) 0).setCellValue(map.getKey());
row.createCell((short) 1).setCellValue(map.getValue);
rowI++;
}
public HSSFWorkbook getWb() {
return wb;
}
public void setSheet(){
this.sheet= wb.createSheet();
rowStart = 1;
//写表头
writeHeader();
}
public void writeHeader(){
String[] header = {"交易时间","机构订单号"};
row = sheet.createRow(0);
int n=0;
for (String head : header) {
cell = row.createCell((short) n);
HSSFRichTextString str = new HSSFRichTextString(head);
cell.setCellValue(str);
n++;
}
}
}
controller层代码:
public ModelAndView downloadsss(HttpServletRequest request, HttpServletResponse response ){
logger.debug("FundoutChannelBillController.download() is running...");
String queryTime = request.getParameter("queryTime");
String channelName = request.getParameter("channelName");
HSSFWorkbook wb = new HSSFWorkbook();
HSSFRow row = null;
//调用相应xxxxx的接口,写入excel
XXXX(实现层方法名) xxxx= new XXXX(实现层方法名)();
xxxx.setWb(wb);
YYYYService.ZZZZZ方法(xxxx);//调用queryWithRowHandler
wb = xxxx.getWb();
//弹出下载
response.setContentType("application/octet-stream; charset=UTF-8");
response.setHeader(
"Content-Disposition",
"attachment;filename=" + new String((System.currentTimeMillis() + ".xls").getBytes(), "ISO8859_1"));
ServletOutputStream outputStream = response.getOutputStream();
try {
wb.write(outputStream);
response.setStatus(HttpServletResponse.SC_OK);
outputStream.flush();
} catch (IOException e) {
logger.error(e.getMessage(), e);
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}catch (Exception e) {
logger.error( "下载文件异常", e );
}
return null;
}
YYYYService的实现层
public class YYYYServiceImpl implements YYYYService{
public void ZZZZZ(RowHandler rowHandler) {
findListsDAO.ZZZZZ( rowHandler);
}
}
Dao层:
public findListsDAO extends SqlMapClientDaoSupport{
public void ZZZZZ(RowHandler rowHandler){
getSqlMapClientTemplate().queryWithRowHandler("相应sql的查询", rowHandler);
}
}