java从List导出excel

本来我以为已经完事了,找头头过来让他看看,他说一般hibernate多表查询之后返回的List里面的内容一般都是Map类型的,我前面写的那个是List,我以为可以的。。。但是我试了一下,传一个List进去,结果输出的结果我也看不懂了,没办法,只好再写个处理List的方法:代码如下

package com.zhangbinhui.ManageBean;

import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/***
 * @author lsf
 */
@ManagedBean
@ViewScoped
public class MakeExcel {
	/***************************************************************************
	 * @param fileName
	 *            EXCEL文件名称
	 * @param listTitle
	 *            EXCEL文件第一行列标题集合
	 * @param listContent
	 *            EXCEL文件正文数据集合
	 * @return
	 */

	String fileName;
	String[] Title;
	List listContent;
	public String exportExcel(ActionEvent event) {
		fileName = (String)event.getComponent().getAttributes().get("filename");
		String title = (String)event.getComponent().getAttributes().get("titles");
		Title = title.split(",");
		String result = "系统提示:Excel文件导出成功!";
//		String hql;
//		hql = (String)event.getComponent().getAttributes().get("hql");
//		Session session = HibernateSessionFactory.getSession();
//		Query queryObj = session.createQuery(hql);
//		listContent = queryObj.list();
		// 以下开始输出到EXCEL
		try {
			 //定义输出流,以便打开保存对话框______________________begin
			 HttpServletResponse response=(HttpServletResponse) FacesContext  
				     .getCurrentInstance().getExternalContext().getResponse(); 
			 OutputStream os = response.getOutputStream();// 取得输出流
			 response.reset();// 清空输出流
			 response.setHeader("Content-disposition",
			 "attachment; filename="+ new
			 String(fileName.getBytes("GB2312"),"ISO8859-1")+".xls");
			 // 设定输出文件头
			 response.setContentType("application/msexcel");// 定义输出类型
			 //定义输出流,以便打开保存对话框_______________________end
			/** **********创建工作簿************ */
			WritableWorkbook workbook = Workbook.createWorkbook(os);

			/** **********创建工作表************ */

			WritableSheet sheet = workbook.createSheet("Sheet1", 0);

			/** **********设置纵横打印(默认为纵打)、打印纸***************** */
			jxl.SheetSettings sheetset = sheet.getSettings();
			sheetset.setProtected(false);
			sheetset.setDefaultColumnWidth(20);

			/** ************设置单元格字体************** */
			WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
			WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 10,
					WritableFont.BOLD);
			WritableFont TitleFont = new WritableFont(WritableFont.ARIAL, 20,
					WritableFont.BOLD);

			/** ************以下设置三种单元格样式,灵活备用************ */
			// 用于表名,要高端大气!
			WritableCellFormat title_center = new WritableCellFormat(TitleFont);
			title_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
			title_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
			title_center.setAlignment(Alignment.CENTRE); // 文字水平对齐
			title_center.setWrap(false); // 文字是否换行
			
			// 用于标题居中
			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(true); // 文字是否换行
			

			/** ***************以下是EXCEL开头大标题********************* */
			 sheet.mergeCells(0, 0, Title.length-1, 2);
			 sheet.addCell(new Label(0, 0, fileName, title_center));
			/** ***************以下是EXCEL第一行列标题********************* */
			for (int i = 0; i < Title.length; i++) {
				sheet.addCell(new Label(i, 3, Title[i], wcf_center));
			}
			/** ***************以下是EXCEL正文数据********************* */
			//这里要分成两种情况,第一种传的是List,用Map的方式处理
			//第二种传的是List,用普通类取属性的方式来处理;
			
			List list = (List) event.getComponent().getAttributes().get("content");
			Iterator iterator = list.iterator();
			Object o = iterator.next();
			if(o instanceof Map){
				Map m = (Map) o;
				System.out.println(m);
				Iterator iter = m.entrySet().iterator();
				int first_j=0;
				while (iter.hasNext()) {
					
					Map.Entry entry = (Map.Entry) iter.next();
					String[] key_value = entry.toString().split("=");
					System.out.println(key_value[1]);
					sheet.addCell(new Label(first_j, 4, key_value[1], wcf_left));
					first_j++;
				}
				int i=5;
				while(iterator.hasNext()){
					Map row_map = (Map) iterator.next();
					Iterator row_iterator = row_map.entrySet().iterator();
					int second_j=0;
					while(row_iterator.hasNext()){
						Map.Entry entry_column = (Map.Entry) row_iterator.next();
						String[] key_value = entry_column.toString().split("=");
						sheet.addCell(new Label(second_j, i, key_value[1], wcf_left));
						second_j++;
					}
					i++;
				}
				
			} else{
				listContent = (List)event.getComponent().getAttributes().get("content");	
				Field[] fields = null;
				Field f_value = null;
				int i = 4;
				for (Object obj : listContent) {
					fields = obj.getClass().getDeclaredFields();
					int j = 0;
					for (Field v : fields) {
						f_value = obj.getClass().getDeclaredField(v.getName());
						f_value.setAccessible(true);
						Object va = f_value.get(obj);
						if (va == null) {
							va = "";
						}
						sheet.addCell(new Label(j, i, va.toString(), wcf_left));
						j++;
					}
					i++;
				}
			}
			
			

			/** **********将以上缓存中的内容写到EXCEL文件中******** */
			workbook.write();
			/** *********关闭文件************* */
			workbook.close();
			
			System.out.println(result);

		} catch (Exception e) {
			result = "系统提示:Excel文件导出失败,原因:" + e.toString();
			System.out.println(result);
			e.printStackTrace();
		}
		return result;
	}
} 
  红色部分是我添加的,就是当发现List中的元素为Map类型时,就用上面的方法处理,否则就跑到else里面去执行了。 
  

调用的方法跟上一篇提到的一样,方便起见,我还是直接贴上来好了:






content的内容就是一个List,filename就是你指定的下载下来的excel的名称,titles是excel中的每个栏位的名称,这样其实就替使用者屏蔽了List内部类型的差别,因为不管List内部放的是一个实体类,还是一个Map集合,都能直接传进去,比较方便,但是应该还没其它没考虑到的类型,要用到再改好了~

还有就是这个问题解决了,头头说,不然再整一个导出pdf好了。。。我好想跟他说,你直接excel打开了,文件另存为pdf格式不就是pdf了嘛!干嘛还要我写一个导出pdf的功能呢!

但事实上,我还是对头头说没问题。。。,这个功能很有必要。。。

怎么导出pdf呢?我再写一篇好了。。。

你可能感兴趣的:(你好JSF)