基于SSM的商贸平台项目(第六天)

报表引擎,复杂的报表打印

Alt text

1.技术难点

  1. 插入图片,POI插入图片时,设定区域,自动缩放到这个区域中,图片要设置偏移量
    HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); //add picture
    poiUtil.setPicture(wb, patriarch, path+”make/xlsprint/logo.jpg”, curRow, 2, curRow+4, 2);

  2. 模板,对于购销合同它不能直接做模板。代码中不能做这个功能。Excel支持区域复制。但是目前POI不直接支持区域复制。(合并单元格在sheet对象中、图片、线等)(基于用户使用系统,以及POI不直接支持区域复制,所以它不能直接使用模板)
    A. 只是改变列宽
    B. 画一个sheet,利用poi支持sheet的复制,保留样式。

  3. 插入一根线,设置两个坐标,它直接连线,可以是直线,可以是斜线,可以设置偏移量
    poiUtil.setLine(wb, patriarch, curRow, 2, curRow, 8); //draw line

  4. 合并单元格,特点:合并单元格的边线样式,它实际上是在合并前的单元格上设置的。特殊的地方:在单元格如果有样式,合并单元格的这几个格子都必须设置边线样式。
    CellRangeAddress region = null;
    region = new CellRangeAddress(curRow-1, curRow-1, 1, 3); //纵向合并单元格
    //不需要设置内容,只设置样式,补齐线。

    for(int j=2;j<9;j++){
        nCell = nRow.createCell(j);
        nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));
    }
    
  5. 换行
    curStyle.setWrapText(true);

  6. 设置人民币符号(前缀)
    format.getFormat(“\”¥\”#,###,###.00”);
  7. 设置公式,乘法,合计公式
    nCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
    nCell.setCellFormula(“F”+String.valueOf(curRow)+”*H”+String.valueOf(curRow));
  8. 实现审单人的人名等量空格替换,实现它后面的位置不变(工具类)
    utilFuns.fixSpaceStr(contract.getCheckBy(),26)
  9. 单元格自适应(工具类)
    float height = poiUtil.getCellAutoHeight(printMap.get(“Request”), 12f); //自动高度
  10. 数据和业务分离,一页数据封装到一个map中,以业务字段名称定义KEY,以string定义内容,所有页面封装到一个arraylist。
    Map pageMap = null;
    List pageList = new ArrayList(); //打印页

  11. 插入分页符

    if(p>0){
        sheet.setRowBreak(curRow++);    //在第startRow行设置分页符
    }
    
  12. 公用的工具类PoiUtil poiUtil = new PoiUtil(); 样式,特殊内容封装
  13. return format.getFormat(“\”¥\”#,###,##0.00”); // 设置格式
    0代表,这位值如果不为零,显示原来的内容,直接输出0
    ,#代表,这位值如果存在,就直接显示,不存在,就不显示。
  14. nCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);

    2.代码整理

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;

import cn.itcast.jk.vo.ContractProductVO;
import cn.itcast.jk.vo.ContractVO;
import cn.itcast.util.DownloadUtil;
import cn.itcast.util.UtilFuns;
import cn.itcast.util.file.PoiUtil;

public class ContractPrint{

public void print(ContractVO contract,String path, HttpServletResponse response) throws Exception{
    //相同厂家的信息一起打印
    List<ContractProductVO> oList = contract.getContractProducts();
    UtilFuns utilFuns = new UtilFuns();
    String tempXlsFile = path + "make/xlsprint/tCONTRACT.xls";        //获取模板文件

    //填写每页的内容,之后在循环每页读取打印
    Map<String,String> pageMap = null;
    List<Map> pageList = new ArrayList();            //打印页

    ContractProductVO oProduct = null;
    String stars = "";
    for(int j=0;j<contract.getImportNum();j++){        //重要程度
        stars += "★";
    }

    String oldFactory = "";
    for(int i=0;i<oList.size();i++){
        oProduct = oList.get(i);    //获得货物
        pageMap = new HashMap();    //每页的内容

        pageMap.put("Offeror", "收 购 方:" + contract.getOfferor());
        pageMap.put("Factory", "生产工厂:" + oProduct.getFactory().getFactoryName());
        pageMap.put("ContractNo", "合 同 号:" + contract.getContractNo());
        pageMap.put("Contractor", "联 系 人:" + oProduct.getFactory().getContacts());
        pageMap.put("SigningDate", "签单日期:"+UtilFuns.formatDateTimeCN(UtilFuns.dateTimeFormat(contract.getSigningDate())));
        pageMap.put("Phone", "电    话:" + oProduct.getFactory().getPhone());
        pageMap.put("InputBy", "制单:" + contract.getInputBy());
        pageMap.put("CheckBy", "审单:"+ utilFuns.fixSpaceStr(contract.getCheckBy(),26)+"验货员:"+utilFuns.convertNull(contract.getInspector()));
        pageMap.put("Remark", "  "+contract.getRemark());
        pageMap.put("Request", "  "+contract.getCrequest());

        pageMap.put("ProductImage", oProduct.getProductImage());
        pageMap.put("ProductDesc", oProduct.getProductDesc());
        pageMap.put("Cnumber", String.valueOf(oProduct.getCnumber().doubleValue()));
        if(oProduct.getPackingUnit().equals("PCS")){
            pageMap.put("PackingUnit", "只");
        }else if(oProduct.getPackingUnit().equals("SETS")){
            pageMap.put("PackingUnit", "套");
        }
        pageMap.put("Price", String.valueOf(oProduct.getPrice().doubleValue()));
        pageMap.put("ProductNo", oProduct.getProductNo());

        oldFactory = oProduct.getFactory().getFactoryName();

        if(contract.getPrintStyle().equals("2")){
            i++;    //读取第二个货物信息
            if(i<oList.size()){
                oProduct = oList.get(i);

                if(oProduct.getFactory().getFactoryName().equals(oldFactory)){    //厂家不同另起新页打印,除去第一次的比较

                    pageMap.put("ProductImage2", oProduct.getProductImage());
                    pageMap.put("ProductDesc2", oProduct.getProductDesc());
                    pageMap.put("Cnumber2", String.valueOf(oProduct.getCnumber().doubleValue()));
                    if(oProduct.getPackingUnit().equals("PCS")){
                        pageMap.put("PackingUnit2", "只");
                    }else if(oProduct.getPackingUnit().equals("SETS")){
                        pageMap.put("PackingUnit2", "套");
                    }                        
                    pageMap.put("Price2", String.valueOf(oProduct.getPrice().doubleValue()));
                    //pageMap.put("Amount2", String.valueOf(oProduct.getAmount().doubleValue()));            //在excel中金额采用公式,所以无需准备数据
                    pageMap.put("ProductNo2", oProduct.getProductNo());
                }else{
                    i--;    //tip:list退回
                }
            }else{
                pageMap.put("ProductNo2", null);    //后面依据此判断是否有第二个货物
            }
        }

        pageMap.put("ContractDesc", stars+" 货物描述");            //重要程度 + 货物描述

        pageList.add(pageMap);
    }

        int cellHeight = 96;    //一个货物的高度            用户需求,一个货物按192高度打印,后来又嫌难看,打印高度和2款高度一样。
//        if(contract.getPrintStyle().equals("2")){
//            cellHeight = 96;    //两个货物的高度
//        }

    PoiUtil poiUtil = new PoiUtil();
    HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(tempXlsFile));    //打开excel文件
    HSSFFont defaultFont10 = poiUtil.defaultFont10(wb);        //设置字体
    HSSFFont defaultFont12 = poiUtil.defaultFont12(wb);        //设置字体
    HSSFFont blackFont = poiUtil.blackFont12(wb);            //设置字体
    Short rmb2Format = poiUtil.rmb2Format(wb);                //设置格式
    Short rmb4Format = poiUtil.rmb4Format(wb);                //设置格式


    HSSFSheet sheet = wb.getSheetAt(0);                //选择第一个工作簿
    wb.setSheetName(0, "购销合同");                    //设置工作簿的名称


    //sheet.setDefaultColumnWidth((short) 20);         // 设置每列默认宽度

//        POI分页符有BUG,必须在模板文件中插入一个分页符,然后再此处删除预设的分页符;最后在下面重新设置分页符。
//        sheet.setAutobreaks(false);
//        int iRowBreaks[] = sheet.getRowBreaks();
//        sheet.removeRowBreak(3);
//        sheet.removeRowBreak(4);
//        sheet.removeRowBreak(5);
//        sheet.removeRowBreak(6);

    CellRangeAddress region = null;
    HSSFPatriarch patriarch = sheet.createDrawingPatriarch();        //add picture

    HSSFRow nRow = null;
    HSSFCell nCell   = null;
    int curRow = 0;

    //打印每页
    Map<String,String> printMap = null;
    for(int p=0;p<pageList.size();p++){
        printMap = pageList.get(p);

        if(p>0){
            sheet.setRowBreak(curRow++);    //在第startRow行设置分页符
        }


        //设置logo图片
        poiUtil.setPicture(wb, patriarch, path+"make/xlsprint/logo.jpg", curRow, 2, curRow+4, 2);

        //header
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(21);

        nCell   = nRow.createCell((3));
        nCell.setCellValue("SHAANXI");
        nCell.setCellStyle(headStyle(wb));

        //header
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(41);

        nCell   = nRow.createCell((3));
        nCell.setCellValue("     JK INTERNATIONAL ");
        nCell.setCellStyle(tipStyle(wb));

        curRow++;

        //header
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(20);

        nCell   = nRow.createCell((1));
        nCell.setCellValue("                 西经济技术开发区西城一路27号无迪大厦19楼");
        nCell.setCellStyle(addressStyle(wb));

        //header
        nCell   = nRow.createCell((6));
        nCell.setCellValue(" CO., LTD.");
        nCell.setCellStyle(ltdStyle(wb));

        //header
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(15);

        nCell   = nRow.createCell((1));
        nCell.setCellValue("                   TEL: 0086-29-86339371  FAX: 0086-29-86303310               E-MAIL: ijackix@glass.cn");
        nCell.setCellStyle(telStyle(wb));

        //line
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(7);

        poiUtil.setLine(wb, patriarch, curRow, 2, curRow, 8);    //draw line

        //header
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(30);

        nCell   = nRow.createCell((4));
        nCell.setCellValue("    购   销   合   同");
        nCell.setCellStyle(titleStyle(wb));

        //Offeror
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(20);

        nCell   = nRow.createCell((1));
        nCell.setCellValue(printMap.get("Offeror"));
        nCell.setCellStyle(poiUtil.titlev12(wb, blackFont));

        //Facotry
        nCell   = nRow.createCell((5));
        nCell.setCellValue(printMap.get("Factory"));
        nCell.setCellStyle(poiUtil.titlev12(wb, blackFont));

        //ContractNo
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(20);

        nCell   = nRow.createCell(1);
        nCell.setCellValue(printMap.get("ContractNo"));
        nCell.setCellStyle(poiUtil.titlev12(wb, blackFont));

        //Contractor
        nCell  = nRow.createCell(5);
        nCell.setCellValue(printMap.get("Contractor"));
        nCell.setCellStyle(poiUtil.titlev12(wb, blackFont));

        //SigningDate
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(20);

        nCell = nRow.createCell(1);
        nCell.setCellValue(printMap.get("SigningDate"));
        nCell.setCellStyle(poiUtil.titlev12(wb, blackFont));

        //Phone
        nCell = nRow.createCell(5);
        nCell.setCellValue(printMap.get("Phone"));
        nCell.setCellStyle(poiUtil.titlev12(wb, blackFont));

        //importNum
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(24);

        region = new CellRangeAddress(curRow-1, curRow-1, 1, 3);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        nCell = nRow.createCell(1);
        nCell.setCellValue("产品");
        nCell.setCellStyle(thStyle(wb));        

        nCell = nRow.createCell(2);
        nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));

        nCell = nRow.createCell(3);
        nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));

        nCell = nRow.createCell(4);
        nCell.setCellValue(printMap.get("ContractDesc"));
        nCell.setCellStyle(thStyle(wb));    

        region = new CellRangeAddress(curRow-1, curRow-1, 5, 6);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        nCell = nRow.createCell(5);
        nCell.setCellValue("数量");
        nCell.setCellStyle(thStyle(wb));    

        nCell = nRow.createCell(6);
        nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));            

        nCell = nRow.createCell(7);
        nCell.setCellValue("单价");
        nCell.setCellStyle(thStyle(wb));                        

        nCell = nRow.createCell(8);
        nCell.setCellValue("总金额");
        nCell.setCellStyle(thStyle(wb));                        


        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(96);

        region = new CellRangeAddress(curRow-1, curRow-1, 1, 3);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        //插入产品图片
        if(UtilFuns.isNotEmpty(printMap.get("ProductImage"))){
            System.out.println(printMap.get("ProductImage"));
            poiUtil.setPicture(wb, patriarch, path+"ufiles/jquery/"+printMap.get("ProductImage"), curRow-1, 1, curRow, 3);
        }

        nCell = nRow.createCell(2);
        nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));

        nCell = nRow.createCell(3);
        nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));

        //ProductDesc
        region = new CellRangeAddress(curRow-1, curRow, 4, 4);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        nCell = nRow.createCell(4);
        nCell.setCellValue(printMap.get("ProductDesc"));
        nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));        

        //Cnumber
        region = new CellRangeAddress(curRow-1, curRow, 5, 5);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        nCell = nRow.createCell(5);
        nCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
        nCell.setCellValue(Double.parseDouble(printMap.get("Cnumber")));
        nCell.setCellStyle(poiUtil.numberrv10_BorderThin(wb, defaultFont10));    

        //Unit
        region = new CellRangeAddress(curRow-1, curRow, 6, 6);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        nCell = nRow.createCell(6);
        nCell.setCellValue(printMap.get("PackingUnit"));
        nCell.setCellStyle(poiUtil.moneyrv10_BorderThin(wb, defaultFont10, rmb4Format));    

        //Price
        region = new CellRangeAddress(curRow-1, curRow, 7, 7);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        nCell = nRow.createCell(7);
        nCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
        nCell.setCellValue(Double.parseDouble(printMap.get("Price")));
        nCell.setCellStyle(poiUtil.moneyrv10_BorderThin(wb, defaultFont10, rmb4Format));


        //Amount
        region = new CellRangeAddress(curRow-1, curRow, 8, 8);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        nCell = nRow.createCell(8);
        if(UtilFuns.isNotEmpty(printMap.get("Cnumber")) && UtilFuns.isNotEmpty(printMap.get("Price"))){
            nCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
            nCell.setCellFormula("F"+String.valueOf(curRow)+"*H"+String.valueOf(curRow));
        }
        nCell.setCellStyle(poiUtil.moneyrv10_BorderThin(wb, defaultFont10, rmb4Format));            

        curRow++;

        region = new CellRangeAddress(curRow-1, curRow-1, 1, 3);    //纵向合并单元格 
        sheet.addMergedRegion(region);

        //ProductNo
        nRow = sheet.createRow(curRow-1);
        nRow.setHeightInPoints(24);

        nCell = nRow.createCell(1);
        nCell.setCellValue(printMap.get("ProductNo"));
        nCell.setCellStyle(poiUtil.notecv10_BorderThin(wb, defaultFont10));

        for(int j=2;j<9;j++){
            nCell = nRow.createCell(j);
            nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));
        }



        if(contract.getPrintStyle().equals("2") && UtilFuns.isNotEmpty(printMap.get("ProductNo2"))){
            nRow = sheet.createRow(curRow++);
            nRow.setHeightInPoints(96);

            region = new CellRangeAddress(curRow-1, curRow-1, 1, 3);    //纵向合并单元格 
            sheet.addMergedRegion(region);

            //插入产品图片
            if(UtilFuns.isNotEmpty(printMap.get("ProductImage2"))){
                System.out.println(printMap.get("ProductImage2"));
                poiUtil.setPicture(wb, patriarch, path+"ufiles/jquery/"+printMap.get("ProductImage2"), curRow-1, 1, curRow, 3);
            }

            //ProductDesc
            region = new CellRangeAddress(curRow-1, curRow, 4, 4);    //纵向合并单元格 
            sheet.addMergedRegion(region);

            nCell = nRow.createCell(4);
            nCell.setCellValue(printMap.get("ProductDesc2"));
            nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));        

            //Cnumber
            region = new CellRangeAddress(curRow-1, curRow, 5, 5);    //纵向合并单元格 
            sheet.addMergedRegion(region);

            nCell = nRow.createCell(5);
            nCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
            nCell.setCellValue(Double.parseDouble(printMap.get("Cnumber2")));
            nCell.setCellStyle(poiUtil.numberrv10_BorderThin(wb, defaultFont10));    

            //Unit
            region = new CellRangeAddress(curRow-1, curRow, 6, 6);    //纵向合并单元格 
            sheet.addMergedRegion(region);

            nCell = nRow.createCell(6);
            nCell.setCellValue(printMap.get("PackingUnit2"));
            nCell.setCellStyle(poiUtil.moneyrv10_BorderThin(wb, defaultFont10, rmb4Format));    

            //Price
            region = new CellRangeAddress(curRow-1, curRow, 7, 7);    //纵向合并单元格 
            sheet.addMergedRegion(region);

            nCell = nRow.createCell(7);
            nCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
            nCell.setCellValue(Double.parseDouble(printMap.get("Price2")));
            nCell.setCellStyle(poiUtil.moneyrv10_BorderThin(wb, defaultFont10, rmb4Format));


            //Amount
            region = new CellRangeAddress(curRow-1, curRow, 8, 8);    //纵向合并单元格 
            sheet.addMergedRegion(region);

            nCell = nRow.createCell(8);
            if(UtilFuns.isNotEmpty(printMap.get("Cnumber2")) && UtilFuns.isNotEmpty(printMap.get("Price2"))){
                nCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                nCell.setCellFormula("F"+String.valueOf(curRow)+"*H"+String.valueOf(curRow));
            }
            nCell.setCellStyle(poiUtil.moneyrv10_BorderThin(wb, defaultFont10, rmb4Format));        

            curRow++;

            region = new CellRangeAddress(curRow-1, curRow-1, 1, 3);    //纵向合并单元格
            sheet.addMergedRegion(region);

            nRow = sheet.createRow(curRow-1);
            nRow.setHeightInPoints(24);

            nCell = nRow.createCell(1);
            nCell.setCellValue(printMap.get("ProductNo2"));
            nCell.setCellStyle(poiUtil.notecv10_BorderThin(wb, defaultFont10));            

            //合并单元格画线
            for(int j=2;j<9;j++){
                nCell = nRow.createCell(j);
                nCell.setCellStyle(poiUtil.notehv10_BorderThin(wb, defaultFont10));
            }                
        }


        //InputBy
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(24);

        nCell = nRow.createCell(1);
        nCell.setCellValue(printMap.get("InputBy"));
        nCell.setCellStyle(poiUtil.bnormalv12(wb,defaultFont12));

        //CheckBy+inspector

        nCell = nRow.createCell(4);
        nCell.setCellValue(printMap.get("CheckBy"));
        nCell.setCellStyle(poiUtil.bnormalv12(wb,defaultFont12));

        //if(contract.getPrintStyle().equals("2") && UtilFuns.isNotEmpty(printMap.get("ProductNo2"))){

            nCell = nRow.createCell(7);
            nCell.setCellValue("总金额:");
            nCell.setCellStyle(bcv12(wb));

            //TotalAmount
            nRow = sheet.createRow(curRow-1);
            nRow.setHeightInPoints(24);
            if(UtilFuns.isNotEmpty(printMap.get("Cnumber"))&&UtilFuns.isNotEmpty(printMap.get("Price"))){
                nCell  = nRow.createCell(8);
                nCell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                nCell.setCellFormula("SUM(I"+String.valueOf(curRow-4)+":I"+String.valueOf(curRow-1)+")");
                nCell.setCellStyle(poiUtil.moneyrv12_BorderThin(wb,defaultFont12,rmb2Format));        
            }
        //}


        //note
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(21);

        nCell = nRow.createCell(2);
        nCell.setCellValue(printMap.get("Remark"));
        nCell.setCellStyle(noteStyle(wb));            

        //Request
        region = new CellRangeAddress(curRow, curRow, 1, 8);    //指定合并区域 
        sheet.addMergedRegion(region);

        nRow = sheet.createRow(curRow++);
        float height = poiUtil.getCellAutoHeight(printMap.get("Request"), 12f);        //自动高度
        nRow.setHeightInPoints(height);

        nCell = nRow.createCell(1);
        nCell.setCellValue(printMap.get("Request"));
        nCell.setCellStyle(requestStyle(wb));

        //space line
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(20);

        //duty
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(32);

        nCell = nRow.createCell(1);
        nCell.setCellValue("未按以上要求出货而导致客人索赔,由供方承担。");
        nCell.setCellStyle(dutyStyle(wb));    

        //space line
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(32);

        //buyer
        nRow = sheet.createRow(curRow++);
        nRow.setHeightInPoints(25);

        nCell = nRow.createCell(1);
        nCell.setCellValue("    收购方负责人:");
        nCell.setCellStyle(dutyStyle(wb));                

        //seller
        nCell = nRow.createCell(5);
        nCell.setCellValue("供方负责人:");
        nCell.setCellStyle(dutyStyle(wb));    

        curRow++;

    }

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();            //生成流对象
    wb.write(byteArrayOutputStream);                                                    //将excel写入流

    //工具类,封装弹出下载框:        
    String outFile = "购销合同.xls";
    DownloadUtil down = new DownloadUtil();
    down.download(byteArrayOutputStream, response, outFile);

}

private HSSFCellStyle leftStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    curStyle.setWrapText(true);                          //换行   
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置
    //fTitle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setFontHeightInPoints((short)10);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    curStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);                //实线右边框
    curStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);                //实线右边框

    return curStyle;
}  

private HSSFCellStyle headStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("Comic Sans MS");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    curFont.setItalic(true);
    curFont.setFontHeightInPoints((short)16);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}  

private HSSFCellStyle tipStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("Georgia");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setFontHeightInPoints((short)28);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}  

private HSSFCellStyle addressStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("宋体");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    //fTitle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setFontHeightInPoints((short)10);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}  

private HSSFCellStyle ltdStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("Times New Roman");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setItalic(true);
    curFont.setFontHeightInPoints((short)16);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}     

private HSSFCellStyle telStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("宋体");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    //fTitle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setFontHeightInPoints((short)9);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}     

private HSSFCellStyle titleStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("黑体");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setFontHeightInPoints((short)18);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}     

private HSSFCellStyle requestStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    curStyle.setWrapText(true);                          //换行   
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("宋体");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    curFont.setFontHeightInPoints((short)10);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}     

private HSSFCellStyle dutyStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("黑体");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setFontHeightInPoints((short)16);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}     

private HSSFCellStyle noteStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("宋体");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setFontHeightInPoints((short)12);
    curStyle.setFont(curFont);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
} 

public HSSFCellStyle thStyle(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                    //设置字体
    curFont.setFontName("宋体");
    curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);    //加粗
    curFont.setFontHeightInPoints((short)12);
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);        //设置中文字体,那必须还要再对单元格进行编码设置

    curStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);                //实线右边框
    curStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);                //实线右边框
    curStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);            //实线右边框
    curStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);                //实线右边框

    curStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}  

public HSSFCellStyle bcv12(HSSFWorkbook wb){
    HSSFCellStyle curStyle = wb.createCellStyle();
    HSSFFont curFont = wb.createFont();                        //设置字体
    curFont.setFontName("Times New Roman");
    curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);            //设置中文字体,那必须还要再对单元格进行编码设置

    curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);        //加粗
    curFont.setFontHeightInPoints((short)12);
    curStyle.setFont(curFont);

    curStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);                //实线
    curStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);            //粗实线
    curStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);            //实线
    curStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);                //实线

    curStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
    curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中

    return curStyle;
}        

}