packagecom.alphajuns.ssm.util;importjava.io.IOException;importjava.io.PrintWriter;importjava.net.URLEncoder;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.csv.CSVFormat;importorg.apache.commons.csv.CSVPrinter;importorg.apache.log4j.Logger;/*** 导出csv的帮助类
*@authorwarrenxia
**/
public abstract classAbstractCsvHelper {/*** logger*/
private static Logger logger = Logger.getLogger(AbstractCsvHelper.class);/*** 导出csv
*@paramparams
*@paramrequest
*@paramresp*/
public void exportCvs(Mapparams, HttpServletRequest request, HttpServletResponse resp) {
resp.setContentType("application/octet-stream");
resp.setCharacterEncoding("GBK");int rows = 500;
CSVFormat csvFormat=CSVFormat.DEFAULT;
CSVPrinter csvPrinter= null;
PrintWriter printWriter= null;try{
String agent= (String)request.getHeader("USER-AGENT");if(agent != null && agent.toLowerCase().indexOf("firefox") > 0) {
resp.setHeader("Content-Disposition","attachment; filename=" + new String(getFilename().getBytes("GB2312"),"ISO-8859-1"));
}else{
resp.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(getFilename(), "UTF-8"));
}
printWriter=resp.getWriter();
csvPrinter= newCSVPrinter(printWriter, csvFormat);
Map header =getCsvHeader();
insertHeader(header, csvPrinter);
prepareParams(params);
params.put("rows", rows);
params.put("page", 1);//查询导出的数据
List> mapList =getCsvRecords(params);int totalCount = 0;if(mapList!=null&&!mapList.isEmpty()){if (mapList.get(0).containsKey("TOTALCOUNT")) {
Number nTotalCount= (Number) mapList.get(0).get("TOTALCOUNT");
totalCount=nTotalCount.intValue();
}else{
totalCount=mapList.size();
}
}//设置最大导出数量
String reportMaxRow = "20000";int intReportMaxRow = 5000;if(reportMaxRow!=null && !reportMaxRow.trim().equals("")){
intReportMaxRow=Integer.parseInt(reportMaxRow.trim());
}if(totalCount>intReportMaxRow){
String errMsg= "不能导出大于"+intReportMaxRow+"条的数据,请缩小选择范围!";
List record = new ArrayList();
record.add(errMsg);
csvPrinter.printRecord(record);throw newReportBusinessException(errMsg);
}
insertRecords(mapList, header, csvPrinter);int totalPage = (int) Math.ceil((double)totalCount /rows);for (int i = 1; i < totalPage; i++) {
params.put("page", i + 1);
mapList=getCsvRecords(params);
insertRecords(mapList, header, csvPrinter);
}
}catch(IOException e) {
e.printStackTrace();
}catch(ReportBusinessException e){
logger.error("报表导出异常",e);throwe;
}catch(Exception e) {
e.printStackTrace();
}finally{try{
csvPrinter.flush();
printWriter.flush();
csvPrinter.close();
printWriter.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}protected abstract MapgetCsvHeader();protected abstractString getFilename();protected abstract List> getCsvRecords(Mapparams);protected abstract void prepareParams(Mapparams);private void insertHeader(Map header, CSVPrinter csvPrinter) throwsIOException {
csvPrinter.printRecord(header.values());
}private void insertRecords(List> mapList, Map header, CSVPrinter csvPrinter) throwsIOException {for (Mapmap : mapList) {
List record = new ArrayList();for (Entryentry : header.entrySet()) {
Object object=map.get(entry.getKey());if (object == null) {
record.add("");
}else{
record.add(String.valueOf(object));
}
}
csvPrinter.printRecord(record);
}
}
}