Java Servlet 实现合并多单元格导出Excel

1、Excel导出模板

在这里插入图片描述

2、按照模板得格式内容进行数据查询导出

创建 “Servlet” 类在 doPost中 进行导出功能实现:

	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * <pre>
		 1. 接收参数集合
		 2. 必传参数验证
		 3. xss攻击和防止sql注入
		 	3.1 xss攻击
		 	3.2 防止sql注入
		 4. 获取微服务地址 
		 5. 执行存储过程
		 6. 创建excel并写入表头信息
		 7. 将数据写入到excel中
		 * </pre>
		 */

		// 程序开始-当前时间
		this.commonLogout(CommonUtils.getCurrentTime() + ",导出 - start");

		JSONObject jObjectStr; // 返回给前端的结果对象
		String strRet = ""; // 返回给前端的结果
		JSONArray result = null; // 最终数据
		try {
			/* 1. 接收参数集合 */
			Map<String, Object> mapReqData = HttpRequestParse.parse(request);
			this.commonLogout(CommonUtils.getCurrentTime() + " 接收到的参数:" + mapReqData);
			// 如需要cookies 得值可通过以下方法取
		    Map myCookies = (Map) this.getCookieData(mapReqData);// 获取cookie
			Map<String, String> mapReqParameterData = this.getMapWebArg(mapReqData); // 获取"GET/POST请求数据"
			
		// 接收前端传得条件参数
			// 请求用户id
			String argUserId = "";
			// 租户id
			String argTenantid = "";
			// 模块url
			String argModuleurl = "";
			// 主ID
			String developPlanId = "";
			// 版本号
			String argReqVersion = "";

			// 对前端得参数进行非空验证
			argUserId = mapReqParameterData.get(ProjConstant.PrivilegeMgtConstant.FRONT_KEY_SYSMGT_ARG_REQ_USERID);
			argTenantid = mapReqParameterData.get(ProjConstant.PrivilegeMgtConstant.FRONT_KEY_SYSMGT_ARG_REQ_TENANTID);
			argModuleurl = mapReqParameterData
					.get(ProjConstant.PrivilegeMgtConstant.FRONT_KEY_SYSMGT_ARG_REQ_MODULEURL);
			developPlanId = mapReqParameterData.get("arg_req_develop_planId");
			argReqVersion = mapReqParameterData.get("arg_req_version");

			/* 2. 必传参数验证 */
			StringBuilder validateRet = new StringBuilder();
			boolean validateFlag = true;
			if (StringUtils.isEmpty(argUserId)) {
				validateFlag = false;
				validateRet.append("参数缺少用户id!");
			} else if (StringUtils.isEmpty(argTenantid)) {
				validateFlag = false;
				validateRet.append("参数缺少租户id!");
			} else if (StringUtils.isEmpty(argModuleurl)) {
				validateFlag = false;
				validateRet.append("参数缺少页面路径url!");
			} else if (StringUtils.isEmpty(developPlanId)) {
                validateFlag = false;
                validateRet.append("参数缺少主表关联ID!");
            }else if (StringUtils.isEmpty(argReqVersion)) {
                validateFlag = false;
                validateRet.append("参数缺少版本号!");
            }

			if (!validateFlag) {
				this.commonLogout("前端传值缺参数:" + validateRet.toString());
				throw new FrontReturnException("0", "操作失败!");
			}

			/* 6. 创建excel并写入表头信息 */
			XSSFWorkbook workBook = null; // 创建excel
			String excelName = "本单位研发项目清单导出"; // excel名称
			workBook = ExcelBPNewTool.createHeadForExcel('', null, (short) 0);
			String[] date = createDateKey(); // 返回的数据字段 - **文章下有对应createDateKey方法名**

			// 5、 查询数据库需要导出那些数据并进行返回
			String queryExistSql = " SELECT dp.*,og.name,op.last_name FROM cucc_project.develop_plan_list dp  "
                    + " left join org_organization og on dp.ou_id = og.organization_id "
                    + " left join org_person op on dp.create_user = op.employee_number "
					+ " WHERE dp.develop_plan_id = '" + developPlanId + "' and dp.version_upload = '" + argReqVersion + "'  order by dp.first_order asc ;";

			// 执行Sql 语句,以下查询接口各位根据项目框架情况自由发挥
			JSONObject transResultExist = this.queryDb(sqlSelectUrl, queryExistSql);
			/* 7. 将数据写入到excel中 */
			if (ProjConstant.ProjCommonStandardConstant.RET_CODE_VALUE_SUCCESS
					.equals(transResultExist.getString("RetCode"))) { // 存在BP详情清单
				result = new JSONArray();
				// 判断数据是否存在
				if (transResultExist.has("DataRows")) {
					String type = "正常";
					// 查询 dataRows 获取数据值
					String Query = transResultExist.get("DataRows").toString();
					JSONArray jsonArray = new JSONArray(Query);
					// 循环遍历数据进入插入对应得表头
					for (int i = 0; i < jsonArray.length(); i++) {
						JSONObject jsonObject = jsonArray.getJSONObject(i);
						JSONObject rolePersonsJsonObject = new JSONObject();
						// 优先排序 *
						rolePersonsJsonObject.put("arg_req_first_order",jsonObject.get("first_order").toString()); 
						// 单位id *
						rolePersonsJsonObject.put("arg_req_ou_id",jsonObject.get("name").toString());
						//部门名称-主建部门 *
						rolePersonsJsonObject.put("arg_req_dept_name",jsonObject.get("dept_name").toString()); 
				       // 专业线 *
				       rolePersonsJsonObject.put("arg_req_majar_line_ou",jsonObject.get("major_line_ou").toString()); 
					   // 项目名称 *			      
					   rolePersonsJsonObject.put("arg_req_proj_name",jsonObject.get("proj_name").toString()); 
				   // 应用主体 *
				   rolePersonsJsonObject.put("arg_req_majar_line_proj",jsonObject.get("major_line_proj").toString()); 
						BigDecimal mon1 = new BigDecimal(jsonObject.get("expense_expenditure").toString());
						BigDecimal mon2 = new BigDecimal(jsonObject.get("capitalize_expenditure").toString());
						BigDecimal money = mon1.add(mon2);
						rolePersonsJsonObject.put("arg_req_proj_money",money); // 研发项目经费总投入(万元)
			rolePersonsJsonObject.put("arg_req_expense_expenditure",jsonObject.get("expense_expenditure").toString()); //费用化支出(万元)
						rolePersonsJsonObject.put("arg_req_expense_entrust",jsonObject.get("expense_entrust").toString()); // 费用化支出-委托开发费用(万元
rolePersonsJsonObject.put("arg_req_expense_own",jsonObject.get("expense_own").toString()); // 费用化支出-自有研发人工成本(万元)
		rolePersonsJsonObject.put("arg_req_capitalize_expenditure",jsonObject.get("capitalize_expenditure").toString()); // 资本化支出(万元)
						rolePersonsJsonObject.put("arg_req_capitalize_entrust",jsonObject.get("capitalize_entrust").toString()); // 资本化支出-委托开发费用(万元)
						rolePersonsJsonObject.put("arg_req_capitalize_own",jsonObject.get("capitalize_own").toString()); // 资本化支出-自有研发人员工时(人年) *
						rolePersonsJsonObject.put("arg_req_develop_content",jsonObject.get("develop_content").toString()); // 主要研发内容 *
rolePersonsJsonObject.put("arg_req_proj_value",jsonObject.get("proj_value").toString()); // 预期研发成果200字左右 *
rolePersonsJsonObject.put("arg_req_create_user",jsonObject.get("last_name").toString()); // 处理人
						rolePersonsJsonObject.put("arg_req_create_time",jsonObject.get("create_time").toString().substring(0,19)); // 上传时间
						if(jsonObject.get("proj_state").toString().equals("1")){
							type = "已修改";
						} else if(jsonObject.get("proj_state").toString().equals("2")){
							type = "已删除";
						}
						rolePersonsJsonObject.put("arg_req_proj_state",type); // 状态
						result.put(rolePersonsJsonObject);
					}

					// 向Excel写入数据 
					ExcelBPNewTool.insertDataToExcel(workBook, result, "", date);
				} else {
					// 没有查找到角色信息,向Excel写入空数据
					ExcelBPNewTool.insertDataToExcel(workBook, result, "", date);
				}
				// 导出Excel
				ExcelBPNewTool.exportExcelXSSF(request, response, workBook, excelName);
				
	// 以下代码 数据返回及异常抛出,可根据项目框架情况自定
			} else {
				this.commonLogout("导出 - 执行查询出错!");
				jObjectStr = new JSONObject();
				jObjectStr.put(ConstantUtility.StandardWebConstant.KEY_RETCODE,
						ProjConstant.ProjCommonStandardConstant.FRONT_RET_CODE_ERROR);
				jObjectStr.put(ConstantUtility.StandardWebConstant.KEY_RETVAL,
						ProjConstant.ProjCommonStandardConstant.FRONT_RET_VAL_ERROR);
				strRet = jObjectStr.toString();
			}
		} catch (Exception e) {
			this.commonLogout(e.getMessage());
			jObjectStr = new JSONObject();
			jObjectStr.put(ConstantUtility.StandardWebConstant.KEY_RETCODE,
					ProjConstant.ProjCommonStandardConstant.FRONT_RET_CODE_ERROR);
			jObjectStr.put(ConstantUtility.StandardWebConstant.KEY_RETVAL,
					ProjConstant.ProjCommonStandardConstant.FRONT_RET_VAL_ERROR);
			strRet = jObjectStr.toString();
		}

		this.commonLogout(strRet);
		response.getOutputStream().write(strRet.getBytes("UTF-8"));
		response.flushBuffer();

		// 项目结束 - 结束时间
		this.commonLogout(CommonUtils.getCurrentTime() + ",导出 - end");
	}


	/**
	 * createDateKey:生成返回字段,相当于Excel列表头 对应数据
	 * @return
	 * @since JDK 1.8
	 */
	private String[] createDateKey() {

		// 返回的数据字段
		String firstOrder = "arg_req_first_order";
		String ouId = "arg_req_ou_id";
		String deptName = "arg_req_dept_name";
		String majarLineOu= "arg_req_majar_line_ou";
		String projName= "arg_req_proj_name";
		String majarLineProj= "arg_req_majar_line_proj";
		String projMoney= "arg_req_proj_money";
		String expenseExpenditure = "arg_req_expense_expenditure";
		String expenseEntrust = "arg_req_expense_entrust";
		String expenseOwn = "arg_req_expense_own";
		String capitalizeExpenditure = "arg_req_capitalize_expenditure";
		String capitalizeEntrust = "arg_req_capitalize_entrust";
		String capitalizeOwn= "arg_req_capitalize_own";
		String developContent = "arg_req_develop_content";
		String projValue = "arg_req_proj_value";
		String createUser = "arg_req_create_user";
		String createTime = "arg_req_create_time";
		String projState = "arg_req_proj_state";

		return new String[] { firstOrder, ouId, deptName, majarLineOu, projName, majarLineProj, projMoney,expenseExpenditure,expenseEntrust
		,expenseOwn,capitalizeExpenditure,capitalizeEntrust,capitalizeOwn,developContent,projValue,createUser,createTime,projState};
}

​ 3、Excle导出工具类

创建 “工具类(ExcelBPNewTool)” 在调用方法 进行导出功能实现:


package com.chinaunicomrjyjy.cuccproject.utils;

import com.rjyjy.commonutils.BDUServiceBaseTools;
import com.rjyjy.loghandle.LogService;
import com.rjyjy.servicehandle.utility.ConstantUtility;
import org.apache.commons.codec.binary.Base64;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.json.JSONArray;
import org.json.JSONObject;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;

/**
 * @ClassName ExcelTool
 * @Description excel导出工具类
 * @Author chang
 * @version
 * @since JDK 1.8
 */
public class ExcelBPNewTool {

	private static final String CHARACTERENCODING = ConstantUtility.DefaultConfig.DEFAULTCONFIG_CHARACTERENCODING;

	private static final String SHEETNAME = "本单位研发项目清单";
	private static final String FONT = "宋体";
	private static final short FONTSIZE = 12;
	private static final String[] PARAMETERS = new String[] { SHEETNAME, FONT };

	ExcelBPNewTool() {

	}

	/**
	 * 
	 * createHeadForExcel:(创建表头)仅有一个sheet,sheet默认Sheet1
	 * 
	 * @author haoz6
	 * @param headString
	 *            表头数组
	 * @param fontSize
	 *            表头字体大小
	 * @return
	 * @since JDK 1.8
	 */
	@SuppressWarnings("deprecation")
	public static XSSFWorkbook createHeadForExcel(String[] headString,
			String[] parameters, short fontSize) {

		// Excel表头相关
		int defaultRowHeight = 40;

		String[] parameters2 = parameters;
		short fontSize2 = fontSize;
		if (parameters2 == null) {
			parameters2 = PARAMETERS;
		}
		if (fontSize2 == 0) {
			fontSize2 = FONTSIZE;
		}
		// 创建excel
		XSSFWorkbook workbook = new XSSFWorkbook();
		// 创建sheet
		XSSFSheet sheet = workbook.createSheet(parameters2[0]);
		sheet.setDefaultRowHeightInPoints(defaultRowHeight);
		// 设置字体
		XSSFFont headfont = workbook.createFont();
		// 字体类型
		headfont.setFontName(parameters2[1]);
		// 字体大小
		headfont.setFontHeightInPoints(fontSize2);
		// 设置样式
		XSSFCellStyle headstyle = workbook.createCellStyle();
		headstyle.setFont(headfont);
		// 左右居中
		headstyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
		// 上下居中
		headstyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
		// 边框
		headstyle.setBorderBottom(BorderStyle.THIN);
		headstyle.setBorderLeft(BorderStyle.THIN);
		headstyle.setBorderRight(BorderStyle.THIN);
		headstyle.setBorderTop(BorderStyle.THIN);
		// 换行
		headstyle.setWrapText(true);

		int rowNum = 0;
		// 创建表头行// 第1行,标题
		XSSFRow titleRow = sheet.createRow(0);
		titleRow.setHeight((short) 800);// 设置行高
		XSSFCell row1Cell1 = titleRow.createCell(0);
		row1Cell1.setCellValue("研发项目清单");
		row1Cell1.setCellStyle(headstyle);
		sheet.addMergedRegion(new CellRangeAddress(0,0,0,17));//标题 合并单元格


		//第二行
		XSSFRow row2 = sheet.createRow(1);
		row2.setHeight((short) 800);
		// 设置Excel 第二行表头 
		String[] row_second = {"优先级排序", "项目实施部门", "", "", "研发项目", "", "研发项目经费总投入(万元)","项目主要投入分解","","","","","","主要研发内容和预期研发成果(200字左右简要描述)","研发成果预期价值(成果未来应用场景及对生产经营的主要价值贡献点)","处理人","上传时间","状态"};
		for (int i = 0; i < row_second.length; i++) {
			XSSFCell tempCell = row2.createCell(i);
			tempCell.setCellValue(row_second[i]);
			tempCell.setCellStyle(headstyle);
		}

		// 合并 设置每个表头 进行跨行跨列,可对应导出模板 进行了解
		sheet.addMergedRegion(new CellRangeAddress(1, 2, 0, 0));//优先级排序
		sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 3));//项目实施部门
		sheet.addMergedRegion(new CellRangeAddress(1, 1, 4, 5));//研发项目
		sheet.addMergedRegion(new CellRangeAddress(1, 2, 6, 6));//研发项目经费总投入(万元)
		sheet.addMergedRegion(new CellRangeAddress(1, 1, 7, 12));//项目主要投入分解
		sheet.addMergedRegion(new CellRangeAddress(1, 2, 13, 13));//主要研发内容
		sheet.addMergedRegion(new CellRangeAddress(1, 2, 14, 14));//研发成果预期价值
		sheet.addMergedRegion(new CellRangeAddress(1, 2, 15, 15));//处理人
		sheet.addMergedRegion(new CellRangeAddress(1, 2, 16, 16));//上传时间
		sheet.addMergedRegion(new CellRangeAddress(1, 2, 17, 17));//状态


		//第三行
		XSSFRow row3 = sheet.createRow(2);
		row3.setHeight((short) 800);
		// 设置Excel 第三行表头,合并在第二行得某个分类下, 可对应模板查看 了解
		String[] row_third = {"", "单位名称", "部门名称(研发单元)", "研发单元所属专业线", "项目名称", "应用主体", "","费用化支出(万元)","其中:委托开发费用(万元)","其中:自有研发人工成本(万元)","资本化支出(万元)","其中:委托开发费用(万元)","自有研发人员工时(人年)","","","","",""};
		for (int i = 0; i < row_third.length; i++) {
			XSSFCell tempCell = row3.createCell(i);
			tempCell.setCellValue(row_third[i]);
			tempCell.setCellStyle(headstyle);
		}

		// 设置Excel 列宽,也可以进行列宽 自适应 已下有方法
		sheet.setColumnWidth(0, 256*10+184);
		sheet.setColumnWidth(1, 256*20+184);
		sheet.setColumnWidth(2, 256*20+184);
		sheet.setColumnWidth(3, 256*20+184);
		sheet.setColumnWidth(4, 256*20+184);
		sheet.setColumnWidth(5, 256*20+184);
		sheet.setColumnWidth(6, 256*18+184);
		sheet.setColumnWidth(7, 256*11+184);
		sheet.setColumnWidth(8, 256*11+184);
		sheet.setColumnWidth(9, 256*11+184);
		sheet.setColumnWidth(10, 256*11+184);
		sheet.setColumnWidth(11, 256*11+184);
		sheet.setColumnWidth(12, 256*11+184);
		sheet.setColumnWidth(13, 256*30+184);
		sheet.setColumnWidth(14, 256*30+184);
		sheet.setColumnWidth(15, 256*11+184);
		sheet.setColumnWidth(16, 256*30+184);
		sheet.setColumnWidth(17, 256*8+184);
		return workbook;
	}


	/**
	 * 
	 * insertDataToExcel:向Excel中插入数据
	 * 
	 * @author haoz6
	 * @param workBook
	 * @param dataRowObject
	 * @since JDK 1.8
	 */
	public static void insertDataToExcel(XSSFWorkbook workBook,
			JSONObject dataRowObject, String[] headString) {
		JSONArray data = new JSONArray(dataRowObject
				.get(ConstantUtility.StandardWebConstant.KEY_DATAROWS)
				.toString());
		insertDataToExcel(workBook, data, null, headString);
	}

	/**
	 * 
	 * insertDataToExcel:向Excel中插入数据
	 * 
	 * @author haoz6
	 * @param workBook
	 * @since JDK 1.8
	 */
	@SuppressWarnings("deprecation")
	public static void insertDataToExcel(XSSFWorkbook workBook,
			JSONArray dataJsonArray, String sheetName, String[] headString) {
		// 判断 创建sheet页名称
		String sheetName2 = "";
		if (sheetName == null||sheetName=="") {
			sheetName2 = SHEETNAME;
		} else {
			sheetName2 = sheetName;
		}
		/**
		 * 设置字体和样式
		 */
		XSSFFont headfont = workBook.createFont();
		// 字体类型
		headfont.setFontName(FONT);
		// 字体大小
		headfont.setFontHeightInPoints(FONTSIZE);
		// 样式
		XSSFCellStyle headstyle = workBook.createCellStyle();
		headstyle.setFont(headfont);
		/*// 左右居中
		headstyle.setAlignment(XSSFCellStyle.ALIGN_LEFT);
		// 上下居中
		headstyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);*/
		// 竖向居中
		headstyle.setVerticalAlignment(VerticalAlignment.CENTER);
		// 横向居中
		headstyle.setAlignment(HorizontalAlignment.CENTER);
		headstyle.setBorderBottom(BorderStyle.THIN);
		headstyle.setBorderLeft(BorderStyle.THIN);
		headstyle.setBorderRight(BorderStyle.THIN);
		headstyle.setBorderTop(BorderStyle.THIN);
		headstyle.setWrapText(true);
		JSONObject oneData = null;

		// 取Sheet
		XSSFSheet sheet = workBook.getSheet(sheetName2);
		JSONArray data = dataJsonArray;
		for (int i = 0; i < data.length(); i++) {
			oneData = (JSONObject) data.get(i);
			// 第2行
			XSSFRow timesheeRow = sheet.createRow(i + 3);
			timesheeRow.setHeight((short) 500);
			XSSFCell tempCell = null;
			// 循环单元格填入数据
			for (int j = 0; j < 18; j++) {
				tempCell = timesheeRow.createCell(j);
				tempCell.setCellStyle(headstyle);
				String tempValue;
				if (j == 0) {
					// 优先排序
					tempValue = oneData.get("arg_req_first_order").toString();
				} else if (j == 1) {
					// 单位id)
					tempValue = oneData.get("arg_req_ou_id").toString();
				} else if (j == 2) {
					// 部门名称
					tempValue = oneData.get("arg_req_dept_name").toString();
				} else if (j == 3) {
					// 专业线
					tempValue = oneData.get("arg_req_majar_line_ou").toString();
				} else if (j == 4) {
					// 项目名称
					tempValue = oneData.get("arg_req_proj_name").toString();
				} else if (j == 5) {
					// 应用主体
					tempValue = oneData.get("arg_req_majar_line_proj").toString();
				} else if (j ==6){
					// 研发项目经费总投入(万元)
					tempValue = oneData.get("arg_req_proj_money").toString();
				} else if (j ==7){
				 	// 费用化支出(万元)
				 	tempValue = oneData.get("arg_req_expense_expenditure").toString();
				} else if (j ==8){
				 	// 费用化支出-委托开发费用(万元
				 	tempValue = oneData.get("arg_req_expense_entrust").toString();
				} else if (j ==9){
				 	// 费用化支出-自有研发人工成本(万元)
				 	tempValue = oneData.get("arg_req_expense_own").toString();
				} else if (j ==10){
				 	//资本化支出(万元)
				 	tempValue = oneData.get("arg_req_capitalize_expenditure").toString();
				} else if (j ==11){
					// 资本化支出-委托开发费用(万元)
					tempValue = oneData.get("arg_req_capitalize_entrust").toString();
				} else if (j ==12){
				 	// 资本化支出-自有研发人员工时(人年)
				 	tempValue = oneData.get("arg_req_capitalize_own").toString();
				} else if (j ==13){
				 	// 主要研发内容
				 	tempValue = oneData.get("arg_req_develop_content").toString();
				} else if (j == 14){
					// 预期研发成果200字左右
					tempValue = oneData.get("arg_req_proj_value").toString();
				} else if (j == 15){
					// 处理人
					tempValue = oneData.get("arg_req_create_user").toString();
				} else if (j == 16){
					// 上传时间
					tempValue = oneData.get("arg_req_create_time").toString();
				} else {
					// 状态
					tempValue = oneData.get("arg_req_proj_state").toString();
				}
				tempCell.setCellValue(tempValue);

			}
		}
		// 设置Excel数据列宽,可自适应
		sheet.setColumnWidth(0, 256*10+184);
		sheet.setColumnWidth(1, 256*20+184);
		sheet.setColumnWidth(2, 256*20+184);
		sheet.setColumnWidth(3, 256*20+184);
		sheet.setColumnWidth(4, 256*20+184);
		sheet.setColumnWidth(5, 256*20+184);
		sheet.setColumnWidth(6, 256*18+184);
		sheet.setColumnWidth(7, 256*11+184);
		sheet.setColumnWidth(8, 256*11+184);
		sheet.setColumnWidth(9, 256*11+184);
		sheet.setColumnWidth(10, 256*11+184);
		sheet.setColumnWidth(11, 256*11+184);
		sheet.setColumnWidth(12, 256*11+184);
		sheet.setColumnWidth(13, 256*30+184);
		sheet.setColumnWidth(14, 256*30+184);
		sheet.setColumnWidth(15, 256*11+184);
		sheet.setColumnWidth(16, 256*30+184);
		sheet.setColumnWidth(17, 256*8+184);
		// 自适应列宽
		//autoSizeColumnWidth(sheet, 17);
	}

	/**
	 * autoSizeColumnWidth:自适应列宽
	 * 
	 * @author "haoz6"
	 * @param sheet
	 * @since JDK 1.8
	 */
	public static void autoSizeColumnWidth(XSSFSheet sheet, int columnNum) {
		for (int i = 0; i < columnNum; i++) {
			sheet.autoSizeColumn((short) i);
		}
	}

	/**
	 * 
	 * exportExcel:excel导出
	 * 
	 * @author haoz6
	 * @param request
	 * @param response
	 * @param workBook
	 * @throws IOException
	 * @since JDK 1.8
	 */
	public static void exportExcelXSSF(HttpServletRequest request,
			HttpServletResponse response, XSSFWorkbook workBook,
			String excelName) throws IOException {

		String respContentType = "multipart/form-data";
		String reqUserAgent = "User-Agent";
		String fileSuffix = ".xlsx";
		String fireFox = "Firefox";
		String respContentDispositionKey = "Content-Disposition";
		String respContentDispositionValue = "attachment;filename=";
		String timesheet = excelName;
		String browser = "=?utf-8?b?";
		String browser2 = "?=";
		String browser3 = "+";
		String browser4 = " ";

		OutputStream os = null;

		try {
			String filename = timesheet + fileSuffix;
			response.setContentType(respContentType);
			String agent = request.getHeader(reqUserAgent);
			if (agent.contains(fireFox)) {
				// 火狐浏览器 只能收到拼接base64的编码
				filename = browser
						+ (new String(Base64.encodeBase64(
								filename.getBytes(CHARACTERENCODING))))
						+ browser2;
			} else {
				// IE,谷歌浏览器
				filename = URLEncoder.encode(filename, CHARACTERENCODING);
				BDUServiceBaseTools.commonLogout(filename);
				filename = filename.replace(browser3, browser4);
			}
			response.setHeader(respContentDispositionKey,
					respContentDispositionValue + filename);
			os = new BufferedOutputStream(response.getOutputStream());
			// 将workbook写入到response中
			workBook.write(os);
			workBook.close();
			os.close();
			// 刷新缓冲区,将缓冲区数据写入到response中
			response.flushBuffer();
		} catch (IOException e1) {
			String errorRetVal = "获得传入参数失败";
			BDUServiceBaseTools.commonLogout(errorRetVal);
			// CommonError.errorEndServlet(errorRetVal, response);
			LogService.catching(e1);
		}finally {
			if (os!=null){
				os.close();
			}
			workBook.close();
		}
	}
}

以上就是 “Java Servlet 实现合并多单元格导出Excel” 得代码,希望各位大佬给予点评,互相学习,感谢!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值