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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章