【springmvc+mybatis项目实战】杰信商贸-26.出货表修饰+下载

上一次我们利用POI技术完成了出货表的取值、构建以及生产excel文件。下面我们继续利用POI技术来修饰我们之前构造的excel,然后将修饰完的excel能让用户下载。

回顾一下之前用代码生成的excel

我们的表格并不是很好看,而且大部分表格的长度不足以存储数据,我们要对这个表进行完整的修改。

记不记得我们之前的出货表样板:

我们现在没有标题,所以要给它加一个标题,这个标题是需要单元格合并的,所以我们在这里设置它
[java]  view plain copy
  1. //大标题,合并单元格  
  2. sheet.addMergedRegion(new CellRangeAddress(0,0,1,9));//开始行,结束行,开列,结束列  
  3. //合并单元格的内容是写在合并前第一个单元格中  
  4. nRow=sheet.createRow(rowNo++);  
  5. nCell=nRow.createCell(1);  
  6. nCell.setCellValue(inputDate.replaceFirst("-0","-").replaceFirst("-","年")+"月份出货表");//yyyy-MM  

完整代码:
[java]  view plain copy
  1. //打印  
  2. @RequestMapping("/cargo/outproduct/print.action")  
  3. public void print(String inputDate) throws IOException{  //inputDate格式:yyyy-MM  
  4.       
  5.     List<OutProductVO> dataList=outProductService.find(inputDate);  
  6.     /*System.out.println(dataList.size()); 
  7.     System.out.println(inputDate);*/  
  8.   
  9.   
  10.     Workbook wb=new HSSFWorkbook();  
  11.     Sheet sheet=wb.createSheet();  
  12.     Row nRow=null;  
  13.     Cell nCell=null;  
  14.       
  15.     int rowNo=0;  //行号  
  16.     int cellNo=1;//列号  
  17.       
  18.     //大标题,合并单元格  
  19.     sheet.addMergedRegion(new CellRangeAddress(0,0,1,9));//开会行,结束行,开始列,结束列  
  20.     //合并单元格的内容是写在合并前第一个单元格中  
  21.     nRow=sheet.createRow(rowNo++);  
  22.     nCell=nRow.createCell(1);  
  23.     nCell.setCellValue(inputDate.replaceFirst("-0","-").replaceFirst("-","年")+"月份出货表");//yyyy-MM  
  24.       
  25.     //配置标题行  
  26.     String [] title=new String[]{"客户","订单号","货号","数量","工厂","附件","工厂交期","船期","贸易条款"};  
  27.       
  28.     nRow=sheet.createRow(rowNo++);  
  29.     for (int i = 0; i < title.length; i++) {  
  30.         nCell=nRow.createCell(i+1);  
  31.         nCell.setCellValue(title[i]);  
  32.     }  
  33.       
  34.     //处理数据  
  35.     for (int i = 0; i < dataList.size(); i++) {  
  36.         OutProductVO op=dataList.get(i);  
  37.   
  38.   
  39.         nRow=sheet.createRow(rowNo++);  
  40.         cellNo=1;//列号初始化  
  41.           
  42.         nCell=nRow.createCell(cellNo++);  
  43.         nCell.setCellValue(op.getCustomName());  
  44.           
  45.         nCell=nRow.createCell(cellNo++);  
  46.         nCell.setCellValue(op.getcontractNo());  
  47.           
  48.         nCell=nRow.createCell(cellNo++);  
  49.         nCell.setCellValue(op.getProductNo());  
  50.           
  51.         nCell=nRow.createCell(cellNo++);  
  52.         nCell.setCellValue(op.getCnumber());  
  53.           
  54.         nCell=nRow.createCell(cellNo++);  
  55.         nCell.setCellValue(op.getFactoryName());  
  56.           
  57.         nCell=nRow.createCell(cellNo++);  
  58.         nCell.setCellValue(op.getExts());  
  59.           
  60.         nCell=nRow.createCell(cellNo++);  
  61.         nCell.setCellValue(op.getDelivery_preriod());  
  62.           
  63.         nCell=nRow.createCell(cellNo++);  
  64.         nCell.setCellValue(op.getShip_time());  
  65.           
  66.         nCell=nRow.createCell(cellNo++);  
  67.         nCell.setCellValue(op.getTradeTerms());  
  68.     }  
  69.       
  70.     OutputStream os=new FileOutputStream(new File("F:\\outproduct.xls"));  
  71.     wb.write(os);  
  72.     os.close();  
  73.       
  74. }  

然后打印出来的效果是:



但是样式还是不好看,并且标题还不是居中的,我们再修改一下标题:
[java]  view plain copy
  1. //声明样式对象和字体对象  
  2. CellStyle nStyle=wb.createCellStyle();  
  3. Font nFont=wb.createFont();  
  4.           
  5. //大标题,合并单元格  
  6. sheet.addMergedRegion(new CellRangeAddress(0,0,1,9));//开会行,结束行,开始列,结束列  
  7. //合并单元格的内容是写在合并前第一个单元格中  
  8. nRow=sheet.createRow(rowNo++);  
  9. nRow.setHeightInPoints(36);//行高  
  10.   
  11.   
  12. nCell=nRow.createCell(1);  
  13. nCell.setCellValue(inputDate.replaceFirst("-0","-").replaceFirst("-","年")+"月份出货表");//yyyy-MM  
  14. nCell.setCellStyle(this.bigTitle(wb, nStyle, nFont));  

其中bigTitle方法
[java]  view plain copy
  1. //大标题样式  
  2. public CellStyle bigTitle(Workbook wb,CellStyle nStyle,Font nFont){  
  3.     nFont.setFontName("宋体");  
  4.     nFont.setFontHeightInPoints((short)16);  
  5.     //设置字体加粗  
  6.     nFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  7.     //横向居中  
  8.     nStyle.setAlignment(CellStyle.ALIGN_CENTER);  
  9.     //纵向居中  
  10.     nStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);  
  11.     nStyle.setFont(nFont);  
  12.       
  13.     return nStyle;  
  14. }  

最后测试一下打印出来的结果:

符合我们的需求,我们接下来修饰一下我们下面的所有数据表格,设置字体与表格宽度等属性,修改后的完整代码为:
[java]  view plain copy
  1. //打印  
  2. @RequestMapping("/cargo/outproduct/print.action")  
  3. public void print(String inputDate) throws IOException{  //inputDate格式:yyyy-MM  
  4.       
  5.     List<OutProductVO> dataList=outProductService.find(inputDate);  
  6.     /*System.out.println(dataList.size()); 
  7.     System.out.println(inputDate);*/  
  8.   
  9.   
  10.     Workbook wb=new HSSFWorkbook();  
  11.     Sheet sheet=wb.createSheet();  
  12.     Row nRow=null;  
  13.     Cell nCell=null;  
  14.       
  15.     int rowNo=0;  //行号  
  16.     int cellNo=1;//列号  
  17.       
  18.     //声明样式对象和字体对象  
  19.     CellStyle nStyle=wb.createCellStyle();  
  20.     Font nFont=wb.createFont();  
  21.       
  22.     //设置表格宽度  
  23.     sheet.setColumnWidth(0,1*300);//列宽  
  24.     sheet.setColumnWidth(1,26*300);//列宽  
  25.     sheet.setColumnWidth(2,12*300);//列宽  
  26.     sheet.setColumnWidth(3,29*300);//列宽  
  27.     sheet.setColumnWidth(4,10*300);//列宽  
  28.     sheet.setColumnWidth(5,12*300);//列宽  
  29.     sheet.setColumnWidth(6,8*300);//列宽  
  30.     sheet.setColumnWidth(7,10*300);//列宽  
  31.     sheet.setColumnWidth(8,10*300);//列宽  
  32.     sheet.setColumnWidth(9,8*300);//列宽  
  33.       
  34.     //大标题,合并单元格  
  35.     sheet.addMergedRegion(new CellRangeAddress(0,0,1,9));//开会行,结束行,开始列,结束列  
  36.     //合并单元格的内容是写在合并前第一个单元格中  
  37.     nRow=sheet.createRow(rowNo++);  
  38.     nRow.setHeightInPoints(36);//行高  
  39.       
  40.     nCell=nRow.createCell(1);  
  41.     nCell.setCellValue(inputDate.replaceFirst("-0","-").replaceFirst("-","年")+"月份出货表");//yyyy-MM  
  42.     nCell.setCellStyle(this.bigTitle(wb, nStyle, nFont));  
  43.       
  44.     //配置标题行  
  45.     String [] title=new String[]{"客户","订单号","货号","数量","工厂","附件","工厂交期","船期","贸易条款"};  
  46.       
  47.     nRow=sheet.createRow(rowNo++);  
  48.     nRow.setHeightInPoints(26.25f);//标题的高  
  49.     nStyle=wb.createCellStyle();//重新初始化样式  
  50.     nFont=wb.createFont();//重新初始化字体  
  51.     for (int i = 0; i < title.length; i++) {  
  52.         nCell=nRow.createCell(i+1);  
  53.         nCell.setCellValue(title[i]);  
  54.         nCell.setCellStyle(this.Title(wb, nStyle, nFont));  
  55.     }  
  56.       
  57.     nStyle=wb.createCellStyle();//重新初始化样式  
  58.     nFont=wb.createFont();//重新初始化字体  
  59.       
  60.     //处理数据  
  61.     for (int i = 0; i < dataList.size(); i++) {  
  62.         OutProductVO op=dataList.get(i);  
  63.   
  64.   
  65.         nRow=sheet.createRow(rowNo++);  
  66.         nRow.setHeightInPoints(24);//数据框的高  
  67.         cellNo=1;//列号初始化  
  68.           
  69.         nCell=nRow.createCell(cellNo++);  
  70.         nCell.setCellValue(op.getCustomName());  
  71.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  72.           
  73.         nCell=nRow.createCell(cellNo++);  
  74.         nCell.setCellValue(op.getcontractNo());  
  75.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  76.           
  77.         nCell=nRow.createCell(cellNo++);  
  78.         nCell.setCellValue(op.getProductNo());  
  79.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  80.           
  81.         nCell=nRow.createCell(cellNo++);  
  82.         nCell.setCellValue(op.getCnumber());  
  83.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  84.           
  85.         nCell=nRow.createCell(cellNo++);  
  86.         nCell.setCellValue(op.getFactoryName());  
  87.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  88.           
  89.         nCell=nRow.createCell(cellNo++);  
  90.         nCell.setCellValue(op.getExts());  
  91.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  92.           
  93.         nCell=nRow.createCell(cellNo++);  
  94.         nCell.setCellValue(op.getDelivery_preriod());  
  95.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  96.           
  97.         nCell=nRow.createCell(cellNo++);  
  98.         nCell.setCellValue(op.getShip_time());  
  99.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  100.           
  101.         nCell=nRow.createCell(cellNo++);  
  102.         nCell.setCellValue(op.getTradeTerms());  
  103.         nCell.setCellStyle(this.Text(wb, nStyle, nFont));  
  104.           
  105.     }  
  106.       
  107.     OutputStream os=new FileOutputStream(new File("F:\\outproduct.xls"));  
  108.     wb.write(os);  
  109.     os.close();  
  110.       
  111. }  
  112.   
  113.   
  114. //大标题样式  
  115. public CellStyle bigTitle(Workbook wb,CellStyle nStyle,Font nFont){  
  116.     nFont.setFontName("宋体");  
  117.     nFont.setFontHeightInPoints((short)16);  
  118.     //设置字体加粗  
  119.     nFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  120.     //横向居中  
  121.     nStyle.setAlignment(CellStyle.ALIGN_CENTER);  
  122.     //纵向居中  
  123.     nStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);  
  124.     nStyle.setFont(nFont);  
  125.       
  126.     return nStyle;  
  127. }  
  128.   
  129.   
  130. //标题样式  
  131. public CellStyle Title(Workbook wb,CellStyle nStyle,Font nFont){  
  132.     nFont.setFontName("黑体");  
  133.     nFont.setFontHeightInPoints((short)12);  
  134.     //设置字体加粗  
  135.     nFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  136.     //横向居中  
  137.     nStyle.setAlignment(CellStyle.ALIGN_CENTER);  
  138.     //纵向居中  
  139.     nStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);  
  140.     //表格线(上下左右的细线)  
  141.     nStyle.setBorderTop(CellStyle.BORDER_THIN);  
  142.     nStyle.setBorderLeft(CellStyle.BORDER_THIN);  
  143.     nStyle.setBorderRight(CellStyle.BORDER_THIN);  
  144.     nStyle.setBorderBottom(CellStyle.BORDER_THIN);  
  145.       
  146.     nStyle.setFont(nFont);  
  147.       
  148.     return nStyle;  
  149. }  
  150.   
  151.   
  152. //文字样式  
  153. public CellStyle Text(Workbook wb,CellStyle nStyle,Font nFont){  
  154.     nFont.setFontName("Times New Roman");  
  155.     nFont.setFontHeightInPoints((short)10);  
  156.     //横向居中  
  157.     nStyle.setAlignment(CellStyle.ALIGN_CENTER);  
  158.     //纵向居中  
  159.     nStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);  
  160.     //表格线(上下左右的细线)  
  161.     nStyle.setBorderTop(CellStyle.BORDER_THIN);  
  162.     nStyle.setBorderLeft(CellStyle.BORDER_THIN);  
  163.     nStyle.setBorderRight(CellStyle.BORDER_THIN);  
  164.     nStyle.setBorderBottom(CellStyle.BORDER_THIN);  
  165.       
  166.     nStyle.setFont(nFont);  
  167.       
  168.     return nStyle;  
  169. }  

修饰后效果


为了方便之后的打印,我们还要思考以下问题:
1.添加页脚,因为要打印多张,以防打印出错。
2.要将表调整成横向,因为纵向打印会超出纸张的宽度。
3.每张都要添加标题栏,不然会弄混
4.内容样式稍有不同,就需要创建不同的格式的样式,写很多样式应用的语句。

这些问题我们之后再来解决,我们先给系统页面添加一个连接,好下载打印完成之后的文档:
我们将之前的生产文件代码:
[java]  view plain copy
  1. OutputStream os=new FileOutputStream(new File("F:\\outproduct.xls"));  
  2. wb.write(os);  
  3. os.flush();  
  4. os.close();  

修改为:
[java]  view plain copy
  1. //下载(使用了我们的工具类)  
  2. DownloadUtil du=new DownloadUtil();  
  3. ByteArrayOutputStream bs=new ByteArrayOutputStream();  
  4. wb.write(bs);  
  5. du.download(bs, response, "出货表.xls");  

其中DownloadUtil类是我们的工具类,此类的详细代码为:
[java]  view plain copy
  1. package cn.hpu.jk.Util;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.IOException;  
  7.   
  8.   
  9. import javax.servlet.ServletOutputStream;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12.   
  13. public class DownloadUtil {  
  14.       
  15.     /** 
  16.      * @param filePath 要下载的文件路径 
  17.      * @param returnName 返回的文件名 
  18.      * @param response HttpServletResponse 
  19.      * @param delFlag 是否删除文件 
  20.      */  
  21.     protected void download(String filePath,String returnName,HttpServletResponse response,boolean delFlag){  
  22.         this.prototypeDownload(new File(filePath), returnName, response, delFlag);  
  23.     }  
  24.   
  25.   
  26.   
  27.   
  28.     /** 
  29.      * @param file 要下载的文件 
  30.      * @param returnName 返回的文件名 
  31.      * @param response HttpServletResponse 
  32.      * @param delFlag 是否删除文件 
  33.      */  
  34.     protected void download(File file,String returnName,HttpServletResponse response,boolean delFlag){  
  35.         this.prototypeDownload(file, returnName, response, delFlag);  
  36.     }  
  37.       
  38.     /** 
  39.      * @param file 要下载的文件 
  40.      * @param returnName 返回的文件名 
  41.      * @param response HttpServletResponse 
  42.      * @param delFlag 是否删除文件 
  43.      */  
  44.     public void prototypeDownload(File file,String returnName,HttpServletResponse response,boolean delFlag){  
  45.         // 下载文件  
  46.         FileInputStream inputStream = null;  
  47.         ServletOutputStream outputStream = null;  
  48.         try {  
  49.             if(!file.exists()) return;  
  50.             response.reset();  
  51.             //设置响应类型    PDF文件为"application/pdf",WORD文件为:"application/msword", EXCEL文件为:"application/vnd.ms-excel"。    
  52.             response.setContentType("application/octet-stream;charset=utf-8");  
  53.   
  54.   
  55.             //设置响应的文件名称,并转换成中文编码  
  56.             //returnName = URLEncoder.encode(returnName,"UTF-8");  
  57.             returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1")); //保存的文件名,必须和页面编码一致,否则乱码  
  58.               
  59.             //attachment作为附件下载;inline客户端机器有安装匹配程序,则直接打开;注意改变配置,清除缓存,否则可能不能看到效果  
  60.             response.addHeader("Content-Disposition",   "attachment;filename="+returnName);    
  61.               
  62.             //将文件读入响应流  
  63.             inputStream = new FileInputStream(file);  
  64.             outputStream = response.getOutputStream();  
  65.             int length = 1024;  
  66.             int readLength=0;  
  67.             byte buf[] = new byte[1024];  
  68.             readLength = inputStream.read(buf, 0, length);  
  69.             while (readLength != -1) {  
  70.                 outputStream.write(buf, 0, readLength);  
  71.                 readLength = inputStream.read(buf, 0, length);  
  72.             }  
  73.         } catch (Exception e) {  
  74.             e.printStackTrace();  
  75.         } finally {  
  76.             try {  
  77.                 outputStream.flush();  
  78.             } catch (IOException e) {  
  79.                 e.printStackTrace();  
  80.             }  
  81.             try {  
  82.                 outputStream.close();  
  83.             } catch (IOException e) {  
  84.                 e.printStackTrace();  
  85.             }  
  86.             try {  
  87.                 inputStream.close();  
  88.             } catch (IOException e) {  
  89.                 e.printStackTrace();  
  90.             }  
  91.             //删除原文件  
  92.               
  93.             if(delFlag) {                 
  94.                 file.delete();  
  95.             }  
  96.         }  
  97.     }  
  98.   
  99.   
  100.     /** 
  101.      * by tony 2013-10-17 
  102.      * @param byteArrayOutputStream 将文件内容写入ByteArrayOutputStream 
  103.      * @param response HttpServletResponse  写入response 
  104.      * @param returnName 返回的文件名 
  105.      */  
  106.     public void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException{  
  107.         response.setContentType("application/octet-stream;charset=utf-8");  
  108.         returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1")); //保存的文件名,必须和页面编码一致,否则乱码  
  109.         response.addHeader("Content-Disposition",   "attachment;filename=" + returnName);    
  110.         response.setContentLength(byteArrayOutputStream.size());  
  111.           
  112.         ServletOutputStream outputstream = response.getOutputStream();  //取得输出流  
  113.         byteArrayOutputStream.writeTo(outputstream);    //写到输出流  
  114.         byteArrayOutputStream.close();  //关闭  
  115.         outputstream.flush();   //刷数据  
  116.     }  
  117. }  

然后我们再重启服务器,选择日期点击打印之后,发现弹出了下载框:


之后点击保存之后,发现我们已经将文件下载到桌面上了,打开之后发现内容完全正确:



好,至此我们的出货表的构造和打印完成!下一次我们将用另外一种更好方法来设计我们的出货表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值