Java导出大数据量csv文件

1. Controller层省略了,直接上业务

2. 业务层实现类从数据库导出1万条数据,csv文件。

	@Autowired
	private TaxTemplateCsvView templateCsvView;

	@Autowired
	private TaxTemplateZipCsvView taxTemplateZipCsvView;
	
public ModelAndView exportNotDeduct(NotDeductRequest request, ModelMap modelMap, HttpServletResponse response) {
		try {
			int currentPage = 1;
            int pageSize = 1000;
            int total = 10;
            List<TScmVatNotDeduct> data = new ArrayList<TScmVatNotDeduct>();
            List<TScmVatNotDeduct> results = new ArrayList<TScmVatNotDeduct>();    
            while (total>0) {
            	data = null;
                Page<TScmVatNotDeduct> page = PageHelper.startPage(currentPage, pageSize);
    			List<TScmVatNotDeduct> confirmNotDeductList = notDeductMapper.confirmNotDeductList(request);
    			data = page.getResult();
    			if (data.size() < pageSize) {
    				data = page.getResult();
    				results.addAll(data);
    				total = -1;
    				break;
    			}
    			results.addAll(data);
    			currentPage++;
    			total--;
            }

			Map<String, Object> param = new HashMap<String, Object>();
			param.put("list", results);
			modelMap.put(TemplateExcelConstants.MAP_DATA, param);
			modelMap.put(TemplateExcelConstants.FILE_NAME, "确认不抵扣列表");
			modelMap.put(TemplateExcelConstants.HEAD_DATA,
					"开票日期,发票代码,发票号码,不抵扣状态,购方名称,购方税号,销方名称,销方税号,价税合计,金额(不含税),税额,有效税额,提交时间,提交账号,处理结果,备注");
			modelMap.put(TemplateExcelConstants.FIELD_DATA,
					"invDate,invKind,invNum,notDeductDesc,buyerName,buyerTaxno,sellerName,sellerTaxno,invSum,invCost,invVat,effectiveTax,applyTime,applyUser,responseCode,remark");

			// 判断是否需要导出zip文件
			if (data.size() <= TaxTemplateZipCsvView.MAX_SIZE) {
				return new ModelAndView(templateCsvView);
			} else {
				return new ModelAndView(taxTemplateZipCsvView);
			}
		} catch (Exception e) {
			logger.error("tollInvoiceResult exportCsv system error e:", e.getMessage());
			return null;
		}

	}
	

3. 注入的两种实现方式

<1. 50000条一下导出csv格式

@Controller   
public class TaxTemplateCsvView extends MiniAbstractExcelView {

	@Override
	public void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		OutputStream out = null;
	
		  response.setContentType("application/csv;charset=utf-8");  	// by lhj 20191209
          response.setHeader("Content-Disposition",
              "attachment;filename=" + URLEncoder.encode((String) model.get(TemplateExcelConstants.FILE_NAME) + ".csv", "UTF-8"));	// by lhj 20191209
		
		try {
			out = response.getOutputStream();
			List<Object> datalist = (List<Object>) ((HashMap<String, Object>) model.get("map")).get("list");

			String[] fields = ((String) model.get(TemplateExcelConstants.FIELD_DATA)).split(",");
			String head = ((String) model.get(TemplateExcelConstants.HEAD_DATA));
			// 解决乱码
			out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
			out.write(head.getBytes());
			out.write("\r\n".getBytes());
			while (datalist != null && datalist.size() != 0) {
				for (int i = 0; i < datalist.size(); i++) {
					Object o = datalist.get(0);
					StringBuilder sb = new StringBuilder();
					for (int j = 0; j < fields.length; j++) {
						String field = fields[j];
						String str = BeanUtils.getProperty(o, field);
						if ("null".equals(str) || str == null) {
							str = "";
						}
						// 第一列比较特殊
						if (j == 0) {
							sb.append("\t").append(str).append("\t").append(",");
						} else {
							sb.append("=\"").append(str).append("\"").append(",");
						}
					}
					sb.deleteCharAt(sb.length() - 1);
					sb.append("\r\n");
					if (datalist.size() > 0) {
						datalist.remove(0);
					}
					out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
					out.write(sb.toString().getBytes());
					if (datalist.size() == 0) {
						break;
					}
				}
			}
			out.flush();
		} finally {
			out.close();
		}
	}
}

<2. 超过50000条导出 a.zip文件

@Controller
public class TaxTemplateZipCsvView extends MiniAbstractExcelView {

    public static int MAX_SIZE = 50000;

    @Override
    public void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception{
        OutputStream out = response.getOutputStream();
        try (ZipOutputStream zos = new ZipOutputStream(out);){
        	response.setContentType("application/csv;charset=utf-8"); // by lhj 20191209
            response.setHeader("content-disposition", "attachment;filename=" + "a.zip");

            List<Object> datalist = (List<Object>) ((HashMap<String,Object>) model.get("map")).get("list");

            String[]fields = ((String)model.get(TemplateExcelConstants.FIELD_DATA)).split(",");
            String head = ((String)model.get(TemplateExcelConstants.HEAD_DATA));
            int num = 1;

            while(datalist!=null && datalist.size()!=0){
                // String name = model.get(TemplateExcelConstants.FILE_NAME) + "(" +num+ ").csv";
            	String name = URLEncoder.encode((String) model.get(TemplateExcelConstants.FILE_NAME) + ".csv", "UTF-8"); // by lhj 20191209
                zos.putNextEntry(new ZipEntry(name));
                //解决乱码
                zos.write(new byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF });
                zos.write(head.getBytes());
                zos.write("\r\n".getBytes());
                for(int i=0;i<MAX_SIZE; i++){
                    Object o = datalist.get(0);
                    StringBuilder sb = new StringBuilder();
                    for(int j=0;j<fields.length;j++ ){
                        String field = fields[j];
                        String str = BeanUtils.getProperty(o,field);
                        if("null".equals(str) || str == null){
                            str = "";
                        }
                        //第一列比较特殊
                        if(j==0){
                            sb.append("\t").append(str).append("\t").append(",");
                        }else{
                            sb.append("=\"").append(str).append("\"").append(",");
                        }
                    }
                    sb.deleteCharAt(sb.length()-1);
                    sb.append("\r\n");
                    if(datalist.size()>0){
                        datalist.remove(0);
                    }
                    zos.write(new byte []{( byte ) 0xEF ,( byte ) 0xBB ,( byte ) 0xBF });
                    zos.write(sb.toString().getBytes());

                    if(datalist.size() == 0){
                        break;
                    }
                }
                zos.closeEntry();
                num++;
            }
        }

        out.flush();
    }
}
  1. 继承的类展示一下
public abstract class MiniAbstractExcelView extends AbstractView {

    private static final String CONTENT_TYPE = "application/vnd.ms-excel";

    protected static final String HSSF         = ".xls";
    protected static final String XSSF         = ".xlsx";

    public MiniAbstractExcelView() {
        setContentType(CONTENT_TYPE);
    }

    protected boolean isIE(HttpServletRequest request) {
        return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request
            .getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true : false;
    }

}
发布了68 篇原创文章 · 获赞 5 · 访问量 9804

猜你喜欢

转载自blog.csdn.net/weixin_44407691/article/details/103540637