【springmvc+mybatis项目实战】杰信商贸-25.出货表打印

我们之前学习了POI技术,可以利用POI进行自定义excel文件的生成。我们接下来就将利用这一技术来实现我们的出货表的打印。

回顾一下我们的出货表

我们将利用POI构造这样一个excel文档,然后将它生成。

我们先从头来分析,“2012年8月份出货表”是一个标题,并且合并了单元格,我们应该怎么做呢?

我们的出货表的开发步骤如下
1.获取数据
2.创建excel文件
3.将数据写入excel文件

先从“获取数据”开始,我们的出货表是按照月份出货的,所以我们要先编写一个界面,让用户在这个页面来选择需要打印几月份的出货表:
[html]  view plain copy
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ include file="../../base.jsp"%>  
  3. <html xmlns="http://www.w3.org/1999/xhtml">  
  4. <head>  
  5.     <title>打印出货表</title>  
  6.     <script language="javascript" src="${ctx}/js/datepicker/WdatePicker.js"></script>  
  7. </head>  
  8. <body>  
  9. <form method="post">  
  10.   
  11.   
  12. <div id="menubar">  
  13. <div id="middleMenubar">  
  14. <div id="innerMenubar">  
  15.     <div id="navMenubar">  
  16. <ul>  
  17. <li id="save"><a href="#" onclick="formSubmit('print.action','_self');">打印</a></li>  
  18. </ul>  
  19.     </div>  
  20. </div>  
  21. </div>  
  22. </div>  
  23.        
  24. <div class="textbox" id="centerTextbox">  
  25.       
  26.     <div class="textbox-header">  
  27.     <div class="textbox-inner-header">  
  28.     <div class="textbox-title">  
  29.         出货表月统计  
  30.     </div>   
  31.     </div>  
  32.     </div>  
  33. <div>  
  34.    
  35.     <div>  
  36.         <table class="commonTable" cellspacing="1">    
  37.                 <tr>  
  38.                     <td class="columnTitle_mustbe">船期:</td>  
  39.                     <td class="tableContent">  
  40.                     <input type="text" style="width: 90px" name="inputDate" readonly class="Wdate"  
  41.                      onclick="WdatePicker({el:this,isShowOthers:true,dateFmt:'yyyy-MM'});"/>  
  42.                     </td>  
  43.                 </tr>  
  44.         </table>  
  45.     </div>  
  46. </div>  
  47.    
  48.    
  49. </form>  
  50. </body>  
  51. </html>  

然后我们需要一个Controller来处理用户选择的日期,然后创建相应的文件:
[java]  view plain copy
  1. package cn.hpu.jk.controller.cargo.outproduct;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.   
  6. import cn.hpu.jk.controller.BaseController;  
  7.   
  8.   
  9. @Controller  
  10. public class OutProductController extends BaseController{  
  11.     //转向输入年月的页面  
  12.     @RequestMapping("/cargo/outproduct/toedit.action")  
  13.     public String toedit(){  
  14.         return "/cargo/outproduct/jOutProduct.jsp";  
  15.     }  
  16.       
  17.     //打印  
  18.     @RequestMapping("/cargo/outproduct/print.action")  
  19.     public void print(String inputDate){  //inputDate格式:yyyy-MM  
  20.         System.out.println(inputDate);  
  21.     }  
  22. }  

这里我们先打印inputDate看看值有没有传过来

然后我们在我们页面的左侧菜单栏中添加我们的入口:
[html]  view plain copy
  1. </div>  
  2.        <div class="panel">  
  3.        <div class="panel_icon"><img src="${ctx}/skin/default/images/icon/document_into.png"/></div>  
  4.        <div class="panel-header">  
  5.        <div class="panel-title">货运管理</div>  
  6.        <div class="panel-content">  
  7.         <ul>  
  8.             <li><a href="${ctx }/cargo/contract/list.action" onclick="linkHighlighted(this)" target="main" id="aa_1">购销合同</a></li>  
  9.             <li><a href="${ctx }/cargo/outproduct/toedit.action" onclick="linkHighlighted(this)" target="main" id="aa_1">出货表</a></li>  
  10.         </ul>  
  11.        </div>  
  12.        </div>  
  13. </div>  

效果:



重启服务器后,点击“出货表”,就会看到如下界面

然后选择一个日期点击打印,在控制台就会看到我们选择的日期

所以我们的日期是可以正常传过去的。

我们接下来要进行出货表数据的获取了,我们之前分析过,精简到最后我们也是要查询合同和货物表的。

这里是我们获取出货表数据的SQL(以取出2014年11月的数据为例)
[sql]  view plain copy
  1. select  
  2. c.custom_name,c.contract_no,cp.product_no,cp.cnumber,cp.factory_name,cp.exts,c.delivery_period,c.ship_time,c.trade_terms  
  3. from  
  4. (  
  5. select    
  6. contract_id,custom_name,contract_no,delivery_period,ship_time,trade_terms  
  7. from contract_c  
  8. ) c  
  9. left join  
  10. (  
  11. select   
  12. contract_id,product_no,cnumber||packing_unit as cnumber,factory_name,exts   
  13. from contract_product_c  
  14. ) cp  
  15. on c.contract_id=cp.contract_id  
  16.   
  17.   
  18. where to_char(c.ship_time,'yyyy-MM')= '2014-11'  

我们从上面的出货表信息可以看到,我们所需要查询的就是“客户”、“订单号”、“货号”、“数量”、“工厂”、“附件”、“工厂交期”、“船期”和“贸易条款”这几个字段。
所以我们可以自定义一个VO对象(包含上面这些数据),用来有选择性的用过SQL查询出需要的数据然后封装到我们自定义的VO对象
[java]  view plain copy
  1. package cn.hpu.jk.vo;  
  2.   
  3. public class OutProductVO {  
  4.     private String customName;  
  5.     private String contract_no;  
  6.     private String productNo;  
  7.     private String cnumber;  
  8.     private String factoryName;  
  9.     private String exts;  
  10.     private String delivery_preriod;  
  11.     private String ship_time;  
  12.     private String tradeTerms;  
  13.       
  14.     //get和set方法省略  
  15. }  

我们现在构造一个出货表的Mapper映射文件OutProductMapper.xml,在其中添加查询语句,主要来查询我们出货表需要的数据:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper  
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="cn.hpu.jk.mapper.OutProductMapper">  
  6.   
  7.   
  8.     <resultMap type="cn.hpu.jk.vo.OutProductVO" id="OutProductRM">  
  9.         <result property="customName" column="CUSTOM_NAME" jdbcType="VARCHAR"/>  
  10.         <result property="contractNo" column="CONTRACT_NO" jdbcType="VARCHAR"/>  
  11.         <result property="productNo" column="PRODUCT_NO" jdbcType="VARCHAR"/>  
  12.         <result property="cnumber" column="CNUMBER" jdbcType="VARCHAR"/>  
  13.         <result property="factoryName" column="FACTORY_NAME" jdbcType="VARCHAR"/>  
  14.         <result property="exts" column="EXTS" jdbcType="VARCHAR"/>  
  15.         <result property="delivery_preriod" column="DELIVERY_PRERIOD" jdbcType="VARCHAR"/>  
  16.         <result property="ship_time" column="SHIP_TIME" jdbcType="VARCHAR"/>  
  17.         <result property="tradeTerms" column="TRADE_TERMS" jdbcType="VARCHAR"/>  
  18.     </resultMap>  
  19.       
  20.     <select id="find" parameterType="string" resultMap="OutProductRM">  
  21.         select  
  22.           c.custom_name,c.contract_no,cp.product_no,cp.cnumber,cp.factory_name,cp.exts,  
  23.           to_char(c.delivery_period,'yyyy-mm-dd')as delivery_period,  
  24.           to_char(c.ship_time,'yyyy-mm-dd')as ship_time,c.trade_terms  
  25.         from  
  26.         (  
  27.         select    
  28.         contract_id,custom_name,contract_no,delivery_period,ship_time,trade_terms  
  29.         from contract_c  
  30.         ) c  
  31.         left join  
  32.         (  
  33.         select   
  34.         contract_id,product_no,cnumber||packing_unit as cnumber,factory_name,exts   
  35.         from contract_product_c  
  36.         ) cp  
  37.         on c.contract_id=cp.contract_id  
  38.           
  39.         where to_char(c.ship_time,'yyyy-MM')= #{inputDate}  
  40.     </select>  
  41. </mapper>  

接下来开始编写我们的Dao层:
OutProductDao.java:
[java]  view plain copy
  1. package cn.hpu.jk.dao;  
  2.   
  3. import cn.hpu.jk.vo.OutProductVO;  
  4.   
  5. public interface OutProductDao extends BaseDao<OutProductVO>{  
  6.   
  7. }  

OutProductDaoImpl.java:
[java]  view plain copy
  1. package cn.hpu.jk.dao.impl;  
  2.   
  3. import org.springframework.stereotype.Repository;  
  4.   
  5. import cn.hpu.jk.dao.OutProductDao;  
  6. import cn.hpu.jk.vo.OutProductVO;  
  7.   
  8. @Repository //为了包扫描的时候这个Dao被扫描到  
  9. public class OutProductDaoImpl extends BaseDaoImpl<OutProductVO> implements OutProductDao{  
  10.       
  11.     public OutProductDaoImpl(){  
  12.         //设置命名空间  
  13.         super.setNs("cn.hpu.jk.mapper.OutProductMapper");  
  14.     }  
  15.    
  16. }  

接下来开始写Service层:
OutProductService.java:
[java]  view plain copy
  1. package cn.hpu.jk.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import cn.hpu.jk.vo.OutProductVO;  
  6.   
  7. public interface OutProductService {  
  8.     public List<OutProductVO> find(String inputDate);  
  9. }  

OutProductServiceImpl.java:
[java]  view plain copy
  1. package cn.hpu.jk.service.impl;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import javax.annotation.Resource;  
  8.   
  9. import cn.hpu.jk.dao.OutProductDao;  
  10. import cn.hpu.jk.service.OutProductService;  
  11. import cn.hpu.jk.vo.OutProductVO;  
  12.   
  13. public class OutProductServiceImpl implements OutProductService{  
  14.   
  15.     @Resource  
  16.     OutProductDao outProductDao;  
  17.       
  18.     @Override  
  19.     public List<OutProductVO> find(String inputDate) {  
  20.         Map paraMap=new HashMap();  
  21.         paraMap.put("inputDate", inputDate);  
  22.         return outProductDao.find(paraMap);  
  23.     }  
  24.   
  25.   
  26. }  

在beans-service.xml中注入我们的Service:
[html]  view plain copy
  1. <bean name="outProductService" class="cn.hpu.jk.service.impl.OutProductServiceImpl"/>  

回到我们之前的Controller类中,我们对print方法进行编写
[java]  view plain copy
  1. package cn.hpu.jk.controller.cargo.outproduct;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import org.springframework.stereotype.Controller;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9.   
  10.   
  11. import cn.hpu.jk.controller.BaseController;  
  12. import cn.hpu.jk.service.OutProductService;  
  13. import cn.hpu.jk.vo.OutProductVO;  
  14.   
  15.   
  16. @Controller  
  17. public class OutProductController extends BaseController{  
  18.       
  19.     @Resource  
  20.     OutProductService outProductService;  
  21.       
  22.     //转向输入年月的页面  
  23.     @RequestMapping("/cargo/outproduct/toedit.action")  
  24.     public String toedit(){  
  25.         return "/cargo/outproduct/jOutProduct.jsp";  
  26.     }  
  27.       
  28.     //打印  
  29.     @RequestMapping("/cargo/outproduct/print.action")  
  30.     public void print(String inputDate){  //inputDate格式:yyyy-MM  
  31.           
  32.         List<OutProductVO> dataList=outProductService.find(inputDate);  
  33.         System.out.println(dataList.size());  
  34.         System.out.println(inputDate);  
  35.     }  
  36. }  

我们在数据库中取出的2014年11月的是2条记录


我们实验一下,发现我们取出了2条,说明我们的find方法功能实现。



那么接下来我们就开始把取到的数据编写成excel形式,我们在打印方法中添加下面的代码:
[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.     rowNo++;  
  18.       
  19.     //配置标题行  
  20.     String [] title=new String[]{"客户","订单号","货号","数量","工厂","附件","工厂交期","船期","贸易条款"};  
  21.       
  22.     nRow=sheet.createRow(rowNo++);  
  23.     for (int i = 0; i < title.length; i++) {  
  24.         nCell=nRow.createCell(i+1);  
  25.         nCell.setCellValue(title[i]);  
  26.     }  
  27.       
  28.     //处理数据  
  29.     for (int i = 0; i < dataList.size(); i++) {  
  30.         OutProductVO op=dataList.get(i);  
  31.   
  32.   
  33.         nRow=sheet.createRow(rowNo++);  
  34.         cellNo=1;//列号初始化  
  35.           
  36.         nCell=nRow.createCell(cellNo++);  
  37.         nCell.setCellValue(op.getCustomName());  
  38.           
  39.         nCell=nRow.createCell(cellNo++);  
  40.         nCell.setCellValue(op.getcontractNo());  
  41.           
  42.         nCell=nRow.createCell(cellNo++);  
  43.         nCell.setCellValue(op.getProductNo());  
  44.           
  45.         nCell=nRow.createCell(cellNo++);  
  46.         nCell.setCellValue(op.getCnumber());  
  47.           
  48.         nCell=nRow.createCell(cellNo++);  
  49.         nCell.setCellValue(op.getFactoryName());  
  50.           
  51.         nCell=nRow.createCell(cellNo++);  
  52.         nCell.setCellValue(op.getExts());  
  53.           
  54.         nCell=nRow.createCell(cellNo++);  
  55.         nCell.setCellValue(op.getDelivery_preriod());  
  56.           
  57.         nCell=nRow.createCell(cellNo++);  
  58.         nCell.setCellValue(op.getShip_time());  
  59.           
  60.         nCell=nRow.createCell(cellNo++);  
  61.         nCell.setCellValue(op.getTradeTerms());  
  62.     }  
  63.       
  64.     OutputStream os=new FileOutputStream(new File("F:\\outproduct.xls"));  
  65.     wb.write(os);  
  66.     os.close();  
  67.       
  68. }  

然后我们去F盘下,看到生成了一个新的文件

打开这个文件,我们可以看到我们的出货表已经打印出来了,跟数据库中的一样


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值