spring+struts2+mybatis中poi导出excel数据

Posted 零度

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring+struts2+mybatis中poi导出excel数据相关的知识,希望对你有一定的参考价值。

1、html

<div id="formDiv">
     <form id="dynamicForm" target="_blank">
     </form>
</div>

<a href="javascript:void(0);" id="exporExcel" class="easyui-linkbutton" iconCls="icon-download" onclick="javascript:exportExcel();">导出excel</a>

2、js

function exportExcel(){
    var rows = $("#msp_table").datagrid("getChecked");
    if(rows.length<1){
        $.messager.alert("提示", "请勾选要导出的数据", "info");
        return;
    }
    var param={};
    for(var i=0,max=rows.length;max>i;i++){
        param[i]=rows[i].sysIdKey;
    }
    DownLoadFile({
        url:basePath+"/daySalePlan/exportExcel.action", //请求的url
        data:param//要发送的数据
    });
}

var DownLoadFile = function (options) {
    var dynamicForm = document.getElementById("dynamicForm");
    dynamicForm.setAttribute("method","post");
    dynamicForm.setAttribute("action",options.url);
    dynamicForm.innerHTML = "";
    for (var key in options.data) {
        var input = document.createElement("input");
        input.setAttribute("type","hidden");
        input.setAttribute("name","details[" + key + "].sysIdKey");
        input.setAttribute("value",options.data[key]);
        dynamicForm.appendChild(input);
    }
    dynamicForm.submit();
}

3、struts2 mxl

      <!--Excel下载-->  
           <action name="exportExcel" class="com.icss.action.daysaleplan.DaySalePlanAction" method="exportExcel">  
                <!-- 下载各种题型模板 -->
            <result name="success" type="stream">  
                 <!-- 文件类型 --> 
                 <param name="contentType">application/vnd.ms-excel</param> 
                 <!-- excelStream 与对应action中的输入流的名字要一致 --> 
                 <param name= "inputName">excelStream</param>  
                 <!-- 文件名 与action中fileName一致 --> 
                 <param name="contentDisposition">attachment;filename=" ${fileName}.xls"</param>  
             </result> 
               <result name="error">/WEB-INF/pages/error/export_error.jsp</result> 
          </action>

4、action

  public String exportExcel(){
        try {
            fileName="excel";
            excelStream=daySalePlanService.exportExcel(details);
        } catch (Exception e) {
            e.printStackTrace();
            return "error";
        }
        return SUCCESS;
    }

5、service

  @Override
    public InputStream exportExcel(List<DaySalePlanDetail> details) throws Exception {
        String sysIdKeys="";
        for (int i = 0,max=details.size(); i < max; i++) {
            long sysIdKey=details.get(i).getSysIdKey();
            if(sysIdKeys.equals("")){
                sysIdKeys=""+sysIdKey;
            }else{
                sysIdKeys=sysIdKeys+","+sysIdKey;
            }
        }
        //查询所有自主卷烟
        String sql = "select myt.TPRODUCT_ID as CIG_CODE, myt.PLATE from(SELECT TO_CHAR(T.TPRODUCT_ID) AS TPRODUCT_ID, T.PSID, T.PLATE, T1.PRICE AS PRICE, CASE WHEN T1.CLASS = ‘一类‘ THEN 1 WHEN T1.CLASS = ‘二类‘ THEN 2 WHEN T1.CLASS = ‘三类‘ THEN 3 WHEN T1.CLASS = ‘四类‘ THEN 4 WHEN T1.CLASS = ‘五类‘ THEN 5 WHEN T1.CLASS = ‘‘ THEN 99 END AS PRICECLASS FROM (select t.tproduct_id as PRODUCT_ID from wp_cigbrand t where t.state = 1) TTT INNER JOIN WP_CIGBRAND T ON T.TPRODUCT_ID = TTT.PRODUCT_ID LEFT JOIN (SELECT T.TPRODUCT_ID, C.PSID, C.DELI_DATE, T.PLATE, C.PRICE, C.CLASS FROM WP_CIGBRAND T LEFT JOIN (SELECT * FROM C_PRODUCT_CONTROL T1 WHERE T1.DELI_DATE = (SELECT MAX(T2.DELI_DATE) FROM C_PRODUCT_CONTROL T2 WHERE T1.PSID = T2.PSID)) C ON T.PSID = C.PSID) T1 ON T1.TPRODUCT_ID = T.TPRODUCT_ID ORDER BY PRICECLASS ASC, T1.PRICE DESC, T.PLATE ASC) myt  ";
        List<Map<String, Object>> titleList = baseDao.selectSQL(sql);
        
        String[] headers = new String[titleList.size()+4];//excel第一行
        headers[0]="市场";
        headers[1]="到货时间";
        headers[2]="备注";
        headers[3]="合计";
        
        String[] headersId = new String[titleList.size()];//用于计算同一个公司同一个到货日期下的卷烟数量的插入位置
        
        //构造第一行的卷烟和插入卷烟对应记录数
        for (int i = 0,max = titleList.size(); i < max; i++) {
            Map<String, Object> data=titleList.get(i);
            headers[i+4]=data.get("PLATE").toString();
            headersId[i]=data.get("CIG_CODE").toString();
        }
        
        //查询导出的公司数据
        String dataSql="select M.Request_Num,M.ORG_REMARK,D.Cig_Code,v.SHORT_NM,T1.Area_Id,M.Org_Id,D.Confirm_Qty,D.EXPECT_ARRIVAL_DATE from WP_DAY_SALE_PLAN_ORDER M, WP_DAY_SALE_PLAN_ORDPR D, V_ORG V, WP_CIGBRAND C, WP_SALEAREA_ORG_MAPPING T1, WP_SALEAREA T2 where T2.SYS_ID_KEY = T1.AREA_ID AND T1.ORG_ID = M.ORG_ID AND M.SYS_ID_KEY = D.PLAN_MAIN_ID AND M.ORG_ID = V.SYS_ID_KEY AND D.CIG_CODE = C.TPRODUCT_ID AND M.SYS_ID_KEY IN("+sysIdKeys+") ORDER BY v.SHORT_NM,M.REQUEST_NUM, M.ORG_ID, D.CIG_CODE ";
        List<Map<String, Object>> dataList=baseDao.selectSQL(dataSql);
        
        String orgIds="";//导出数据对应的公司ID
        for (int i = 0,max=dataList.size(); i < max; i++) {
            if(i==0){
                orgIds=dataList.get(i).get("ORG_ID").toString();
            }else{
                orgIds=orgIds+","+dataList.get(i).get("ORG_ID");
            }
        }
        
        //查询公司所属的区域
        String areaSql=" SELECT T1.AREA_ID,T2.AREA_NAME FROM WP_SALEAREA_ORG_MAPPING T1,WP_SALEAREA T2 WHERE T2.SYS_ID_KEY=T1.AREA_ID AND T1.ORG_ID IN("+orgIds+") GROUP BY T1.AREA_ID,T2.AREA_NAME ";
        List<Map<String, Object>> areaList=baseDao.selectSQL(areaSql);
        
        List<ExpectArrivalDate> exData=new ArrayList<ExpectArrivalDate>();//excel表内容
        
        this.createData(areaList,exData,dataList,headersId);
        
        Map<String, Map<String, Object>> paramMap = this.getParamData();
        ExportExcel<ExpectArrivalDate> exportExcel=new ExportExcel<ExpectArrivalDate>();
        String pattern="yyyy-MM-dd";
        String title="期望到货日期";
        for (int i = 0,max=exData.size(); i < max; i++) {//合计行数据汇总
            ExpectArrivalDate arrivalDate=exData.get(i);
            arrivalDate.setSum(1);
        }
        
        this.createSumRow(exData,1,"合计(万支)");//添加合计(万支)行
        this.createSumRow(exData,5,"合计(箱)");//添加合计(箱)行
        
        //导出
        return exportExcel.exportExcel(title,headers,exData,pattern,paramMap);
    }

6、util

package com.icss.util;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

/**
 * 项目名称: gswp <br>
 * 功能描述:导出excel
 * 作者:lanjianqing<[email protected]> <br>
 * 公司: ICCS 中软国际<www.chinasofti.com><br>
 * 创建时间:2017-6-30 下午5:36:28<br>
 * 版本:v1.0<br>
 * 版权所有 chinasofti.com Corporation 2015 <br>
 * 
 * 修改内容:    <br>
 * 修改人: <br>
 * 修改时间:2017-6-30 下午5:36:28<br>
 * 备注: <br>
 */
public class ExportExcel<T>{

    /**
     * 方法名: <br>
     * 功能描述:* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
     * 
     * @param title
     *            表格标题名
     * @param headers
     *            表格属性列名数组
     * @param dataset
     *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     * @param out
     *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
     * @param pattern
     *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"<br>
     * 作者:lanjianqing<[email protected]> <br>
     * 创建时间:2017-6-30 下午5:37:58<br>
     * 参数:[参数类型][说明]..<br>
     * 返回值:<br>
     * 异常:<br>
     
     * 修改人:<br>
     * 修改时间:2017-6-30 下午5:37:58<br>
     * 备注:<br>
     */
    public InputStream exportExcel(String title, String[] headers, List<T> dataset, String pattern,Map<String, Map<String, Object>> map) throws Exception{
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet(title);
        // 设置表格默认列宽度为15个字节
        sheet.setDefaultColumnWidth(15);
        
        // 声明一个画图的顶级管理器
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
        // 定义注释的大小和位置,详见文档
        HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
        // 设置注释内容
        comment.setString(new HSSFRichTextString("工商网上配货平台"));
        // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
        comment.setAuthor("lanjianqing");

        // 产生表格标题行
        HSSFRow row = sheet.createRow(0);
        Map<String, Object> titleStyleMap=map.get("titleStyleMap");
        Map<String, Object> titleFontMap=map.get("titleFontMap");
        this.createTitlt(workbook, headers, row,titleStyleMap,titleFontMap);
        sheet.createFreezePane( 0, 1, 0, 1 );//冻结第一行

        // 遍历集合数据,产生数据行
        Iterator<T> it = dataset.iterator();
        Map<String, Object> commentStyleMap=map.get("commentStyleMap");
        Map<String, Object> commentFontMap=map.get("commentFontMap");
        this.createComment(it, sheet, row, pattern, workbook, patriarch,commentStyleMap,commentFontMap);
        //sheet.createFreezePane( 1, 0, 1, 0 );   
        
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        workbook.write(baos); 
        baos.flush(); 
        byte[] byteData = baos.toByteArray(); 
        InputStream excelStream = new ByteArrayInputStream(byteData,0, byteData.length); 
        baos.close();
        return excelStream;
    }
    
    /**
     * 方法名: <br>
     * 功能描述:* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
     * 
     * @param title
     *            表格标题名
     * @param headers
     *            表格属性列名数组
     * @param dataset
     *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     * @param out
     *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
     * @param pattern
     *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"<br>
     * 作者:lanjianqing<[email protected]> <br>
     * 创建时间:2017-6-30 下午5:37:58<br>
     * 参数:[参数类型][说明]..<br>
     * 返回值:<br>
     * 异常:<br>
     
     * 修改人:<br>
     * 修改时间:2017-6-30 下午5:37:58<br>
     * 备注:<br>
     */
    public InputStream exportExcel(String title,List<T> dataset, String pattern,Map<String, Map<String, Object>> map) throws Exception{
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet(title);
        // 设置表格默认列宽度为15个字节
        sheet.setDefaultColumnWidth(15);
        
        // 声明一个画图的顶级管理器
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
        // 定义注释的大小和位置,详见文档
        HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
        // 设置注释内容
        comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
        // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
        comment.setAuthor("lanjianqing");

        // 产生表格标题行
        HSSFRow row = sheet.createRow(0);

        // 遍历集合数据,产生数据行
        Iterator<T> it = dataset.iterator();
        Map<String, Object> commentStyleMap=map.get("commentStyleMap");
        Map<String, Object> commentFontMap=map.get("commentFontMap");
        this.createComment(it, sheet, row, pattern, workbook, patriarch,commentStyleMap,commentFontMap);
        
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        workbook.write(baos); 
        baos.flush(); 
        byte[] byteData = baos.toByteArray(); 
        InputStream excelStream = new ByteArrayInputStream(byteData,0, byteData.length); 
        baos.close();
        return excelStream;
    }

    /**
     * 方法名: <br>
     * 功能描述:遍历集合数据,产生数据行<br>
     * 作者:lanjianqing<[email protected]> <br>
     * 创建时间:2017-7-3 下午4:42:18<br>
     * 参数:[参数类型][说明]..<br>
     * 返回值:<br>
     * 异常:<br>
     * 修改人:<br>
     * 修改时间:2017-7-3 下午4:42:18<br>
     * 备注:<br>
     */
    private void createComment(Iterator<T> it,HSSFSheet sheet,HSSFRow row,String pattern,HSSFWorkbook workbook,HSSFPatriarch patriarch,Map<String, Object> commentStyleMap,Map<String, Object> commentFontMap) throws Exception, Exception, Exception {
        HSSFCellStyle commentStyle=this.getStyle(workbook, commentStyleMap);
        HSSFFont commentFont=getFont(workbook, commentFontMap);
        commentStyle.setFont(commentFont);
        int index = 0;
        while (it.hasNext()) {
            index++;
            row = sheet.createRow(index);
            T t = (T) it.next();
            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
            Field[] fields = t.getClass().getDeclaredFields();
            for (int i = 0,max=fields.length; i <max ; i++) {
                HSSFCell cell = row.createCell(i);
                Field field = fields[i];
                String fieldName = field.getName();
                String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                
                Class<? extends Object> tCls = t.getClass();
                Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
                Object value = getMethod.invoke(t, new Object[] {});
                // 判断值的类型后进行强制类型转换
                String textValue = null;
                if (value instanceof Boolean) {
                    boolean bValue = (Boolean) value;
                    if (!bValue) {
                        textValue = "女";
                    }else{
                        textValue = "男";
                    }
                } else if (value instanceof Date) {
                    Date date = (Date) value;
                    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                    textValue = sdf.format(date);
                } else if (value instanceof byte[]) {
                    // 有图片时,设置行高为60px;
                    row.setHeightInPoints(60);
                    // 设置图片所在列宽度为80px,注意这里单位的一个换算
                    sheet.setColumnWidth(i, (short) (35.7 * 80));
                    // sheet.autoSizeColumn(i);
                    byte[] bsValue = (byte[]) value;
                    HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6, index);
                    anchor.setAnchorType(2);
                    patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
                } else {
                    // 其它数据类型都当作字符串简单处理
                    textValue = value!=null?value.toString():"";
                    
                }
                // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
                if (textValue != null) {
                    Pattern p = Pattern.compile("^(\\-|\\+)?\\d+(\\.\\d+)?$");
                    Matcher matcher = p.matcher(textValue);
                    if (matcher.matches()) {// 是数字当作double处理
                        if(Double.parseDouble(textValue)==0){
                            cell.setCellValue("");
                        }else{
                            cell.setCellValue(Double.parseDouble(textValue));
                        }
                    } else {
                        HSSFRichTextString richString = new HSSFRichTextString(textValue);
                        HSSFFont font3 = workbook.createFont();
                        font3.setColor(HSSFColor.BLACK.index);
                        richString.applyFont(font3);
                        cell.setCellValue(richString);
                    }
                }
            }
        }
    }

    /**
     * 方法名: <br>
     * 功能描述:产生标题行<br>
     * 作者:lanjianqing<[email protected]> <br>
     * 创建时间:2017-7-3 下午4:43:23<br>
     * 参数:[参数类型][说明]..<br>
     * 返回值:<br>
     * 异常:<br>
     
     * 修改人:<br>
     * 修改时间:2017-7-3 下午4:43:23<br>
     * 备注:<br>
     */
    private void createTitlt(HSSFWorkbook workbook,String[] headers,HSSFRow row,Map<String, Object> styleMap,Map<String, Object> fontMap) {
        HSSFCellStyle titleStyle=this.getStyle(workbook, styleMap);
        HSSFFont titleFont=getFont(workbook, fontMap);
        titleStyle.setFont(titleFont);
        for (int i = 0,max=headers.length; i < max; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellStyle(titleStyle);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }
    }
    
    /**
     * 方法名: <br>
     * 功能描述:获取样式<br>
     * 作者:lanjianqing<[email protected]> <br>
     * 创建时间:2017-7-3 下午5:53:14<br>
     * 参数:[参数类型][说明]..<br>
     * 返回值:<br>
     * 异常:<br>
     
     * 修改人:<br>
     * 修改时间:2017-7-3 下午5:53:14<br>
     * 备注:<br>
     */
    private HSSFCellStyle getStyle(HSSFWorkbook workbook,Map<String, Object> styleMap){
        // 生成标题样式
        HSSFCellStyle titleStyle = workbook.createCellStyle();
        // 设置背景色
        titleStyle.setFillForegroundColor(Short.valueOf(styleMap.get("fillForegroundColor").toString()));
        titleStyle.setFillPattern(Short.valueOf(styleMap.get("fillPattern").toString()));
        
        // 设置边框
        titleStyle.setBorderBottom(Short.valueOf(styleMap.get("borderBottom").toString()));
        titleStyle.setBorderLeft(Short.valueOf(styleMap.get("borderLeft").toString()));
        titleStyle.setBorderRight(Short.valueOf(styleMap.get("borderRight").toString()));
        titleStyle.setBorderTop(Short.valueOf(styleMap.get("borderTop").toString()));
        // 设置居中
        titleStyle.setAlignment(Short.valueOf(styleMap.get("alignment").toString()));
        
        return titleStyle;
    }
    
    /**
     * 方法名: <br>
     * 功能描述:获取字体<br>
     * 作者:lanjianqing<[email protected]> <br>
     * 创建时间:2017-7-3 下午5:53:34<br>
     * 参数:[参数类型][说明]..<br>
     * 返回值:<br>
     * 异常:<br>
     
     * 修改人:<br>
     * 修改时间:2017-7-3 下午5:53:34<br>
     * 备注:<br>
     */
    private HSSFFont getFont(HSSFWorkbook workbook,Map<String, Object> fontMap){
        HSSFFont font = workbook.createFont();
        font.setColor(Short.valueOf(fontMap.get("color").toString()));
        font.setFontHeightInPoints(Short.valueOf(fontMap.get("fontHeightInPoints").toString()));
        font.setBoldweight(Short.valueOf(fontMap.get("boldweight").toString()));
        return font;
    }
}

 


以上是关于spring+struts2+mybatis中poi导出excel数据的主要内容,如果未能解决你的问题,请参考以下文章

转 :手动配置三大框架整合:Spring+Struts2+mybatis

ssm(struts2+spring+mybatis)整合

Struts2+Spring+Mybatis+Junit 测试

struts2+spring+mybatis框架整合详细介绍

Struts2+Spring3+MyBatis3整合以及Spring注解开发

spring+struts2+mybatis中poi导入excel数据