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;
    }
}
时间: 2024-09-29 23:06:59

spring+struts2+mybatis中poi导出excel数据的相关文章

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

1.html <td class="queryTdRight" style="width:22%;">  交易年度: <input id="dealYear" name="dealYear" style="width: 140px"/> </td> <td class="queryTdRight" style="width:40%;&q

基于POI导出Excel数据

基于POI导出Excel数据 在项目中会有许多报表业务,需要导出数据.在这里我们采用基于POI的方式解析.POI有俩种解析方式HSSF(xls格式)和XSSF(xlsx). 以BOS物流的运单管理界面为例: 前端代码 导出运单信息,生成报表: 1.添加导出按钮 2.添加导出事件 后台代码实现 POI生成Excel步骤写Excel过程一样,新建Excel文档----新建Sheet---新建Row---新建Cell单元格---写单元格数据. Maven导入jar包信息请参加一键上传里面的配置 Act

jsp(servlet)使用poi导出excel数据文件

网站通过Excel导出数据已经成为各种网站的一个基本功能,下面就详细介绍下如何使用poi.jar方式来导出excel文件.具体步骤如下: 1.创建一个网站,下面我创建一个叫test的网站,然后将poi的jar包放入lib文件夹.我这里是下载链接poi-2.5.1.jar. 结构目录如下: 2.然后我们可以创建一个用来访问的jsp界面(主要是提交到servlet,可有可无) 代码如下: <%@ page language="java" import="java.util.

Java中导出Excel数据,封装Bean

在Java中封装导出Excel数据的总体思路为: 1.导出,根据查询得到的数据(一般我们页面上用的是查询条件带分页的),我们需要把查询条件带到后台重新查询,并且是查询全部数据,不带分页 2.不能用ajax异步提交.应该用location.href=""的方式,把处理的流交给浏览器来处理,JS无法处理流计算. 3.封装统一的Bean实体,主要输入导出的列名,excel名,数据集即可导出. 用到的Maven地址: <!-- poi --> <dependency>

java中使用poi导出excel表格数据并且可以手动修改导出路径

在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下 jar包下载路径:http://download.csdn.net/download/pumpkin09/7077011 第二步:添加poi导出工具类 1 package com.yjd.admin.util; 2 3 import java.io.IOException; 4 import ja

POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)

说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出:但是这种情况也不能解决内存溢出的问题.毕竟数据还是一次性在内存中进行保存的.这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel 首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这

使用poi导出大量数据到excel遇到的问题

最近在工作遇到利用poi导出大量数据到excel并提供下载的运用场景,并遇到了一个问题,当数据量过大时(几十万),后台在进行数据写入excel中的过程会非常耗时,导致迟迟没有响应前台,结果数据还没导完,前台页面就已经崩掉了. 解决思路:接收到前台导出excel请求之后,开一个线程,在线程里进行数据的写入和将写入完成的excel保存到服务器中等耗时操作,前台定时发送ajax请求检测是否已经导出完成,如果完成则提供一个下载链接到前台供用户下载. 想到解决思路之后,自己写了一个小demo,顺便学习下利

关于poi导出大数据量EXCEL导出缓慢的解决方案--生成xml格式的表格文件

今天遇到了一个POI导出EXCEL文件结果文件大小太大导致系统运行缓慢的问题.想到了使用输出XML格式的表格来完成. 首先,我们需要理解一下为什么POI导出EXCEL文件会导致文件大小变大.最主要的原因应该是POI变成中经常会对无关的单元格设置属性.例如:一个EXCEL工作表的最大列数为256,我们只使用10列.而编程时经常会将256列全部渲染格式,造成很大的资源浪费.当然应该还有其他很多原因也会造成表格变大. 使用这个方案的前提是对于表格的格式要求不高,因为使用的是自己的工具,没有POI优化了

利用poi导出Excel

import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.Date;import java.util.ArrayList;import java.util.List; import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.