java实现excel导出功能 WritableWorkbook

String fileName = “excel名称”;
String columnCaptions =“excel列名”;
//例如
//String columnCaptions = “市场成员名称,调度简称,曾用名,注册编码,所属发电集团,许可证是否豁免,地理区域,状态”
List list = participantManageBizc.getMarketPartExportList(request,
map);//数据库查询数据

// 调用工具类将excel导出
ExcelUtilJXL.exportExcel(request, response, fileName,
columnCaptions, list);

//ExcelUtilJXL类exportExcel方法代码:
public static final void exportExcel(HttpServletRequest p_request,
HttpServletResponse p_response, String p_fileName,
String columnCaptions, List p_listContent) {
String[][] p_Titles = getExcelTitle(columnCaptions);
OutputStream os;
try {
os = p_response.getOutputStream();
p_response.reset();

		String filenamedisplay = URLEncoder.encode(p_fileName, "UTF-8");
		if ("FF".equals(getBrowser(p_request))) {
			filenamedisplay = new String(p_fileName.getBytes("UTF-8"),
					"iso-8859-1");
		}
		//HTTP响应截断
		filenamedisplay = filenamedisplay.trim();
		filenamedisplay = filenamedisplay.replaceAll("\t", ""); //去掉制表符号
		filenamedisplay = filenamedisplay.replaceAll("\r\n",""); //去掉回车换行符号
		filenamedisplay = filenamedisplay.replaceAll("\r",""); //去掉回车
		filenamedisplay = filenamedisplay.replaceAll("\n",""); //去掉换行
		filenamedisplay = filenamedisplay.replaceAll(" ",""); //去掉空格
		filenamedisplay = filenamedisplay.replaceAll("'",""); //去掉单引号
		p_response.addHeader("Content-Disposition", "attachment; filename="
				+ filenamedisplay);
		p_response.addHeader("Content-Type", "application/vnd.ms-excel");

		WritableWorkbook workbook = Workbook.createWorkbook(os);
		// 新建excel中的sheet的danyuan
		WritableSheet sheet = workbook.createSheet("Sheet1", 0);
		SheetSettings sheetset = sheet.getSettings();
		sheetset.setProtected(false);
		// 格式化excel某些单元格的样式
		// 一般样式,字体样式,标题加黑,普通正文
		WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
		WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 10,
				WritableFont.BOLD);

		// 表格设置边框,对齐方式等
		WritableCellFormat wcf_center = new WritableCellFormat(BoldFont);
		wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN);
		wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE);
		wcf_center.setAlignment(Alignment.CENTRE);
		wcf_center.setWrap(false);

		WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);
		wcf_left.setBorder(Border.NONE, BorderLineStyle.THIN);
		wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE);
		wcf_left.setAlignment(Alignment.LEFT);
		wcf_left.setWrap(false);
		int cur = 0;
		// 将excel第一行的标题循环写入excel
		if (p_Titles.length != 0 && p_Titles[0].length != 0) {
			if (p_Titles.length == 1) {
				// 单表头
				for (int i = 0; i < p_Titles[0].length; ++i) {
					// sheet.
					sheet.addCell(new Label(i, 0, p_Titles[0][i],
							wcf_center));
				}
				cur = 1;
			} else {
				// 多表头( 合并单元格将按需合并)
				for (int i = 0; i < p_Titles.length; i++) {
					for (int j = 0; j < p_Titles[0].length; j++) {
						if (p_Titles[i][j] != null
								&& !p_Titles[i][j].equals("null")) {
							int _i = i + 1;
							int _j = j + 1;
							for (; _i < p_Titles.length; _i++) {
								if (p_Titles[_i][j] != null && !p_Titles[_i][j].equals("null")) {
									_i--;
									break;
								}
								p_Titles[_i][j] = null;//代表已经合并的单元格
							}
							for (; _j < p_Titles[0].length; _j++) {
								if (p_Titles[i][_j] == null || !p_Titles[i][_j].equals("null")) {
									_j--;
									break;
								}
								p_Titles[i][_j] = null;//代表已经合并的单元格
							}
							if (_i == p_Titles.length) {
								_i = p_Titles.length - 1;
							}
							if (_j == p_Titles[0].length) {
								_j = p_Titles[0].length - 1;
							}
							sheet.mergeCells(j, i, _j, _i);
							// 先列后行
							sheet.addCell(new Label(j, i, p_Titles[i][j],
									wcf_center));
						}
					}
				}
				cur = p_Titles.length;
			}
		}
		for (int row = 0; row < p_listContent.size(); ++row) {
			Object[] dataRow = null;
			if ((p_listContent.get(0) != null)
					&& (p_listContent.get(0).getClass().isArray())) {
				dataRow = (Object[]) (Object[]) p_listContent.get(row);
			} else {
				dataRow = new Object[] { p_listContent.get(row) };
			}

			// 循环读取List数据,将要导出的数据写入到excel中
			int length = Math.min(p_Titles[0] == null ? 0
					: p_Titles[0].length, dataRow.length);
			for (int col = 0; col < length; ++col) {
				if (dataRow[col] != null) {
					String listvalue = "";
					if(dataRow[col].getClass() == org.hibernate.lob.SerializableClob.class){
						SerializableClob listvalueClob = (SerializableClob) dataRow[col];
						listvalue = listvalueClob.getSubString(1, (int) listvalueClob.length());
					}else{
						listvalue = dataRow[col].toString();
					}
					Label label = new Label(col, row + cur, listvalue);
					sheet.addCell(label);
				} else {
					Label label = new Label(col, row + cur, "");
					sheet.addCell(label);
				}
			}
		}

		// 将数据写入到excel。
		workbook.write();
		workbook.close();
		os.flush();
	} catch (Exception e) {
		// 导出失败写入日志中
		String message = "生成 Excel 时出错";
		if (log.isErrorEnabled()) {
			log.error("MXFRAMEWORK" + message, e);
		}
	}
}

/**
 * 
 * @description 判断页面使用的什么浏览器
 * @param request
 * @return
 * @author 
 * @date 
 */
private static String getBrowser(HttpServletRequest request) {
	String UserAgent = request.getHeader("USER-AGENT").toLowerCase();
	if (UserAgent != null) {
		if (UserAgent.indexOf("msie") >= 0)
			return "IE";
		if (UserAgent.indexOf("firefox") >= 0)
			return "FF";
		if (UserAgent.indexOf("safari") >= 0)
			return "SF";
	}
	return null;
}

/**
*
* @description 获取excel的标题
* @param columnCaptions
* @return
* @author dingjianwei
* @date 2013-6-21
*/
public static final String[][] getExcelTitle(String columnCaptions) {
if (columnCaptions == null || columnCaptions.equals("")) {
return new String[0][0];
}
String[] items = columnCaptions.split(";");
String[][] titles = null;
if (items.length == 0) {
return new String[0][0];
} else {
String[] item = items[0].split(",");
titles = new String[items.length][item.length];
for (int i = 0; i < items.length; i++) {
item = items[i].split(",");
for (int j = 0; j < item.length; j++) {
titles[i][j] = item[j];
}
}
}
return titles;
}

发布了10 篇原创文章 · 获赞 1 · 访问量 428

猜你喜欢

转载自blog.csdn.net/weixin_38919176/article/details/103280721