我们要实现的效果:

 
 
进入到这个页面后,输入要查询的条件,查询出药品表的数据,然后按下导出按钮 ,就会在服务器的一个目录下生成一个药品表的excel表格。
 点击”导出”之后:
点击下载就能下载Excel表格,实现导出功能。
 
 
 
讲解如下:
 
还是分为三层:
1:Dao层
 
 
我们先看sql语句。
在PL/SQL写sql:
select
id,
bm,
mc,
jx,
gg,
zhxs,
scqymc,
spmc,jyzt,
zbjg,
(select info from dictinfo where dictinfo.typecode=''and dictinfo.dictcode=ypxx.jyzt )jyztmc//药品的使用状态
from ypxx
结果:

我们要查的药品的表格里面包含了药品的使用状态(使用,停用),所以不单单是对药品表的查询,也包含了别的表,所以。我们的po类是一个自定义的类:YpxxMaapaerCustom.java:这个类继承于Ypxx.java这个单表的po类。

package yycg.business.pojo.vo;
import yycg.business.pojo.po.Ypxx;
/**
*
* @ClassName: YpxxCustom
* @Description: 从数据库中查出来的数据放在这里。也就是自定义的pojo类
* @author A18ccms a18ccms_gmail_com
* @date 2016年11月23日 上午12:00:19
*
*/
public class YpxxCustom extends Ypxx{ private String jyztmc; public String getJyztmc() {
return jyztmc;
} public void setJyztmc(String jyztmc) {
this.jyztmc = jyztmc;
} }
 接下来我们写
 YpxxMapperCustom.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="yycg.business.dao.mapper.YpxxMapperCustom" >
<!-- 药品目录查询条件 -->
<sql id="query_ypxx_where">
<if test="ypxxCustom!=null">
<!-- 药品的流水号 -->
<if test="ypxxCustom.bm!=null and ypxxCustom.bm!=''">
and ypxx.bm = #{ypxxCustom.bm}
</if>
<!-- 药品的通用名 -->
<if test="ypxxCustom.mc!=null and ypxxCustom.mc!=''">
and ypxx.mc = #{ypxxCustom.mc}
</if>
<!-- 药品的剂型-->
<if test="ypxxCustom.jx!=null and ypxxCustom.jx!=''"> and ypxx.jx like '%${ypxxCustom.jx}%' </if>
<!-- 药品的类别-->
<if test="ypxxCustom.lb!=null and ypxxCustom.lb!=''"> and ypxx.lb = #{ypxxCustom.lb} </if>
<!-- 药品的启用停止-->
<if test="ypxxCustom.jyzt!=null and ypxxCustom.jyzt!=''"> and ypxx.jyzt = #{ypxxCustom.jyzt} </if> </if>
</sql>
<!-- 药品目录查询
这个yycg.business.pojo.vo.YpxxQueryVo是包装类,从Action传数据时用的。 -->
<select id="findYpxxList" parameterType="yycg.business.pojo.vo.YpxxQueryVo" resultType="yycg.business.pojo.vo.YpxxCustom">
select
id,
bm,
mc,
jx,
gg,
zhxs,
scqymc,
spmc,jyzt,
zbjg,
(select info from dictinfo where dictinfo.typecode='003'and dictinfo.dictcode=ypxx.jyzt )jyztmc
from ypxx
<where>
<include refid="query_ypxx_where"></include>
</where>
</select>
</mapper>

接下来写Mapper接口:

package yycg.business.dao.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import yycg.business.pojo.po.Ypxx;
import yycg.business.pojo.po.YpxxExample;
import yycg.business.pojo.vo.YpxxCustom;
import yycg.business.pojo.vo.YpxxQueryVo;
/*
* Dao层
*/
public interface YpxxMapperCustom {
/*
* 查找药品的数据
*/
public List<YpxxCustom> findYpxxList(YpxxQueryVo ypxxQueryVo); }

接下来写Service层:

我们直接看实现类:

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import yycg.business.dao.mapper.YpxxMapperCustom;
import yycg.business.pojo.vo.YpxxCustom;
import yycg.business.pojo.vo.YpxxQueryVo;
import yycg.business.service.YpxxService; public class YpxxServiceImpl implements YpxxService {
@Autowired
YpxxMapperCustom ypxxMapperCustom;
@Override
public List<YpxxCustom> findYpxxList(YpxxQueryVo ypxxQueryVo) {
return ypxxMapperCustom.findYpxxList(ypxxQueryVo); } }

我们看Action层:

package yycg.business.action;

import java.util.ArrayList;
import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import yycg.base.pojo.po.Dictinfo;
import yycg.base.process.context.Config;
import yycg.base.process.result.ResultUtil;
import yycg.base.process.result.SubmitResultInfo;
import yycg.base.service.SystemConfigService;
import yycg.business.pojo.vo.YpxxCustom;
import yycg.business.pojo.vo.YpxxQueryVo;
import yycg.business.service.YpxxService;
import yycg.util.ExcelExportSXXSSF;
import yycg.util.Ypxx; @Controller
@RequestMapping("/ypml")
public class YpxxAction { @Autowired
YpxxService ypxxService;
@Autowired
private SystemConfigService systemConfigService; //导出页面的展示 @RequestMapping("/exportYpxx")
public String exPortYpxx(Model model) throws Exception
{
/**
* 这些数据查出来后填充到查询页面上。
*/
List<Dictinfo> yplblist=systemConfigService.findDictinfoByType("001");
model.addAttribute("yplblist", yplblist); List<Dictinfo> jyztlist=systemConfigService.findDictinfoByType("003");
model.addAttribute("jyztlist", jyztlist); return "/business/ypml/exportYpxx";
} //导出提交
@RequestMapping("/exportYpxxSubmit")
public @ResponseBody SubmitResultInfo exPortYpxxsubmit(YpxxQueryVo ypxxQueryVo)throws Exception
{
//查询到数据
List<YpxxCustom> list=ypxxService.findYpxxList(ypxxQueryVo); /** 导出文件存放物理路径
* @param fileWebPath
* 导出文件web下载路径
* @param filePrefix
* 导出文件名的前缀
* @param flushRows
* 存放在内存的数据量
* @param fieldNames
* 导出文件列标题
* @param fieldCodes
* 导出数据对象的字段名称
* @param flushRows*/
//导出文件存放的路径,并且是虚拟目录指向的路径
String filePath = "d:/upload/linshi/";
//导出文件的前缀
String filePrefix="ypxx";
//-1表示关闭自动刷新,手动控制写磁盘的时机,其它数据表示多少数据在内存保存,超过的则写入磁盘
int flushRows=100; //指导导出数据的title
List<String> fieldNames=new ArrayList<String>();
fieldNames.add("流水号");
fieldNames.add("通用名");
fieldNames.add("剂型");
fieldNames.add("规格");
fieldNames.add("转换系数 ");
fieldNames.add("生产企业");
fieldNames.add("商品名称");
fieldNames.add("中标价");
fieldNames.add("交易状态"); //告诉导出类数据list中对象的属性,让ExcelExportSXXSSF通过反射获取对象的值
List<String> fieldCodes=new ArrayList<String>();
fieldCodes.add("bm");//药品流水号
fieldCodes.add("mc");//通用名
fieldCodes.add("jx");
fieldCodes.add("gg");
fieldCodes.add("zhxs");
fieldCodes.add("scqymc");
fieldCodes.add("spmc");
fieldCodes.add("zbjg");
fieldCodes.add("jyztmc"); //注意:fieldCodes和fieldNames个数必须相同且属性和title顺序一一对应,这样title和内容才一一对应 //开始导出,执行一些workbook及sheet等对象的初始创建,以及表格建在哪里
//"/upload/"本来是服务器的磁盘目录,但是我们是一台机器做开发,所以见建立一个虚拟目录。
ExcelExportSXXSSF excelExportSXXSSF = ExcelExportSXXSSF.start(filePath, "/upload/", filePrefix, fieldNames, fieldCodes, flushRows); //准备导出的数据,将数据存入list,且list中对象的字段名称必须是刚才传入ExcelExportSXXSSF的名称 //执行导出,把数据导入到excel表
excelExportSXXSSF.writeDatasByObject(list); /*
* new Object[]{list.size(),excelExportSXXSSF.exportFile()}参数:一共导出的数据数量,.exportFile()导出文件。
*/
return ResultUtil.createSubmitResult(ResultUtil.createSuccess(Config.MESSAGE, 313, new Object[]{list.size(),excelExportSXXSSF.exportFile()})); } }

写页面调试:

修改menu.json:

{
"menus" : [{"icon" : "icon-sys","menuid" : "1","menuname" : "系统管理","url" : "","menus" : [
{"icon" : "icon-log","menuid" : "1_1","menuname" : "用户管理","url" : "/yycgproject/user/queryuser.action"
}]
},
{"icon" : "icon-sys","menuid" : "1","menuname" : "药品目录 ","url" : "","menus" : [
{"icon" : "icon-log","menuid" : "1_1","menuname" : "药品目录导出","url" : "/yycgproject/ypml/exportYpxx.action"
}]
}
]
}

就会出现:

然后点击“药品目录导出”进入到YpxxAction.java中的@RequestMapping("/exportYpxx")public String exPortYpxx(Model model) throws Exception然后

进入到exportYpxx.jsp页面:

exportYpxx.jsp这个页面:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ include file="/WEB-INF/jsp/base/tag.jsp"%>
<html>
<head>
<title>药品目录导出</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <%@ include file="/WEB-INF/jsp/base/common_css.jsp"%>
<%@ include file="/WEB-INF/jsp/base/common_js.jsp"%> <script type="text/javascript">
//药品信息导出
function ypxxexport(){
//调用ajax Form提交
jquerySubByFId('ypxxlistFrom',ypxxExprot_callback,null,"json"); }
function ypxxExprot_callback(data){ //在这里提示信息中有文件下载链接
message_alert(data); }
</script> </head>
<body>
<!-- 导出条件 --> <form id="ypxxlistFrom" name="ypxxlistFrom" action="${baseurl}ypml/exportYpxxSubmit.action" method="post">
<TABLE class="table_search">
<TBODY>
<TR>
<TD class="left">流水号:</TD>
<td ><INPUT type="text" name="ypxxCustom.bm" /></td>
<TD class="left">通用名:</td>
<td><INPUT type="text" name="ypxxCustom.mc" /></TD> <TD class="left">药品类别:</TD>
<td >
<select id="ypxxCustom.lb" name="ypxxCustom.lb" style="width:150px">
<option value="">全部</option>
<c:forEach items="${yplblist}" var="value">
<option value="${value.id}">${value.info}</option>
</c:forEach>
</select>
</td>
<TD class="left">交易状态:</TD>
<td >
<select id="ypxxCustom.jyzt" name="ypxxCustom.jyzt" style="width:150px">
<option value="">全部</option>
<c:forEach items="${jyztlist}" var="value">
<option value="${value.dictcode}">${value.info}</option>
</c:forEach>
</select> </td>
</TR>
<tr>
<td colspan="12" style="text-align:center"><a id="btn" href="#" onclick="ypxxexport()" class="easyui-linkbutton" iconCls='icon-search'>导出</a></td>
</tr>
</TBODY>
</TABLE> </form> </body>
</html>
 点击导出进入到YpxxAction.java中的
 @RequestMapping("/exportYpxxSubmit")
    public @ResponseBody SubmitResultInfo exPortYpxxsubmit。
解释一下这个函数中的 //"/upload/"本来是服务器的磁盘目录,但是我们是一台机器做开发,所以见建立一个虚拟目录。 ExcelExportSXXSSF excelExportSXXSSF = ExcelExportSXXSSF.start(filePath, "/upload/", filePrefix, fieldNames, fieldCodes, flushRows);
 
就是说我们用eclipse建立一个虚拟的目录,生成的Excel表格就放在那里,在实现

点击“点击下载”之后,下载excel表格。

 
我们讲一下怎么建立虚拟目录:
双击两次:

进入到:

这样就可以了。

调试:成功。

这样,我们的导出功能就做好了。

 
 

023医疗项目-模块二:药品目录的导入导出-从数据库中查出数据用XSSF导出excel并存放在虚拟目录最后下载(包括调试)的更多相关文章

  1. 027医疗项目-模块二:药品目录的导入导出-导入功能的Action的编写

    前一篇文章我们写了Service层,这篇文章我们写一下Action层. 实现的功能: 1:我们先下载模板:然后按照模板里面的规则,插入数据.比如存在d盘. 2:然后浏览找到那个文件,上传上去. 然后把 ...

  2. 022医疗项目-模块二:药品目录的导入导出-对XSSF导出excel类进行封装

    资源全部来源于传智播客. 好的架构师写的程序,就算给刚入门的新手看,新手一看就知道怎么去用.所以我们要对XSSF导出excel类进行封装.这是架构师的工作,但我们也要知道. 我们写一个封装类: 这个类 ...

  3. 021医疗项目-模块二:药品目录的导入导出-介绍poi类

    我们使用的是.10版本 Apache POI - the Java API for Microsoft Documents,Apache POI 是用Java编写的免费开源的跨平台的 Java API ...

  4. 026医疗项目-模块二:药品目录的导入导出-导入功能的Service的编写

    这个导入功能要实现的效果是: 思路是: 因为我们最后是在Action层中调用的HxlsRead工具,这个工具传入的就是我们要实现的上一篇文章说到的实现了HxlsOptRowsInterface接口的类 ...

  5. 025医疗项目-模块二:药品目录的导入导出-HSSF导入类的封装

    上一篇文章提过,HSSF的用户模式会导致读取海量数据时很慢,所以我们采用的是事件驱动模式.这个模式类似于xml的sax解析.需要实现一个接口,HSSFListener接口. 原理:根据excel底层存 ...

  6. 024医疗项目-模块二:药品目录的导入导出-HSSF导入类的学习

    我们之前学习了怎么把数据的数据导出来保存到Excle中,这篇文章我们学习怎么Excel数据导出然后插入到数据库中. 我们先学习HSSF怎么用来导出数据. 看官方教程步骤如下: 第一步: 创建一个wor ...

  7. 044医疗项目-模块四:采购单模块—采购单保存(Dao,Service,Action三层)

    我们上上一篇文章(042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中)做的工作是把数据插入到了数据库,我们这篇文章做的是042医疗项目-模块四:采购单模块-采购单明细添加 ...

  8. SpringMVC第五篇【方法返回值、数据回显、idea下配置虚拟目录、文件上传】

    Controller方法返回值 Controller方法的返回值其实就几种类型,我们来总结一下-. void String ModelAndView redirect重定向 forward转发 数据回 ...

  9. 035医疗项目-模块三:药品供应商目录模块——供货商药品目录(批量)添加药品的功能---------Service

    这篇文章我们重点介绍Service层.因为Dao层就是用Gysypml逆向生成的Mapper就可以了.所以这里重点讲解Service层. 业务逻辑如下: 1:我们从前端页面传入有两个值:1:userg ...

随机推荐

  1. 通过重写OnScrollListener来监听RecyclerView是否滑动到底部

    为了增加复用性和灵活性,我们还是定义一个接口来做监听滚动到底部的回调,这样你就可以把它用在listview,scrollView中去. OnBottomListener package kale.co ...

  2. Unable to start activity ComponentInfo{com.first/com.first.Game}

    原因一: xxx的错误,若为R.layout.main  那么应该是main.xml文件中的标签 使用错误,最常见的而且编译器不会提示的错误就是 android:name 和android:id 两者 ...

  3. C实现通用数据结构--双向链表

    双向链表概述 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继next和直接前驱prev.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结 ...

  4. Android环境的搭建

    一.Java环境的配置(以JDK1.7为例) 在环境变量下查看,查看是否存在JAVA_HOME,没有的话新建一个 JAVA_HOME:java安装目录下jdk的安装目录 Path:jdk目录下面的bi ...

  5. HTTP通信过程底层实现原理

  6. iOS之小功能模块--彩虹动画进度条学习和自主封装改进

    前言: 首先展示一下这个iOS小示例的彩色进度条动画效果: 阅读本文先说说好处:对于基础不好的读者,可以直接阅读文末尾的"如何使用彩虹动画进度条"章节,然后将我封装好的这个功能模块 ...

  7. 我体验过的可以用的XCode插件

    XCode版本:7.0.1 其实插件的使用,如果能得到直接的xclugin后缀文件,是可以直接放置在隐藏文件夹中: /Users/HeYang/Library/Application Support/ ...

  8. 二维码扫描利用ZBar实现

    上次是根据系统的属性自己封装的一个二维码扫描,这次给大家介绍一下基于ZBar集成的类似于QQ二维码扫描界面的二维码扫描的效果.                                     ...

  9. 如何在sublime text 3 上安装插件package control

    今天由于帮同事搞web方面的东西,于是又重新安装了sublime text 这款神器.发现官方网站都更新到sublime text3了,于是下载装了下,突然发现少了很重要的一个功能,竟然没有packa ...

  10. 搭建openvpn 未完成。。。

    轻松构建自己的OpenVPN家庭服务器(VMware+Amahi) http://os.51cto.com/art/201107/277146_all.htm  这是教程 不用安装第一步的,直接把下载 ...