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();
}
}
- 继承的类展示一下
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;
}
}