java导出多个excel压缩成zip并下载下来

jxl实现导出excel代码:
使用jxl导出的xls文件,格式不兼容office 2013,兼容WPS、office 2007
合并单元格使用mergeCells(a,b,c,d)方法:a.单元格的列号,b.单元格的行号,c.从单元格[a,b]起,向下合并的列数,d.从单元格[a,b]起,向下合并的行数

/**
 * 导出待入管理库项目
 * 
 * @param request
 * @param response
 */
@RequestMapping(value = "/exportPendingManageLibProjs", method = { RequestMethod.GET, RequestMethod.POST })
public void exportPendingManageLibProjs(HttpServletRequest request, HttpServletResponse response) {
    PromptMessage promptMessage = getPromptMessage();
    response.reset();// 清空输出流
    // String directory = "e:\\ppp\\test";
    String directory = DBConfig.getString("export_doc_directory");//
    String uuid = UUIDHelper.get32UUID();
    String currentDirectory = directory + File.separator + uuid + File.separator;
    String currentTime = TimestampUtils.formatDate(new Date(), "yyyyMMddHHmmss");
    String zipName = "excelfiles_" + currentTime + ".zip";
    File dir = new File(currentDirectory);
    dir.mkdirs();
    response.setContentType("APPLICATION/OCTET-STREAM");
    try {
        response.setHeader("Content-Disposition", "attachment; filename=" + new String(zipName.getBytes("GBK"), "ISO-8859-1"));
    } catch (UnsupportedEncodingException e2) {
        e2.printStackTrace();
    }
    ZipOutputStream outZ = null;
    try {
        outZ = new ZipOutputStream(response.getOutputStream());
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    String selectedRows = request.getParameter("selectedRows");
    JSONArray jsonArray = JSONArray.fromObject(selectedRows);
    WritableWorkbook workbook = null;
    try {
        for (int j = 0; j < jsonArray.size(); j++) {
            JSONObject jsonObject = jsonArray.getJSONObject(j);
            String projRid = jsonObject.getString("PROJ_RID");
            String ticketId = jsonObject.getString("TICKETID");
            String bpmnType = jsonObject.getString("BPMNTYPE");
            String projName = jsonObject.getString("PROJ_NAME");
            projName = projName.replace("/", "");
            String fileName = "导出待入库_" + projName + ".xls";
            // response.setContentType("application/vnd.ms-excel; charset=gb2312");// 定义输出类型
            // response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "ISO-8859-1"));// 设定输出文件头
            workbook = Workbook.createWorkbook(new File(currentDirectory + File.separator + fileName));
            Map param = new HashMap();
            param.put("projRid", projRid);
            List> list3org = managerService.getAgenciesByProjRId(projRid);// 获取第三方咨询机构数据
            double contractExpenseSum = 0d;// 服务合同金额(费用总和)
            String orgNames = "无";// 咨询机构名称(逗号分割)
            if (list3org != null && list3org.size() > 0) {
                Map map = list3org.get(0);
                orgNames = map.get("ORG_NAME").toString();
                orgNames = orgNames == null ? "无" : orgNames;
                Object contractExpense = map.get("CONTRACT_EXPENSE");
                if (contractExpense != null) {
                    BigDecimal temp = (BigDecimal) contractExpense;
                    contractExpenseSum += temp.doubleValue();
                }
            }

            Map map = queryService.getPendingManageLibProjs(param);
            String industryRequiredNew = map.get("INDUSTRY_REQUIRED_NEW") == null ? "" : map.get("INDUSTRY_REQUIRED_NEW").toString();
            String distCode = map.get("DIST_CODE") == null ? "" : map.get("DIST_CODE").toString();
            String investCount = map.get("INVEST_COUNT") == null ? "0" : map.get("INVEST_COUNT").toString();
            String estimateCoper = map.get("ESTIMATE_COPER") == null ? "" : map.get("ESTIMATE_COPER").toString();
            String projType = map.get("PROJ_TYPE") == null ? "" : map.get("PROJ_TYPE").toString();
            String operateMode = map.get("OPERATE_MODE") == null ? "" : map.get("OPERATE_MODE").toString();
            String returnMode = map.get("RETURN_MODE") == null ? "" : map.get("RETURN_MODE").toString();
            String startType = map.get("START_TYPE") == null ? "" : map.get("START_TYPE").toString();
            String projState = map.get("PROJ_STATE") == null ? "" : map.get("PROJ_STATE").toString();
            String implorg = map.get("IMPLORG") == null ? "无" : map.get("IMPLORG").toString();
            String purchaseMode = map.get("PURCHASE_MODE") == null ? "无" : map.get("PURCHASE_MODE").toString();
            String implPlan = map.get("IMPL_PLAN") == null ? "无" : map.get("IMPL_PLAN").toString();// 实施方案描述
            String riskDistribute = map.get("RISK_DISTRIBUTE") == null ? "无" : map.get("RISK_DISTRIBUTE").toString();// 风险分配框架(描述)
            String outputDesc = map.get("OUTPUT_DESC") == null ? "无" : map.get("OUTPUT_DESC").toString();// 项目的公共产品和服务产出说明及产出绩效考核指标体系(描述)
            String valueEvaluation = map.get("VALUE_EVALUATION") == null ? "无" : map.get("VALUE_EVALUATION").toString();// 物有所值评价(描述)
            String financeBear = map.get("FINANCE_BEAR") == null ? "无" : map.get("FINANCE_BEAR").toString();// 财政承受能力论证(描述)

            String industryRequiredNewStr = IndustryCache.getIndustryValue(industryRequiredNew);// 行业
            String distCodeValue = ProvinceCache.getDistCodeValue(distCode);// 地区
            String projTypeStr = SystemCodeUtil.getCodeValue("xmlx", projType);// 项目类型
            String operateModeStr = SystemCodeUtil.getCodeValue("yzfs", operateMode);// 运作方式
            String returnModeStr = SystemCodeUtil.getCodeValue("hbjz", returnMode);// 回报机制
            String startTypeStr = SystemCodeUtil.getCodeValue("fqrlx", startType);// 发起类型
            String projStateStr = SystemCodeUtil.getCodeValue("xmzt", projState);// 项目状态
            String purchaseModeStr = SystemCodeUtil.getCodeValue("cgfs", purchaseMode);// 采购方式

            // 表头样式
            WritableFont font_title = new WritableFont(WritableFont.ARIAL, 18, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); // 定义格式 字体 下划线 斜体 粗体 颜色
            WritableCellFormat format_title = new WritableCellFormat(font_title);
            format_title.setAlignment(jxl.format.Alignment.CENTRE); // 设置水平对齐方式
            format_title.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); // 竖直方向居中对齐
            format_title.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN, jxl.format.Colour.BLACK); // 设置边框

            // 左侧标题样式
            WritableFont font_title_left = new WritableFont(WritableFont.ARIAL, 13, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); // 定义格式 字体 下划线 斜体 粗体 颜色
            WritableCellFormat format_title_left = new WritableCellFormat(font_title_left);
            format_title_left.setAlignment(jxl.format.Alignment.LEFT); // 设置水平对齐方式
            format_title_left.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); // 竖直方向居中对齐
            format_title_left.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN, jxl.format.Colour.BLACK); // 设置边框
            format_title_left.setWrap(true);// 自动换行

            // 右侧内容样式
            WritableFont font_title_right = new WritableFont(WritableFont.ARIAL, 12, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); // 定义格式 字体 下划线 斜体 颜色
            WritableCellFormat format_title_right = new WritableCellFormat(font_title_right);
            format_title_right.setAlignment(jxl.format.Alignment.LEFT); // 设置水平对齐方式
            format_title_right.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); // 竖直方向居中对齐
            format_title_right.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN, jxl.format.Colour.BLACK); // 设置边框
            format_title_right.setWrap(true);// 自动换行

            // 财承表头样式
            WritableFont font_title_ct = new WritableFont(WritableFont.ARIAL, 13, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); // 定义格式 字体 下划线 斜体 颜色
            WritableCellFormat format_title_ct = new WritableCellFormat(font_title_ct);
            format_title_ct.setAlignment(jxl.format.Alignment.CENTRE); // 设置水平对齐方式
            format_title_ct.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); // 竖直方向居中对齐
            format_title_ct.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN, jxl.format.Colour.BLACK); // 设置边框
            format_title_ct.setWrap(true);// 自动换行

            // 财承内容样式
            WritableFont font_title_ct1 = new WritableFont(WritableFont.ARIAL, 13, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK); // 定义格式 字体 下划线 斜体 颜色
            WritableCellFormat format_title_ct1 = new WritableCellFormat(font_title_ct1);
            format_title_ct1.setAlignment(jxl.format.Alignment.CENTRE); // 设置水平对齐方式
            format_title_ct1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); // 竖直方向居中对齐
            format_title_ct1.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN, jxl.format.Colour.BLACK); // 设置边框
            format_title_ct1.setWrap(true);// 自动换行

            WritableSheet sheet1 = workbook.createSheet("sheet1", 0);

            // 创建单元格,参数:c r content
            sheet1.addCell(new jxl.write.Label(0, 0, "待入管理库项目情况表", format_title));
            sheet1.addCell(new jxl.write.Label(0, 1, "项目名称", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 1, projName, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 2, "所属行业", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 2, industryRequiredNewStr, format_title_right));
            sheet1.addCell(new jxl.write.Label(2, 2, "项目所在地", format_title_left));
            sheet1.addCell(new jxl.write.Label(3, 2, distCodeValue, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 3, "项目总投资", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 3, investCount + "万元", format_title_right));
            sheet1.addCell(new jxl.write.Label(2, 3, "项目合作期限", format_title_left));
            sheet1.addCell(new jxl.write.Label(3, 3, estimateCoper + "年", format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 4, "项目类型", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 4, projTypeStr, format_title_right));
            sheet1.addCell(new jxl.write.Label(2, 4, "项目运作方式", format_title_left));
            sheet1.addCell(new jxl.write.Label(3, 4, operateModeStr, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 5, "回报机制", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 5, returnModeStr, format_title_right));
            sheet1.addCell(new jxl.write.Label(2, 5, "发起类型", format_title_left));
            sheet1.addCell(new jxl.write.Label(3, 5, startTypeStr, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 6, "项目阶段", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 6, projStateStr, format_title_right));
            sheet1.addCell(new jxl.write.Label(2, 6, "实施机构", format_title_left));
            sheet1.addCell(new jxl.write.Label(3, 6, implorg, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 7, "采购方式", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 7, purchaseModeStr, format_title_right));
            sheet1.addCell(new jxl.write.Label(2, 7, "咨询服务费用", format_title_left));
            sheet1.addCell(new jxl.write.Label(3, 7, contractExpenseSum + "万元", format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 8, "咨询机构", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 8, orgNames, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 9, "实施方案(描述)", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 9, implPlan, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 10, "风险分配框架(描述)", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 10, riskDistribute, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 11, "项目的公共产品和服务产出说明及产出绩效考核指标体系(描述)", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 11, outputDesc, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 12, "物有所值评价(描述)", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 12, valueEvaluation, format_title_right));
            sheet1.addCell(new jxl.write.Label(0, 13, "财政承受能力论证(描述)", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 13, financeBear, format_title_right));

            sheet1.addCell(new jxl.write.Label(0, 14, "需从预算中安排的支出责任汇总占一般公共预算支出比例", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 14, "年度", format_title_ct));
            sheet1.addCell(new jxl.write.Label(2, 14, "本项目财政承受能力论证测算的财政支出责任小计", format_title_ct));
            sheet1.addCell(new jxl.write.Label(3, 14, "支出责任占比", format_title_ct));
            // 需从预算中安排的支出责任汇总占一般公共预算支出比例
            List listBudget = managerDao.getPrepareBudget(projRid);
            int size = listBudget.size();
            for (int i = 1; i <= size; i++) {
                PrepareBudget budget = listBudget.get(i - 1);
                String payYear = budget.getPayYear();
                Double investExpense = budget.getInvestExpense();
                Double rate = budget.getRate();
                sheet1.addCell(new jxl.write.Label(1, 14 + i, payYear, format_title_ct1));
                sheet1.addCell(new jxl.write.Label(2, 14 + i, investExpense + "", format_title_ct1));
                sheet1.addCell(new jxl.write.Label(3, 14 + i, rate + "%", format_title_ct1));

            }
            // 审核日志
            int logSize = 0;
            List> processLogs = this.getBpmnProcessLog(bpmnType, ticketId);
            sheet1.addCell(new jxl.write.Label(0, 15 + size, "审核意见汇总", format_title_left));
            sheet1.addCell(new jxl.write.Label(1, 15 + size, "审核人", format_title_left));
            sheet1.addCell(new jxl.write.Label(2, 15 + size, "审核结果", format_title_ct));
            sheet1.addCell(new jxl.write.Label(3, 15 + size, "审核意见", format_title_ct));
            if (processLogs != null && processLogs.size() > 0) {
                logSize = processLogs.size();
                for (int i = 1; i <= logSize; i++) {
                    Map map2 = processLogs.get(i - 1);
                    String endTime = map2.get("endTime") == null ? "" : map2.get("endTime").toString();
                    String people = map2.get("people") == null ? "" : map2.get("people").toString();
                    String auditResult = map2.get("auditResult") == null ? "" : map2.get("auditResult").toString();
                    String proposal = map2.get("proposal") == null ? "" : map2.get("proposal").toString();
                    sheet1.addCell(new jxl.write.Label(1, 15 + size + i, people, format_title_right));
                    sheet1.addCell(new jxl.write.Label(2, 15 + size + i, auditResult, format_title_ct1));
                    sheet1.addCell(new jxl.write.Label(3, 15 + size + i, proposal, format_title_right));
                }
            }

            // mergeCells(a,b,c,d) 单元格合并函数 a.单元格的列号,b.单元格的行号,c.从单元格[a,b]起,向下合并的列数,d.从单元格[a,b]起,向下合并的行数
            sheet1.mergeCells(0, 0, 3, 0);
            sheet1.mergeCells(1, 1, 3, 0);
            sheet1.mergeCells(1, 8, 3, 0);
            sheet1.mergeCells(1, 9, 3, 0);
            sheet1.mergeCells(1, 10, 3, 0);
            sheet1.mergeCells(1, 11, 3, 0);
            sheet1.mergeCells(1, 12, 3, 0);
            sheet1.mergeCells(1, 13, 3, 0);
            sheet1.mergeCells(0, 14, 0, 14 + size);
            sheet1.mergeCells(0, 15 + size, 0, 15 + size + logSize);
            // sheet1.mergeCells(1, 15 + size, 3, 0);

            // 设置列宽 横向打印
            sheet1.setColumnView(0, 14);
            sheet1.setColumnView(1, 19);
            sheet1.setColumnView(2, 17);
            sheet1.setColumnView(3, 36);

            // 设置行高 纵向打印
            sheet1.setRowView(9, 5100);
            sheet1.setRowView(10, 5100);
            sheet1.setRowView(11, 5100);
            sheet1.setRowView(12, 5100);
            sheet1.setRowView(13, 5100);
            // 设置行高 横向打印
            // sheet1.setRowView(9, 3300);
            // sheet1.setRowView(10, 3300);
            // sheet1.setRowView(11, 3300);
            // sheet1.setRowView(12, 3300);
            // sheet1.setRowView(13, 3300);
            // sheet1.setRowView(15 + size, 2000);
            workbook.write();
            workbook.close();
        }
        File[] listFiles = dir.listFiles();
        for (int i = 0; i < listFiles.length; i++) {
            ZipUtils.doCompress(listFiles[i], outZ);
            response.flushBuffer();
        }
    } catch (Exception e) {
        e.printStackTrace();
        promptMessage.addException(e);
    } finally {
        try {
            outZ.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        File[] listFiles = dir.listFiles();
        for (File file : listFiles) {
            file.delete();
        }
        dir.delete();
    }
}

ZipUtils类代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;


/** 
* 压缩文件工具类
*/
public class ZipUtils {

    public static void doCompress(String srcFile, String zipFile) throws Exception {
        doCompress(new File(srcFile), new File(zipFile));
    }

    /**
     * 文件压缩
     * @param srcFile  目录或者单个文件
     * @param destFile 压缩后的ZIP文件
     */
    public static void doCompress(File srcFile, File destFile) throws Exception {
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(destFile));
        if(srcFile.isDirectory()){
            File[] files = srcFile.listFiles();
            for(File file : files){
                doCompress(file, out);
            }
        }else {
            doCompress(srcFile, out);
        }
    }

    public static void doCompress(String pathname, ZipOutputStream out) throws IOException{
        doCompress(new File(pathname), out);
    }

    public static void doCompress(File file, ZipOutputStream out) throws IOException{
        if( file.exists() ){
            byte[] buffer = new byte[1024];
            FileInputStream fis = new FileInputStream(file);
            out.putNextEntry(new ZipEntry(file.getName()));
            int len = 0 ;
            // 读取文件的内容,打包到zip文件    
            while ((len = fis.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            out.setEncoding("gbk");
            out.flush();
            out.closeEntry();
            fis.close();
        }
    }

}

前台使用Form提交方式:

// 导出待入库项目
exportPendingManageLibProjs : function() {
    // 获取被选中的项目
    var selectedRows = jkt.table.getSelectedRows();
    if (selectedRows.length == 0) {
        jkt.dialogError("请选择要导出的项目");
        return;
    }
    var url = "/ppp/projectAudit/exportPendingManageLibProjs.do?TT_TOKEN=" + jkt.getCookie("TT_TOKEN");
    $("#selectedRows").val(JSON.stringify(selectedRows));
    $("#myExportManageLibForm").attr("action", jkt.realPath(url));
    $("#myExportManageLibForm").submit();
}

你可能感兴趣的:(java)