我们之前学习了POI技术,可以利用POI进行自定义excel文件的生成。我们接下来就将利用这一技术来实现我们的出货表的打印。
回顾一下我们的出货表
我们将利用POI构造这样一个excel文档,然后将它生成。
我们先从头来分析,“2012年8月份出货表”是一个标题,并且合并了单元格,我们应该怎么做呢?
我们的出货表的开发步骤如下
1.获取数据
2.创建excel文件
3.将数据写入excel文件
先从“获取数据”开始,我们的出货表是按照月份出货的,所以我们要先编写一个界面,让用户在这个页面来选择需要打印几月份的出货表:
然后我们需要一个Controller来处理用户选择的日期,然后创建相应的文件:
这里我们先打印inputDate看看值有没有传过来
然后我们在我们页面的左侧菜单栏中添加我们的入口:
重启服务器后,点击“出货表”,就会看到如下界面
然后选择一个日期点击打印,在控制台就会看到我们选择的日期
所以我们的日期是可以正常传过去的。
我们接下来要进行出货表数据的获取了,我们之前分析过,精简到最后我们也是要查询合同和货物表的。
这里是我们获取出货表数据的SQL(以取出2014年11月的数据为例)
我们从上面的出货表信息可以看到,我们所需要查询的就是“客户”、“订单号”、“货号”、“数量”、“工厂”、“附件”、“工厂交期”、“船期”和“贸易条款”这几个字段。
所以我们可以自定义一个VO对象(包含上面这些数据),用来有选择性的用过SQL查询出需要的数据然后封装到我们自定义的VO对象
我们现在构造一个出货表的Mapper映射文件OutProductMapper.xml,在其中添加查询语句,主要来查询我们出货表需要的数据:
接下来开始编写我们的Dao层:
OutProductDao.java:
OutProductDaoImpl.java:
接下来开始写Service层:
OutProductService.java:
OutProductServiceImpl.java:
在beans-service.xml中注入我们的Service:
回到我们之前的Controller类中,我们对print方法进行编写
我们在数据库中取出的2014年11月的是2条记录
我们实验一下,发现我们取出了2条,说明我们的find方法功能实现。
那么接下来我们就开始把取到的数据编写成excel形式,我们在打印方法中添加下面的代码:
然后我们去F盘下,看到生成了一个新的文件
打开这个文件,我们可以看到我们的出货表已经打印出来了,跟数据库中的一样
回顾一下我们的出货表
我们将利用POI构造这样一个excel文档,然后将它生成。
我们先从头来分析,“2012年8月份出货表”是一个标题,并且合并了单元格,我们应该怎么做呢?
我们的出货表的开发步骤如下
1.获取数据
2.创建excel文件
3.将数据写入excel文件
先从“获取数据”开始,我们的出货表是按照月份出货的,所以我们要先编写一个界面,让用户在这个页面来选择需要打印几月份的出货表:
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ include file="../../base.jsp"%>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>打印出货表</title>
- <script language="javascript" src="${ctx}/js/datepicker/WdatePicker.js"></script>
- </head>
- <body>
- <form method="post">
- <div id="menubar">
- <div id="middleMenubar">
- <div id="innerMenubar">
- <div id="navMenubar">
- <ul>
- <li id="save"><a href="#" onclick="formSubmit('print.action','_self');">打印</a></li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- <div class="textbox" id="centerTextbox">
- <div class="textbox-header">
- <div class="textbox-inner-header">
- <div class="textbox-title">
- 出货表月统计
- </div>
- </div>
- </div>
- <div>
- <div>
- <table class="commonTable" cellspacing="1">
- <tr>
- <td class="columnTitle_mustbe">船期:</td>
- <td class="tableContent">
- <input type="text" style="width: 90px" name="inputDate" readonly class="Wdate"
- onclick="WdatePicker({el:this,isShowOthers:true,dateFmt:'yyyy-MM'});"/>
- </td>
- </tr>
- </table>
- </div>
- </div>
- </form>
- </body>
- </html>
然后我们需要一个Controller来处理用户选择的日期,然后创建相应的文件:
- package cn.hpu.jk.controller.cargo.outproduct;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import cn.hpu.jk.controller.BaseController;
- @Controller
- public class OutProductController extends BaseController{
- //转向输入年月的页面
- @RequestMapping("/cargo/outproduct/toedit.action")
- public String toedit(){
- return "/cargo/outproduct/jOutProduct.jsp";
- }
- //打印
- @RequestMapping("/cargo/outproduct/print.action")
- public void print(String inputDate){ //inputDate格式:yyyy-MM
- System.out.println(inputDate);
- }
- }
这里我们先打印inputDate看看值有没有传过来
然后我们在我们页面的左侧菜单栏中添加我们的入口:
- </div>
- <div class="panel">
- <div class="panel_icon"><img src="${ctx}/skin/default/images/icon/document_into.png"/></div>
- <div class="panel-header">
- <div class="panel-title">货运管理</div>
- <div class="panel-content">
- <ul>
- <li><a href="${ctx }/cargo/contract/list.action" onclick="linkHighlighted(this)" target="main" id="aa_1">购销合同</a></li>
- <li><a href="${ctx }/cargo/outproduct/toedit.action" onclick="linkHighlighted(this)" target="main" id="aa_1">出货表</a></li>
- </ul>
- </div>
- </div>
- </div>
效果:
重启服务器后,点击“出货表”,就会看到如下界面
然后选择一个日期点击打印,在控制台就会看到我们选择的日期
所以我们的日期是可以正常传过去的。
我们接下来要进行出货表数据的获取了,我们之前分析过,精简到最后我们也是要查询合同和货物表的。
这里是我们获取出货表数据的SQL(以取出2014年11月的数据为例)
- select
- 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
- from
- (
- select
- contract_id,custom_name,contract_no,delivery_period,ship_time,trade_terms
- from contract_c
- ) c
- left join
- (
- select
- contract_id,product_no,cnumber||packing_unit as cnumber,factory_name,exts
- from contract_product_c
- ) cp
- on c.contract_id=cp.contract_id
- where to_char(c.ship_time,'yyyy-MM')= '2014-11'
我们从上面的出货表信息可以看到,我们所需要查询的就是“客户”、“订单号”、“货号”、“数量”、“工厂”、“附件”、“工厂交期”、“船期”和“贸易条款”这几个字段。
所以我们可以自定义一个VO对象(包含上面这些数据),用来有选择性的用过SQL查询出需要的数据然后封装到我们自定义的VO对象
- package cn.hpu.jk.vo;
- public class OutProductVO {
- private String customName;
- private String contract_no;
- private String productNo;
- private String cnumber;
- private String factoryName;
- private String exts;
- private String delivery_preriod;
- private String ship_time;
- private String tradeTerms;
- //get和set方法省略
- }
我们现在构造一个出货表的Mapper映射文件OutProductMapper.xml,在其中添加查询语句,主要来查询我们出货表需要的数据:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="cn.hpu.jk.mapper.OutProductMapper">
- <resultMap type="cn.hpu.jk.vo.OutProductVO" id="OutProductRM">
- <result property="customName" column="CUSTOM_NAME" jdbcType="VARCHAR"/>
- <result property="contractNo" column="CONTRACT_NO" jdbcType="VARCHAR"/>
- <result property="productNo" column="PRODUCT_NO" jdbcType="VARCHAR"/>
- <result property="cnumber" column="CNUMBER" jdbcType="VARCHAR"/>
- <result property="factoryName" column="FACTORY_NAME" jdbcType="VARCHAR"/>
- <result property="exts" column="EXTS" jdbcType="VARCHAR"/>
- <result property="delivery_preriod" column="DELIVERY_PRERIOD" jdbcType="VARCHAR"/>
- <result property="ship_time" column="SHIP_TIME" jdbcType="VARCHAR"/>
- <result property="tradeTerms" column="TRADE_TERMS" jdbcType="VARCHAR"/>
- </resultMap>
- <select id="find" parameterType="string" resultMap="OutProductRM">
- select
- c.custom_name,c.contract_no,cp.product_no,cp.cnumber,cp.factory_name,cp.exts,
- to_char(c.delivery_period,'yyyy-mm-dd')as delivery_period,
- to_char(c.ship_time,'yyyy-mm-dd')as ship_time,c.trade_terms
- from
- (
- select
- contract_id,custom_name,contract_no,delivery_period,ship_time,trade_terms
- from contract_c
- ) c
- left join
- (
- select
- contract_id,product_no,cnumber||packing_unit as cnumber,factory_name,exts
- from contract_product_c
- ) cp
- on c.contract_id=cp.contract_id
- where to_char(c.ship_time,'yyyy-MM')= #{inputDate}
- </select>
- </mapper>
接下来开始编写我们的Dao层:
OutProductDao.java:
- package cn.hpu.jk.dao;
- import cn.hpu.jk.vo.OutProductVO;
- public interface OutProductDao extends BaseDao<OutProductVO>{
- }
OutProductDaoImpl.java:
- package cn.hpu.jk.dao.impl;
- import org.springframework.stereotype.Repository;
- import cn.hpu.jk.dao.OutProductDao;
- import cn.hpu.jk.vo.OutProductVO;
- @Repository //为了包扫描的时候这个Dao被扫描到
- public class OutProductDaoImpl extends BaseDaoImpl<OutProductVO> implements OutProductDao{
- public OutProductDaoImpl(){
- //设置命名空间
- super.setNs("cn.hpu.jk.mapper.OutProductMapper");
- }
- }
接下来开始写Service层:
OutProductService.java:
- package cn.hpu.jk.service;
- import java.util.List;
- import cn.hpu.jk.vo.OutProductVO;
- public interface OutProductService {
- public List<OutProductVO> find(String inputDate);
- }
OutProductServiceImpl.java:
- package cn.hpu.jk.service.impl;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.annotation.Resource;
- import cn.hpu.jk.dao.OutProductDao;
- import cn.hpu.jk.service.OutProductService;
- import cn.hpu.jk.vo.OutProductVO;
- public class OutProductServiceImpl implements OutProductService{
- @Resource
- OutProductDao outProductDao;
- @Override
- public List<OutProductVO> find(String inputDate) {
- Map paraMap=new HashMap();
- paraMap.put("inputDate", inputDate);
- return outProductDao.find(paraMap);
- }
- }
在beans-service.xml中注入我们的Service:
- <bean name="outProductService" class="cn.hpu.jk.service.impl.OutProductServiceImpl"/>
回到我们之前的Controller类中,我们对print方法进行编写
- package cn.hpu.jk.controller.cargo.outproduct;
- import java.util.List;
- import javax.annotation.Resource;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import cn.hpu.jk.controller.BaseController;
- import cn.hpu.jk.service.OutProductService;
- import cn.hpu.jk.vo.OutProductVO;
- @Controller
- public class OutProductController extends BaseController{
- @Resource
- OutProductService outProductService;
- //转向输入年月的页面
- @RequestMapping("/cargo/outproduct/toedit.action")
- public String toedit(){
- return "/cargo/outproduct/jOutProduct.jsp";
- }
- //打印
- @RequestMapping("/cargo/outproduct/print.action")
- public void print(String inputDate){ //inputDate格式:yyyy-MM
- List<OutProductVO> dataList=outProductService.find(inputDate);
- System.out.println(dataList.size());
- System.out.println(inputDate);
- }
- }
我们在数据库中取出的2014年11月的是2条记录
我们实验一下,发现我们取出了2条,说明我们的find方法功能实现。
那么接下来我们就开始把取到的数据编写成excel形式,我们在打印方法中添加下面的代码:
- //打印
- @RequestMapping("/cargo/outproduct/print.action")
- public void print(String inputDate) throws IOException{ //inputDate格式:yyyy-MM
- List<OutProductVO> dataList=outProductService.find(inputDate);
- /*System.out.println(dataList.size());
- System.out.println(inputDate);*/
- Workbook wb=new HSSFWorkbook();
- Sheet sheet=wb.createSheet();
- Row nRow=null;
- Cell nCell=null;
- int rowNo=0; //行号
- int cellNo=1;//列号
- rowNo++;
- //配置标题行
- String [] title=new String[]{"客户","订单号","货号","数量","工厂","附件","工厂交期","船期","贸易条款"};
- nRow=sheet.createRow(rowNo++);
- for (int i = 0; i < title.length; i++) {
- nCell=nRow.createCell(i+1);
- nCell.setCellValue(title[i]);
- }
- //处理数据
- for (int i = 0; i < dataList.size(); i++) {
- OutProductVO op=dataList.get(i);
- nRow=sheet.createRow(rowNo++);
- cellNo=1;//列号初始化
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getCustomName());
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getcontractNo());
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getProductNo());
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getCnumber());
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getFactoryName());
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getExts());
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getDelivery_preriod());
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getShip_time());
- nCell=nRow.createCell(cellNo++);
- nCell.setCellValue(op.getTradeTerms());
- }
- OutputStream os=new FileOutputStream(new File("F:\\outproduct.xls"));
- wb.write(os);
- os.close();
- }
然后我们去F盘下,看到生成了一个新的文件
打开这个文件,我们可以看到我们的出货表已经打印出来了,跟数据库中的一样