java jxl导出excel小结

转载自:http://blog.csdn.net/xb12369/article/details/17507421

废话不多说,先上代码:

[java]  view plain  copy
 print ?
  1. package cn.com.jsoft.utils;  
  2.   
  3. import java.io.OutputStream;  
  4. import java.io.UnsupportedEncodingException;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import javax.servlet.http.HttpServletResponse;  
  9. import javax.servlet.jsp.PageContext;  
  10.   
  11. import jxl.SheetSettings;  
  12. import jxl.Workbook;  
  13. import jxl.format.Alignment;  
  14. import jxl.format.Colour;  
  15. import jxl.format.VerticalAlignment;  
  16. import jxl.write.Label;  
  17. import jxl.write.WritableCellFormat;  
  18. import jxl.write.WritableFont;  
  19. import jxl.write.WritableSheet;  
  20. import jxl.write.WritableWorkbook;  
  21.   
  22. /** 
  23.  * jxl导出excel 
  24.  * @author jamboree 
  25.  * @date  2013-11-28 
  26.  */  
  27. public class JxlExcelUtils {  
  28.   
  29.     /** 
  30.      * @author  
  31.      * @param objData 导出内容数组 
  32.      * @param sheetName 导出工作表的名称 
  33.      * @param columns 导出Excel的表头数组 
  34.      * @return 
  35.      */  
  36.     public static int exportToExcel(HttpServletResponse response, List<Map<String, Object>> objData, String sheetName,List<String> columns) {  
  37.         int flag = 0;  
  38.         //声明工作簿jxl.write.WritableWorkbook  
  39.         WritableWorkbook wwb;  
  40.         try {  
  41.             //根据传进来的file对象创建可写入的Excel工作薄  
  42.             OutputStream os = response.getOutputStream();  
  43.               
  44.             wwb = Workbook.createWorkbook(os);  
  45.   
  46.             /* 
  47.              * 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表 
  48.              * 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样 
  49.              * 代码中的"0"就是sheet1、其它的一一对应。 
  50.              * createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置 
  51.              */  
  52.             WritableSheet ws = wwb.createSheet(sheetName, 0);  
  53.               
  54.             SheetSettings ss = ws.getSettings();  
  55.             ss.setVerticalFreeze(1);//冻结表头  
  56.               
  57.             WritableFont font1 =new WritableFont(WritableFont.createFont("微软雅黑"), 10 ,WritableFont.BOLD);  
  58.             WritableFont font2 =new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);  
  59.             WritableCellFormat wcf = new WritableCellFormat(font1);  
  60.             WritableCellFormat wcf2 = new WritableCellFormat(font2);  
  61.             WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式,字体  
  62.   
  63.             //创建单元格样式  
  64.             //WritableCellFormat wcf = new WritableCellFormat();  
  65.   
  66.             //背景颜色  
  67.             wcf.setBackground(jxl.format.Colour.YELLOW);  
  68.             wcf.setAlignment(Alignment.CENTRE);  //平行居中  
  69.             wcf.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中  
  70.             wcf3.setAlignment(Alignment.CENTRE);  //平行居中  
  71.             wcf3.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中  
  72.             wcf3.setBackground(Colour.LIGHT_ORANGE);  
  73.             wcf2.setAlignment(Alignment.CENTRE);  //平行居中  
  74.             wcf2.setVerticalAlignment(VerticalAlignment.CENTRE);  //垂直居中  
  75.   
  76.             /* 
  77.              * 这个是单元格内容居中显示 
  78.              * 还有很多很多样式 
  79.              */  
  80.             wcf.setAlignment(Alignment.CENTRE);  
  81.   
  82.             //判断一下表头数组是否有数据  
  83.             if (columns != null && columns.size() > 0) {  
  84.   
  85.                 //循环写入表头  
  86.                 for (int i = 0; i < columns.size(); i++) {  
  87.   
  88.                     /* 
  89.                      * 添加单元格(Cell)内容addCell() 
  90.                      * 添加Label对象Label() 
  91.                      * 数据的类型有很多种、在这里你需要什么类型就导入什么类型 
  92.                      * 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label 
  93.                      * Label(i, 0, columns[i], wcf) 
  94.                      * 其中i为列、0为行、columns[i]为数据、wcf为样式 
  95.                      * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中 
  96.                      */  
  97.                     ws.addCell(new Label(i, 0, columns.get(i), wcf));  
  98.                 }  
  99.   
  100.                 //判断表中是否有数据  
  101.                 if (objData != null && objData.size() > 0) {  
  102.                     //循环写入表中数据  
  103.                     for (int i = 0; i < objData.size(); i++) {  
  104.   
  105.                         //转换成map集合{activyName:测试功能,count:2}  
  106.                         Map<String, Object> map = (Map<String, Object>)objData.get(i);  
  107.   
  108.                         //循环输出map中的子集:既列值  
  109.                         int j=0;  
  110.                         for(Object o:map.keySet()){  
  111.                             //ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)  
  112.                             ws.addCell(new Label(j,i+1,String.valueOf(map.get(o))));  
  113.                             j++;  
  114.                         }  
  115.                     }  
  116.                 }else{  
  117.                     flag = -1;  
  118.                 }  
  119.   
  120.                 //写入Exel工作表  
  121.                 wwb.write();  
  122.   
  123.                 //关闭Excel工作薄对象   
  124.                 wwb.close();  
  125.                   
  126.                 //关闭流  
  127.                 os.flush();  
  128.                 os.close();  
  129.                   
  130.                 os =null;  
  131.             }  
  132.         }catch (IllegalStateException e) {  
  133.             System.err.println(e.getMessage());  
  134.         }  
  135.         catch (Exception ex) {  
  136.             flag = 0;  
  137.             ex.printStackTrace();  
  138.         }  
  139.   
  140.         return flag;  
  141.     }  
  142.   
  143.   
  144.     /** 
  145.      * 下载excel 
  146.      * @author  
  147.      * @param response 
  148.      * @param filename 文件名 ,如:20110808.xls 
  149.      * @param listData 数据源 
  150.      * @param sheetName 表头名称 
  151.      * @param columns 列名称集合,如:{物品名称,数量,单价} 
  152.      */  
  153.     public static void exportexcle(HttpServletResponse response,String filename,List<Map<String, Object>> listData,String sheetName,List<String> columns)  
  154.     {  
  155.         //调用上面的方法、生成Excel文件  
  156.         response.setContentType("application/vnd.ms-excel");  
  157.         //response.setHeader("Content-Disposition", "attachment;filename="+filename);  
  158.         try {  
  159.             response.setHeader("Content-Disposition""attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1") + ".xls");  
  160.   
  161.             exportToExcel(response, listData, sheetName, columns);  
  162.         } catch (UnsupportedEncodingException e) {  
  163.             e.printStackTrace();  
  164.         }   
  165.   
  166.   
  167.     }  
  168. }  

调用的时候:

[java]  view plain  copy
 print ?
  1. jxlUtils.exportexcle(response, filename, listData, sheetName, columns);  



特别说明:

response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "ISO8859-1") + ".xls");


之前没有在后面加“.xls”的时候,在ie下导出后缀丢失。


目前只能导出xls,不能导出xlsx格式!偷笑



简单,明了。


你可能感兴趣的:(java jxl导出excel小结)