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

我们要实现的效果:

进入到这个页面后,输入要查询的条件,查询出药品表的数据,然后按下导出按钮 ,就会在服务器的一个目录下生成一个药品表的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=‘003‘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表格。

我们讲一下怎么建立虚拟目录:

双击两次:

进入到:

这样就可以了。

调试:成功。

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

时间: 2024-10-06 22:05:26

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

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

资源全部来源于传智播客. 好的架构师写的程序,就算给刚入门的新手看,新手一看就知道怎么去用.所以我们要对XSSF导出excel类进行封装.这是架构师的工作,但我们也要知道. 我们写一个封装类: 这个类单独有自己的main函数. 我们进入main函数一步一步看: public static void main(String[] args) throws Exception { /** 导出文件存放物理路径 * @param fileWebPath * 导出文件web下载路径 * @param fi

MVC4+EF5+Oracle项目点滴记录(001)将数据库中的数据用NPOI导出生成excel

关于NOPI 2.0在项目中的使用 1.在官网下载 NPOI 文件包 http://npoi.codeplex.com/releases 下载后将NPOI.dll和ICSharpCode.SharpZipLib.dll加载到项目中  最好是全部加载(NPOI.OOXML.dll.NPOI.OpenXml4Net.dll.NPOI.OpenXmlFormats.dll) 2.在三层中的Model层中新建一个类,专门用来处理数据表导成Excel,这里先导出数据库City表中的全部信息 代码如下 (注

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

这个导入功能要实现的效果是: 思路是: 因为我们最后是在Action层中调用的HxlsRead工具,这个工具传入的就是我们要实现的上一篇文章说到的实现了HxlsOptRowsInterface接口的类.所以我们的Server层的类直接去继承HxlsOptRowsInterface接口.然后把这个Service传入到Action中HxlsRead工具中,的这篇文章说的就是Service 层: 代码如下: package yycg.business.service.impl; import java

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

上一篇文章提过,HSSF的用户模式会导致读取海量数据时很慢,所以我们采用的是事件驱动模式.这个模式类似于xml的sax解析.需要实现一个接口,HSSFListener接口. 原理:根据excel底层存储(07以版本采用xml存储,以下版本采用二进制)标签决定事件出发点. 目标:在解析完一行(row)数据时进行触发. 优点:读取大数据时,不会导致内存溢出 缺点:用户在解析数据时比较困难.读取数据时速度不快的,因为读取数据的同时根据每个标签进行事件触发. HSSF事件驱动读取文件的封装类解析. 主要

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

我们之前学习了怎么把数据的数据导出来保存到Excle中,这篇文章我们学习怎么Excel数据导出然后插入到数据库中. 我们先学习HSSF怎么用来导出数据. 看官方教程步骤如下: 第一步: 创建一个workbook //文件输入流 InputStream is = new FileInputStream("d:/test11.xls"); //创建hssf的workbook,将文件流传入workbook HSSFWorkbook hssfWorkbook = new HSSFWorkboo

029医疗项目-模块三:药品供应商目录模块——数据模型的分析(建表)

这篇文章主要分析数据库表的结构,以及表和表的关系. 如下: 供货商方面的分析: 供货商需要将自己供应的药品信息添加到供货商药品目录中,药品目录中存在药品说明供货商要供应这些药品,医院按照供货商供应药品去采购. 功能分析: 1:供货商添加药品目录 说明供货商要供应这些药品     向供货商药品目录表插入一条数据 2:供货商删除药品目录 供货商不再供货从供货商药品目录表删除记录,根据供货商id和药品信息id删除记录 供货商药品目录表: Id:主键 供货商id:外键,引用供货商单位表的主键 药品信息i

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

我们上上一篇文章(042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中)做的工作是把数据插入到了数据库,我们这篇文章做的是042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中这里没有写采购量,我们这篇文章做的就是把采购量写进入,也就是Updata之前的那个记录.这样采购单里面的记录就完整了. 如下: Dao层:用的是逆向工程生成的:yycgdmxMapper.updateByPrimaryKeySelective(yycgdmx_updat

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

这篇文章我们重点介绍Service层.因为Dao层就是用Gysypml逆向生成的Mapper就可以了.所以这里重点讲解Service层. 业务逻辑如下: 1:我们从前端页面传入有两个值:1:usergysid(供应商的id),2:YPPxxID(药品的目录id) 我们看一下我们要插入数据的表: 我们要做的就是把这两个字段插入. 2:我们看这样表的设计: 这里有这么一个约束,那就是YPXXID和USERGYSID两个字段成为一个主键.

017医疗项目-模块一:用户登录功能的实现

用户在登录页面上填好姓名和密码还有验证码实现登录. 实现的效果如下: 输入信息后成功. 具体做法代码如下: 我们还是从Dao层开始: 这里用到的Dao层的代码无非就是查名字,查密码什么的.之前就有的,这里的不用了. Service:这一层很重要: 先讲一下这一层要做的东西: 我们要做用户的登录验证. 1.根据传进来的id,去数据库查有没有这个用户,没有直接抛异常,有的话就继续下一步. 2.根据查到的用户sysuser.去查他的存在数据库里面的密码和我们在页面上的密码是不是一致的,一致的就继续,不