java从List<Map>导出excel

来源:互联网 发布:天刀女性捏脸数据库 编辑:程序博客网 时间:2024/05/20 18:15

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

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@ViewScopedpublic class MakeExcel {/*************************************************************************** * @param fileName *            EXCEL文件名称 * @param listTitle *            EXCEL文件第一行列标题集合 * @param listContent *            EXCEL文件正文数据集合 * @return */String fileName;String[] Title;List<Object> 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();// 以下开始输出到EXCELtry { //定义输出流,以便打开保存对话框______________________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>,用Map的方式处理//第二种传的是List<Object>,用普通类取属性的方式来处理;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<Object>)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里面去执行了。

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

<h:commandButton actionListener="#{makeExcel.exportExcel}" value="java导出excel">
<f:attribute name="content" value="#{machineBean.machineInfoMap}" />
<f:attribute name="filename" value="Mapexcel" />
<f:attribute name="titles" value="id,组件,m9变形,警告信息" />
</h:commandButton>
content的内容就是一个List<Map>,filename就是你指定的下载下来的excel的名称,titles是excel中的每个栏位的名称,这样其实就替使用者屏蔽了List内部类型的差别,因为不管List内部放的是一个实体类,还是一个Map集合,都能直接传进去,比较方便,但是应该还没其它没考虑到的类型,要用到再改好了~

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

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

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

原创粉丝点击