Java操作Jxl实现导出数据生成Excel表格数据文件

实现:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js、Css文件。页面:Jsp、拦截请求:Servlet、逻辑处理:ClassBean、数据库:SQLserver。

注意:Bean中操作SQL语句进行处理是公司内部方法,可替换为其它方法自行扩展!主要看代码逻辑业务处理!

使用SQLserver数据库进行多表连接查询得出需要展出的数据

Java操作Jxl实现导出数据生成Excel表格数据文件

 

则前台数据展示使用的是Easyui中的datagrid数据列表进行展示。

Java操作Jxl实现导出数据生成Excel表格数据文件

 

 随机点击一行数据,点击详情个人信息弹窗打开,数据以及被填充到弹窗中!

Java操作Jxl实现导出数据生成Excel表格数据文件

  拉到底部可见导出按钮,点击导出发送请求:传入个人就诊编号及卡号进行SQL查询个人数据实现导出

Java操作Jxl实现导出数据生成Excel表格数据文件

 

 此时此刻Java操作Jxl生成Excel文件成功直接,让我们打开文件查看数据是否和我们后台设置的预期效果一致!

Java操作Jxl实现导出数据生成Excel表格数据文件

表格数据和预期效果一致代码如下:

Bean代码:

Java操作Jxl实现导出数据生成Excel表格数据文件

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import jxl.CellView;
import jxl.Workbook;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;


public class ImportBean {
    
    private HttpServletRequest request;//客户端请求对象
    private DBSource db; //操作SQL语句对象
    private String MSG;  //提示信息
    
    
    //构造函数
    public ImportBean(HttpServletRequest request) {
        this.request = request;
        this.db = new DBSource(request); // 数据库对象
    }
    
    
    

    //主诉与症状下拉框
    public Vector loadZSZZCombo() throws SQLException{
        Vector vec = null;
        String sql ="  select '' as comboValue,'请选择' as comboName, '' as combotext  "+ 
                "union all " +
                "select [编号],[主诉与症状],[查体]  FROM [V_医务管理_主诉症状信息表]";
        sql+=" ORDER BY comboValue ";
        vec = db.getConttexJONSArr(sql, 0, 0);
        return vec;
    }
        
    
    
    //页面初始化读取就诊信息
    public Vector queryJZXX(int pageNum, int pageSize,String JZBH,String KH) throws SQLException{
        String sql = ""; // 查询用SQL语句
        Vector vec = null; // 结果集    
        
        sql="select 就诊编号,卡号,姓名,班级或部门,人员类型,就诊医生,convert(nvarchar(19),就诊时间,21) as 就诊时间,主诉与症状,查体,是否隔离,诊断结果,诊疗意见,病历类型,isnull(转院原因,'') as 转院原因,isnull(转诊医院,'') as 转诊医院,isnull(转诊医生,'') as 转诊医生,isnull(convert(nvarchar(19),转院时间,21),'') as 转院时间  from ( SELECT l.就诊编号,a.[卡号],a.[姓名],b.班级名称 as 班级或部门,'1' as 人员类型,j.就诊医生,j.就诊时间  as 就诊时间,l.主诉与症状,l.查体,l.是否隔离,l.诊断结果,l.诊疗意见,l.病历类型,z.转院原因,z.转诊医院,z.转诊医生,z.转院时间" + 
            " from [V_基础信息_学生信息表] a "+
            " left join [V_医务管理_就诊信息] j on j.卡号=a.卡号  left join [V_医务管理_病历信息] l on l.就诊编号=j.编号  " + 
            " left join [V_医务管理_转院信息] z on z.就诊编号=j.编号  left join dbo.V_基础信息_班级信息表 b on a.[行政班代码]=b.班级代码  "+
            " union all SELECT l.就诊编号,a.[卡号],a.[姓名],c.CNAME as 班级或部门,'2' as 人员类型,j.就诊医生,convert(nvarchar(19),j.就诊时间,21) as 就诊时间,l.主诉与症状,l.查体,l.是否隔离,l.诊断结果,l.诊疗意见,l.病历类型,isnull(z.转院原因,'') as 转院原因,isnull(z.转诊医院,'') as 转诊医院,isnull(z.转诊医生,'') as 转诊医生,isnull(convert(nvarchar(19),z.转院时间,21),'')as 转院时间  " + 
            " from [V_基础信息_教职工信息表] a  "+
            " left join [V_医务管理_就诊信息] j on j.卡号=a.卡号  left join [V_医务管理_病历信息] l on l.就诊编号=j.编号  "+
            " left join [V_医务管理_转院信息] z on z.就诊编号=j.编号  left join [sysUserDept] b on a.卡号=b.[UserCode] "+
            " left join [sysDepartment] c on b.[DeptCode]=c.[DeptCode] ) x  WHERE 1=1 AND x.就诊医生!='null' ";
        
        
        if(!"".equalsIgnoreCase(JZBH)){
            sql+=" AND x.就诊编号='"+ MyTools.fixSql(JZBH) +"' ";
        }
        if(!"".equalsIgnoreCase(KH)){
            sql+=" AND x.卡号='"+ MyTools.fixSql(KH) +"' ";
        }
        
        sql+=" ORDER BY x.人员类型,x.[卡号]  desc";
        vec = db.getConttexJONSArr(sql, pageNum, pageSize);
        return vec;
    }
    
    
    
    //导出excel表格
    public String outputGRXX(String JZBH,String KH)throws SQLException {
        Vector vec = null;
        Vector vec2 = null;
        String sql="";
        String sql2="";
        String savePath="";
        
        sql="select 卡号,姓名,班级或部门,人员类型,就诊医生,convert(nvarchar(19),就诊时间,21) as 就诊时间,主诉与症状,查体,是否隔离,诊断结果,诊疗意见,病历类型,是否转院,isnull(转院原因,'') as 转院原因,isnull(转诊医院,'') as 转诊医院,isnull(转诊医生,'') as 转诊医生,isnull(convert(nvarchar(19),转院时间,21),'') as 转院时间  from ( SELECT l.就诊编号,a.[卡号],a.[姓名],b.班级名称 as 班级或部门,'1' as 人员类型,j.就诊医生,j.就诊时间  as 就诊时间,l.主诉与症状,l.查体,l.是否隔离,l.诊断结果,l.诊疗意见,l.病历类型,是否转院='',z.转院原因,z.转诊医院,z.转诊医生,z.转院时间" + 
                " from [V_基础信息_学生信息表] a "+
                " left join [V_医务管理_就诊信息] j on j.卡号=a.卡号  left join [V_医务管理_病历信息] l on l.就诊编号=j.编号  " + 
                " left join [V_医务管理_转院信息] z on z.就诊编号=j.编号  left join dbo.V_基础信息_班级信息表 b on a.[行政班代码]=b.班级代码  "+
                " union all SELECT l.就诊编号,a.[卡号],a.[姓名],c.CNAME as 班级或部门,'2' as 人员类型,j.就诊医生,convert(nvarchar(19),j.就诊时间,21) as 就诊时间,l.主诉与症状,l.查体,l.是否隔离,l.诊断结果,l.诊疗意见,l.病历类型,是否转院='',isnull(z.转院原因,'') as 转院原因,isnull(z.转诊医院,'') as 转诊医院,isnull(z.转诊医生,'') as 转诊医生,isnull(convert(nvarchar(19),z.转院时间,21),'')as 转院时间  " + 
                " from [V_基础信息_教职工信息表] a  "+
                " left join [V_医务管理_就诊信息] j on j.卡号=a.卡号  left join [V_医务管理_病历信息] l on l.就诊编号=j.编号  "+
                " left join [V_医务管理_转院信息] z on z.就诊编号=j.编号  left join [sysUserDept] b on a.卡号=b.[UserCode] "+
                " left join [sysDepartment] c on b.[DeptCode]=c.[DeptCode] ) x  WHERE 1=1 AND x.就诊医生!='null'  AND x.就诊编号='"+ MyTools.fixSql(JZBH) +"' AND x.卡号='"+ MyTools.fixSql(KH) +"' ";
        
        vec=db.GetContextVector(sql);
        
        //查询主诉与症状下拉框
        sql2="select [编号],[主诉与症状],[查体]  FROM [V_医务管理_主诉症状信息表]";
        vec2=db.GetContextVector(sql2);
        
        //生成excel表
        if (vec != null && vec.size() > 0) {
            Calendar c = Calendar.getInstance();// 可以对每个时间域单独修改
            savePath = MyTools.getProp(request, "Base.exportExcelPath");//导出excel文件服务器保存路径:F\:/UPLOAD/XZLMS/exportExcel/    
            
            //创建文件夹
            File file = new File(savePath);
            if (!file.exists()) {
                file.mkdirs();
            }
            savePath +=vec.get(1).toString() +"就诊记录详情"+ ".xls";
            System.out.println(savePath);
            try {
                OutputStream os = new FileOutputStream(savePath);
                WritableWorkbook wbook = Workbook.createWorkbook(os);// 建立excel文件
                WritableSheet wsheet1 = wbook.createSheet(vec.get(1).toString(), 0);// 对第一张sheete,生成的工作表名称
                WritableFont fontStyle;
                WritableCellFormat contentStyle;
                Label content;
                
                //生成标题
                String[] title1=new String[]{"卡号","姓名","班级或部门","人员类型","就诊医生","就诊时间","主诉与症状","查体","是否隔离","诊断结果","诊疗意见","病历类型","是否转院","转院原因","转诊医院","转诊医生","转院时间"};
                int counum1=0;//excel表中行数
                String cellContent1 = ""; //当前单元格的内容
                
                for(int i=0;i<title1.length;i++) {
                    wsheet1.setColumnView(i, 25);//设置每列列宽
                }
                
                
                //第1行生成标题设置行列字体大小
                fontStyle = new WritableFont(WritableFont.createFont("宋体"), 20, WritableFont.BOLD,false, jxl.format.UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.BLACK);
                contentStyle = new WritableCellFormat(fontStyle);
                contentStyle.setShrinkToFit(true);
                contentStyle.setWrap(true);
                contentStyle.setAlignment(jxl.format.Alignment.CENTRE);//水平居中
                contentStyle.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//垂直居中
                    
                wsheet1.mergeCells(0, counum1, 16, counum1); //合并单元格mergeCells(a,b,c,d) a 单元格的列号,b 单元格的行号,c 从单元格[a,b]起,向左合并到c列,d 从单元格[a,b]起,向下合并到d行
                cellContent1 = "个人就诊信息详情表";
                content = new Label(0, counum1, cellContent1, contentStyle); //单元格内容
                wsheet1.addCell(content);
                wsheet1.setRowView(counum1, 600);  //设置行高
                
                
                //第2行生成对应数据标题名称。
                counum1++;
                for(int colNum=0; colNum<17; colNum++){
                    fontStyle = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.NO_BOLD,false, jxl.format.UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.BLACK);
                    contentStyle = new WritableCellFormat(fontStyle);
                    contentStyle.setShrinkToFit(true);
                    contentStyle.setAlignment(jxl.format.Alignment.CENTRE);//水平居中
                    contentStyle.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//垂直居中
                    //设置边框; 
                    contentStyle.setBorder(jxl.format.Border.TOP, BorderLineStyle.THIN);
                    contentStyle.setBorder(jxl.format.Border.LEFT, BorderLineStyle.THIN);
                    contentStyle.setBorder(jxl.format.Border.RIGHT, BorderLineStyle.THIN);
                    contentStyle.setBorder(jxl.format.Border.BOTTOM, BorderLineStyle.THIN);
                    //创建单元格 ,一行一个格子的增加                            
                    cellContent1=title1[colNum];                        
                    content = new Label(colNum, counum1, cellContent1, contentStyle);
                     //添加到行中;  
                    wsheet1.addCell(content);    
                }
                wsheet1.setRowView(counum1, 1000);  //设置行高
                
                
                
                //第3行生成内容数据
                counum1++;
                for(int i=0;i<vec.size();i=i+18){//控制行数
                    
                    for(int colNum=0; colNum<17; colNum++){//控制列数
                        fontStyle = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.NO_BOLD,false, jxl.format.UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.BLACK);
                        contentStyle = new WritableCellFormat(fontStyle);
                        contentStyle.setWrap(true);
                        contentStyle.setShrinkToFit(true);
                        contentStyle.setAlignment(jxl.format.Alignment.CENTRE);//水平居中
                        contentStyle.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//垂直居中
                        //边框
                        contentStyle.setBorder(jxl.format.Border.TOP, BorderLineStyle.THIN);
                        contentStyle.setBorder(jxl.format.Border.LEFT, BorderLineStyle.THIN);
                        contentStyle.setBorder(jxl.format.Border.RIGHT, BorderLineStyle.THIN);
                        contentStyle.setBorder(jxl.format.Border.BOTTOM, BorderLineStyle.THIN);
                        
                        //对某一列进行判断进行单独处理
                        if(colNum==3) {
                            if(vec.get(i+colNum).toString().equalsIgnoreCase("1")) {
                                cellContent1="学生";
                            }else {
                                cellContent1="教师";
                            }
                            content = new Label(colNum, counum1, cellContent1, contentStyle);//创建单元格 第?列单元格Y坐标 ,第?行X坐标,内容,样式
                            wsheet1.addCell(content); //添加到行中;  
                        }else if(colNum==6) {//症状
                            for(int j=0;j<vec2.size();j=j+3) {
                                if(vec2.get(j+0).toString().equalsIgnoreCase(vec.get(i+colNum).toString())) {
                                    cellContent1=vec2.get(j+1).toString();
                                }
                            }
                            content = new Label(colNum, counum1, cellContent1, contentStyle);//创建单元格 第?列单元格Y坐标 ,第?行X坐标,内容,样式
                            wsheet1.addCell(content); //添加到行中;  
                        }else if(colNum==8) {//隔离
                            if(vec.get(i+colNum).toString().equalsIgnoreCase("0")) {
                                cellContent1="否";
                            }else {
                                cellContent1="是";
                            }
                            content = new Label(colNum, counum1, cellContent1, contentStyle);//创建单元格 第?列单元格Y坐标 ,第?行X坐标,内容,样式
                            wsheet1.addCell(content); //添加到行中;  
                        }else if(colNum==11) {//病历类型
                            if(vec.get(i+colNum).toString().equalsIgnoreCase("1")) {
                                cellContent1="初诊";
                            }else {
                                cellContent1="复诊";
                            }
                            content = new Label(colNum, counum1, cellContent1, contentStyle);//创建单元格 第?列单元格Y坐标 ,第?行X坐标,内容,样式
                            wsheet1.addCell(content); //添加到行中;  
                        }else if(colNum==12) {//是否转院
                            if(vec.get(i+(colNum+1)).toString().equalsIgnoreCase("")) {
                                cellContent1="否";
                            }else {
                                cellContent1="是";
                            }
                            content = new Label(colNum, counum1, cellContent1, contentStyle);//创建单元格 第?列单元格Y坐标 ,第?行X坐标,内容,样式
                            wsheet1.addCell(content); //添加到行中;  
                        }else{
                             //正常拼接值
                            cellContent1=vec.get(i+colNum).toString();
                            content = new Label(colNum, counum1, cellContent1, contentStyle);//创建单元格 第?列单元格Y坐标 ,第?行X坐标,内容,样式
                            wsheet1.addCell(content); //添加到行中;  
                        }
                        
                    }
                        
                    wsheet1.setRowView(counum1, 1500);  //设置行高
                    counum1++;
                }
                
                // 写入数据
                wbook.write();
                // 关闭文件
                wbook.close();
                os.close();
                this.setMSG("文件生成成功");
            } catch (FileNotFoundException e) {
                this.setMSG("导出前请先关闭相关EXCEL");
            } catch (WriteException e) {
                this.setMSG("文件生成失败");
            } catch (IOException e) {
                this.setMSG("文件生成失败");
            }
        } else {
            this.setMSG("没有符合条件的成绩信息");
        }
        return savePath;
    }
        
    
    //Get&Set
    public String getMSG() {
        return MSG;
    }

    public void setMSG(String mSG) {
        MSG = mSG;
    }    

}

 

public class ImportBean_Servlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //设置字符编码为UTF-8
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        
        String active = MyTools.StrFiltr(request.getParameter("active"));// 拿取前台的active值
        int pageNum = MyTools.parseInt(request.getParameter("page"));    //获得页面page参数 分页
        int pageSize = MyTools.parseInt(request.getParameter("rows"));    //获得页面rows参数 分页
        
        TraceLog.Trace("active...:"+active);
        Vector jsonV = null;//返回结果集
        JSONArray jal = null;//返回json对象     
        ImportBean bean = new ImportBean(request); //对象
        
        //查询主诉与症状
        if("loadZSZZCombo".equalsIgnoreCase(active)){
            try {
                jsonV = bean.loadZSZZCombo();
                jal = (JSONArray) jsonV.get(2);
                response.getWriter().write(jal.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        //查询就诊信息
        if("queryJZXX".equalsIgnoreCase(active)){
            try {
                String JZBH=URLDecoder.decode(MyTools.StrFiltr(request.getParameter("JZBH")), "UTF-8");//就诊编号
                String KH=URLDecoder.decode(MyTools.StrFiltr(request.getParameter("KH")), "UTF-8");//卡号
                jsonV = bean.queryJZXX(pageNum,pageSize,JZBH,KH);
                if (jsonV != null && jsonV.size() > 0) {
                    //最终处理:传回AJAX 结果集
                    jal = (JSONArray)jsonV.get(2);
                    response.getWriter().write("{\"total\":" + MyTools.StrFiltr(jsonV.get(0)) + ",\"rows\":" + jal.toString() + "}");//生成datagrid所需数据类型
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                jal = JsonUtil.addJsonParams(jal, "MSG", "查询错误!"+ bean.getMSG() );
                response.getWriter().write(jal.toString());
            }
        }
        
        //导出个人信息详情Exls表格
        if("outputGRXX".equalsIgnoreCase(active)){
            String JZBH=URLDecoder.decode(MyTools.StrFiltr(request.getParameter("JZBH")), "UTF-8");//就诊编号
            String KH=URLDecoder.decode(MyTools.StrFiltr(request.getParameter("KH")), "UTF-8");//卡号
            try {
                String filePath=bean.outputGRXX(JZBH,KH); //调用bean方法入参,返回生成文件路径
                jal = JsonUtil.addJsonParams(jal, "MSG",bean.getMSG()); //生成json格式数据,返回状态值
                jal = JsonUtil.addJsonParams(jal, "filePath", filePath);//生成json格式数据,返回路径
                response.getWriter().write(jal.toString());
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
                
                
        
        
        
    }
}