java代码:
/**
* 下载清单
* @param response
* @param purchaseListQueryVo
* @param request
*/
@RequestMapping(value = "/downloadList", method = RequestMethod.POST)
public ResponseEntity<byte[]> downloadList(HttpServletResponse response, PurchaseListQueryVo purchaseListQueryVo, HttpServletRequest request) {
ResponseEntity<byte[]> responseEntity = null;
//获取前台额外传递过来的查询条件
if(log.isDebugEnabled()){
log.debug("purchaseListQueryVo:{}",purchaseListQueryVo);
}
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
List<Map<String, Object>> postCheckList= purchaseListService.downloadList(getMap(purchaseListQueryVo));
String fileName = java.net.URLEncoder.encode("清单导出.xlsx", "UTF-8");
//生成EXCEL XLSX格式
this.exportData(postCheckList, byteArrayOutputStream,purchaseListQueryVo);
//设置响应头让浏览器正确显示下载
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName);
responseEntity = new ResponseEntity<>(byteArrayOutputStream.toByteArray(), headers, HttpStatus.OK);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return responseEntity;
}
public void exportData(List<Map<String, Object>> postCheckList, OutputStream outputStream,PurchaseListQueryVo purchaseListQueryVo) {
String orderStartTime = purchaseListQueryVo.getOrderStartTime().replace("-", "/").substring(0,10);
String orderEndTime = purchaseListQueryVo.getOrderEndTime().replace("-", "/").substring(0,10);
String header = null;
if(Lang.isEmpty(purchaseListQueryVo.getOrderStartTime())||Lang.isEmpty(purchaseListQueryVo.getOrderEndTime())){
header = " 购货清单";
}else{
header = orderStartTime + "-"+ orderEndTime + " 购货清单";
}
//EXCEL标题2018-04-26
List<String> titles = Arrays.asList(new String[]{"序号","太平订单号/礼包账单号", "总公司", "采购员/礼包创建员机构", "部门", "采购员/礼包创建员", "采购员/礼包创建员账号","下单时间/账单时间",
"支付方式","应收凭证号","商品名称","订购数量","单价","商品总价","不含税金额","税额"});
//EXCEL列
List<List<Object>> rows = new ArrayList<>();
//从给定数据获取指定列作为EXCEL列数据
for (Map<String, Object> map: postCheckList) {
List<Object> row = new ArrayList<>();
//序号
row.add(map.get("ROWNUM"));
//太平订单号
row.add(map.get("ORDERNO"));
//总公司
row.add(map.get("PARENTCOMPANY"));
//采购员机构
row.add(map.get("INVOICENAME"));
//部门
row.add(map.get("DEPARTMENT"));
//采购员
row.add(map.get("REALNAME"));
//采购员账号
row.add(map.get("USERNAME"));
//下单时间
row.add(map.get("DATECREATED"));
//支付方式
row.add(map.get("PAYNAME"));
//应收凭证号
row.add(map.get("VOUCHERNO"));
//商品名称
row.add(map.get("PRODUCTNAME"));
//订购数量
row.add(map.get("COUNT"));
//单价
row.add(new BigDecimal(String.valueOf(map.get("SALEPRICE"))).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString());
//商品总价
row.add(new BigDecimal(String.valueOf(map.get("COMMODITYAMOUNT"))).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString());
//不含税金额
row.add(new BigDecimal(String.valueOf(map.get("NOTAXAMOUNT"))).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString());
//税额
row.add(new BigDecimal(String.valueOf(map.get("TAXAMOUNT"))).setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString());
rows.add(row);
}
XSSFWorkbook xwb = excelService.purchaseListExcelForXLSX(header,titles, rows, "清单");
try {
xwb.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
xwb.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 专业公司购货清单生成Excel对象
* @param titles 表头
* @param rows 数据行
* @param sheetName 工作表名
* @return
*/
public XSSFWorkbook purchaseListExcelForXLSX(String header,List<String> titles, List<List<Object>> rows, String sheetName) {
XSSFWorkbook xwb = new XSSFWorkbook();
XSSFSheet sheet = xwb.createSheet(Lang.isEmpty(sheetName) ? "sheet1" : sheetName);
//创建第一行头部并设置行高及样式
sheet.addMergedRegion(new CellRangeAddress(0,0,0,titles.size()-1));
XSSFRow row1 = sheet.createRow(0);
row1.setHeight((short)600);
//标题头部样式
//设置字体
XSSFFont fontHeader = xwb.createFont();
fontHeader.setFontName("宋体");
fontHeader.setFontHeightInPoints((short)16);
fontHeader.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 字体加粗
XSSFDataFormat formatHeader = xwb.createDataFormat();
//设置单元格格式
XSSFCellStyle styleHeader = xwb.createCellStyle();
styleHeader.setFont(fontHeader);
styleHeader.setDataFormat(formatHeader.getFormat("@")); //设置输入格式为文本格式
styleHeader.setAlignment(XSSFCellStyle.ALIGN_CENTER);
styleHeader.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
styleHeader.setWrapText(true);
XSSFCell cell1 = row1.createCell(0);
cell1.setCellStyle(styleHeader);
cell1.setCellValue(new XSSFRichTextString(header));
//创建第一行并设置行高
XSSFRow row = sheet.createRow(1);
row.setHeight((short)400);
//标题样式设置
//设置字体
XSSFFont fontTitle = xwb.createFont();
fontTitle.setFontName("宋体");
fontTitle.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 字体加粗
fontTitle.setFontHeightInPoints((short)10);
XSSFDataFormat format = xwb.createDataFormat();
//设置单元格格式
XSSFCellStyle styleTitle = xwb.createCellStyle();
styleTitle.setFont(fontTitle);
styleTitle.setDataFormat(format.getFormat("@")); //设置输入格式为文本格式
styleTitle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
styleTitle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
styleTitle.setWrapText(true);
//主体样式设置
//设置字体
XSSFFont font = xwb.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short)10);
//设置单元格格式
XSSFCellStyle style = xwb.createCellStyle();
style.setFont(font);
style.setDataFormat(format.getFormat("@")); //设置输入格式为文本格式
style.setAlignment(XSSFCellStyle.ALIGN_LEFT);
style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
style.setWrapText(true);
//设置单元格内容
int columnCount = titles.size();
for(int i = 0; i < columnCount; i++){
XSSFCell cell = row.createCell(i);
cell.setCellStyle(styleTitle);
cell.setCellValue(new XSSFRichTextString(titles.get(i)));
if(i==0){
sheet.setColumnWidth(i, 1500);
}else if(i==10){
sheet.setColumnWidth(i, 6000);
}else{
sheet.setColumnWidth(i, 4000);
}
sheet.setDefaultColumnStyle(i, style);
}
Integer seqStartRow = null, seqColumn = 0;
String seqPrevious = null;
//太平订单号
Integer orderNoStartrow = null, orderNoColumn = 1;
String orderNoPrevious = null;
//总公司
Integer parentcompanyStartrow = null, parentcompanyColumn = 2;
String parentcompanyPrevious = null;
//采购员机构
Integer invoicenameStartrow = null, invoicenameColumn = 3;
String invoicenamePrevious = null;
//部门
Integer departmentStartrow = null, departmentColumn = 4;
String departmentPrevious = null;
//采购员
Integer realnameStartrow = null, realnameColumn = 5;
String realnamePrevious = null;
//采购员账号
Integer usernameStartrow = null, usernameColumn = 6;
String usernamePrevious = null;
//下单时间
Integer datecreatedStartrow = null, datecreatedColumn = 7;
String datecreatedPrevious = null;
//支付方式
Integer paynameStartrow = null, paynameColumn = 8;
String paynamePrevious = null;
//应收凭证号
Integer vouchernoStartrow = null, vouchernoColumn = 9;
String vouchernoPrevious = null;
Map<String, Object> returnMap;
// 写入数据行
XSSFCell cell;
int rowIdx = 2;
Map<Object, Integer> seqMap = new HashMap<>();
int seq = 0;
String lastOrderNo = null;
try {
for(List<Object> dr : rows) {
row = sheet.createRow(rowIdx);
for(int di=0; di < dr.size(); di++) {
if(di == 0) {
if(seqMap.containsKey(dr.get(1))) {
seq = seqMap.get(dr.get(1));
} else {
seq++;
seqMap.put(dr.get(1), seq);
}
}
cell = row.createCell(di);
cell.setCellStyle(style);
String cellValue = "";
if(Lang.isEmpty(dr.get(di))){
cellValue = "";
}else{
cellValue = dr.get(di)+"";
}
if(rowIdx - 2 != rows.size()-1){
if(di == 0){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,String.valueOf(seq),seqPrevious,seqStartRow,seqColumn, dr.get(1).equals(lastOrderNo));
seqPrevious = (String) returnMap.get("previousValue");
seqStartRow = (Integer) returnMap.get("startRow");
} else if(di == 1){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,orderNoPrevious,orderNoStartrow,orderNoColumn,true);
orderNoPrevious = (String) returnMap.get("previousValue");
orderNoStartrow = (Integer) returnMap.get("startRow");
} else if(di == 2){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,parentcompanyPrevious,parentcompanyStartrow,parentcompanyColumn,dr.get(1).equals(lastOrderNo));
parentcompanyPrevious = (String) returnMap.get("previousValue");
parentcompanyStartrow = (Integer) returnMap.get("startRow");
} else if(di == 3){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,invoicenamePrevious,invoicenameStartrow,invoicenameColumn,dr.get(1).equals(lastOrderNo));
invoicenamePrevious = (String) returnMap.get("previousValue");
invoicenameStartrow = (Integer) returnMap.get("startRow");
} else if(di == 4){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,departmentPrevious,departmentStartrow,departmentColumn,dr.get(1).equals(lastOrderNo));
departmentPrevious = (String) returnMap.get("previousValue");
departmentStartrow = (Integer) returnMap.get("startRow");
} else if(di == 5){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,realnamePrevious,realnameStartrow,realnameColumn,dr.get(1).equals(lastOrderNo));
realnamePrevious = (String) returnMap.get("previousValue");
realnameStartrow = (Integer) returnMap.get("startRow");
} else if(di == 6){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,usernamePrevious,usernameStartrow,usernameColumn,dr.get(1).equals(lastOrderNo));
usernamePrevious = (String) returnMap.get("previousValue");
usernameStartrow = (Integer) returnMap.get("startRow");
} else if(di == 7){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,datecreatedPrevious,datecreatedStartrow,datecreatedColumn,dr.get(1).equals(lastOrderNo));
datecreatedPrevious = (String) returnMap.get("previousValue");
datecreatedStartrow = (Integer) returnMap.get("startRow");
} else if(di == 8){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,paynamePrevious,paynameStartrow,paynameColumn,dr.get(1).equals(lastOrderNo));
paynamePrevious = (String) returnMap.get("previousValue");
paynameStartrow = (Integer) returnMap.get("startRow");
} else if(di == 9){
returnMap =createOrMargedCell(sheet,row,style,rowIdx,cellValue,vouchernoPrevious,vouchernoStartrow,vouchernoColumn,dr.get(1).equals(lastOrderNo));
vouchernoPrevious = (String) returnMap.get("previousValue");
vouchernoStartrow = (Integer) returnMap.get("startRow");
}else{
cell.setCellValue(new XSSFRichTextString(cellValue));
}
}else{
cell.setCellValue(new XSSFRichTextString(cellValue));
}
}
lastOrderNo = orderNoPrevious;
rowIdx ++;
}
} catch (Exception e) {
e.printStackTrace();
}
return xwb;
}