java中使用poi導出excel表格數據而且能夠手動修改導出路徑

  在咱們開發項目中,不少時候會提出這樣的需求:將前端的某某數據以excel表格導出,今天就給你們寫一個簡單的模板。前端

  這裏咱們選擇使用poi導出excel:java

  第一步:導入須要的jar包到 lib 文件夾下正則表達式

  

   jar包下載路徑:http://download.csdn.net/download/pumpkin09/7077011spring

  第二步:添加poi導出工具類apache

    

  1 package com.yjd.admin.util;
  2 
  3 import java.io.IOException;
  4 import java.io.OutputStream;
  5 import java.lang.reflect.Field;
  6 import java.lang.reflect.InvocationTargetException;
  7 import java.lang.reflect.Method;
  8 import java.text.SimpleDateFormat;
  9 import java.util.Collection;
 10 import java.util.Date;
 11 import java.util.Iterator;
 12 import java.util.regex.Matcher;
 13 import java.util.regex.Pattern;
 14 
 15 
 16 import org.apache.poi.hssf.usermodel.HSSFCell;
 17 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
 18 import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
 19 import org.apache.poi.hssf.usermodel.HSSFComment;
 20 import org.apache.poi.hssf.usermodel.HSSFFont;
 21 import org.apache.poi.hssf.usermodel.HSSFPatriarch;
 22 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
 23 import org.apache.poi.hssf.usermodel.HSSFRow;
 24 import org.apache.poi.hssf.usermodel.HSSFSheet;
 25 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 26 import org.apache.poi.hssf.util.HSSFColor;
 27 
 28 /**
 29  * 利用開源組件POI3.0.2動態導出EXCEL文檔 轉載時請保留如下信息,註明出處!
 30  * 
 31  * @author leno
 32  * @version v1.0
 33  * @param <T>
 34  *            應用泛型,表明任意一個符合javabean風格的類
 35  *            注意這裏爲了簡單起見,boolean型的屬性xxx的get器方式爲getXxx(),而不是isXxx()
 36  *            byte[]表jpg格式的圖片數據
 37  */
 38 public class ExportExcel<T> {
 39     public void exportExcel(Collection<T> dataset, OutputStream out) {
 40         exportExcel("測試POI導出EXCEL文檔", null, dataset, out, "yyyy-MM-dd");
 41     }
 42 
 43     public void exportExcel(String[] headers, Collection<T> dataset,
 44             OutputStream out) {
 45         exportExcel("測試POI導出EXCEL文檔", headers, dataset, out, "yyyy-MM-dd");
 46     }
 47 
 48     public void exportExcel(String[] headers, Collection<T> dataset,
 49             OutputStream out, String pattern) {
 50         exportExcel("測試POI導出EXCEL文檔", headers, dataset, out, pattern);
 51     }
 52 
 53     /**
 54      * 這是一個通用的方法,利用了JAVA的反射機制,能夠將放置在JAVA集合中而且符號必定條件的數據以EXCEL 的形式輸出到指定IO設備上
 55      * 
 56      * @param title
 57      *            表格標題名
 58      * @param headers
 59      *            表格屬性列名數組
 60      * @param dataset
 61      *            須要顯示的數據集合,集合中必定要放置符合javabean風格的類的對象。此方法支持的
 62      *            javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)
 63      * @param out
 64      *            與輸出設備關聯的流對象,能夠將EXCEL文檔導出到本地文件或者網絡中
 65      * @param pattern
 66      *            若是有時間數據,設定輸出格式。默認爲"yyy-MM-dd"
 67      */
 68     @SuppressWarnings("unchecked")
 69     public void exportExcel(String title, String[] headers,
 70             Collection<T> dataset, OutputStream out, String pattern) {
 71         // 聲明一個工做薄
 72         HSSFWorkbook workbook = new HSSFWorkbook();
 73         // 生成一個表格
 74         HSSFSheet sheet = workbook.createSheet(title);
 75         // 設置表格默認列寬度爲15個字節
 76         sheet.setDefaultColumnWidth((short) 15);
 77         // 生成一個樣式
 78         HSSFCellStyle style = workbook.createCellStyle();
 79         // 設置這些樣式
 80         style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
 81         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
 82         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
 83         style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
 84         style.setBorderRight(HSSFCellStyle.BORDER_THIN);
 85         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
 86         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
 87         // 生成一個字體
 88         HSSFFont font = workbook.createFont();
 89         font.setColor(HSSFColor.VIOLET.index);
 90         font.setFontHeightInPoints((short) 12);
 91         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
 92         // 把字體應用到當前的樣式
 93         style.setFont(font);
 94         // 生成並設置另外一個樣式
 95         HSSFCellStyle style2 = workbook.createCellStyle();
 96         style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
 97         style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
 98         style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
 99         style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
100         style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
101         style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
102         style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
103         style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
104         // 生成另外一個字體
105         HSSFFont font2 = workbook.createFont();
106         font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
107         // 把字體應用到當前的樣式
108         style2.setFont(font2);
109         // 聲明一個畫圖的頂級管理器
110         HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
111         // 定義註釋的大小和位置,詳見文檔
112         HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
113                 0, 0, 0, (short) 4, 2, (short) 6, 5));
114         // 設置註釋內容
115         comment.setString(new HSSFRichTextString("能夠在POI中添加註釋!"));
116         // 設置註釋做者,當鼠標移動到單元格上是能夠在狀態欄中看到該內容.
117         comment.setAuthor("leno");
118         // 產生表格標題行
119         HSSFRow row = sheet.createRow(0);
120         for (short i = 0; i < headers.length; i++) {
121             HSSFCell cell = row.createCell(i);
122             cell.setCellStyle(style);
123             HSSFRichTextString text = new HSSFRichTextString(headers[i]);
124             cell.setCellValue(text);
125         }
126         // 遍歷集合數據,產生數據行
127         Iterator<T> it = dataset.iterator();
128         int index = 0;
129         while (it.hasNext()) {
130             index++;
131             row = sheet.createRow(index);
132             T t = (T) it.next();
133             // 利用反射,根據javabean屬性的前後順序,動態調用getXxx()方法獲得屬性值
134             Field[] fields = t.getClass().getDeclaredFields();
135             for (short i = 0; i < fields.length; i++) {
136                 HSSFCell cell = row.createCell(i);
137                 cell.setCellStyle(style2);
138                 Field field = fields[i];
139                 String fieldName = field.getName();
140                 String getMethodName = "get"
141                         + fieldName.substring(0, 1).toUpperCase()
142                         + fieldName.substring(1);
143                 try {
144                     Class tCls = t.getClass();
145                     Method getMethod = tCls.getMethod(getMethodName,
146                             new Class[] {});
147                     Object value = getMethod.invoke(t, new Object[] {});
148                     // 判斷值的類型後進行強制類型轉換
149                     String textValue = null;
150                     // if (value instanceof Integer) {
151                     // int intValue = (Integer) value;
152                     // cell.setCellValue(intValue);
153                     // } else if (value instanceof Float) {
154                     // float fValue = (Float) value;
155                     // textValue = new HSSFRichTextString(
156                     // String.valueOf(fValue));
157                     // cell.setCellValue(textValue);
158                     // } else if (value instanceof Double) {
159                     // double dValue = (Double) value;
160                     // textValue = new HSSFRichTextString(
161                     // String.valueOf(dValue));
162                     // cell.setCellValue(textValue);
163                     // } else if (value instanceof Long) {
164                     // long longValue = (Long) value;
165                     // cell.setCellValue(longValue);
166                     // }
167                     if (value instanceof Boolean) {
168                         boolean bValue = (Boolean) value;
169                         textValue = "男";
170                         if (!bValue) {
171                             textValue = "女";
172                         }
173                     } else if (value instanceof Date) {
174                         Date date = (Date) value;
175                         SimpleDateFormat sdf = new SimpleDateFormat(pattern);
176                         textValue = sdf.format(date);
177                     } else if (value instanceof byte[]) {
178                         // 有圖片時,設置行高爲60px;
179                         row.setHeightInPoints(60);
180                         // 設置圖片所在列寬度爲80px,注意這裏單位的一個換算
181                         sheet.setColumnWidth(i, (short) (35.7 * 80));
182                         // sheet.autoSizeColumn(i);
183                         byte[] bsValue = (byte[]) value;
184                         HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
185                                 1023, 255, (short) 6, index, (short) 6, index);
186                         anchor.setAnchorType(2);
187                         patriarch.createPicture(anchor, workbook.addPicture(
188                                 bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
189                     } else {
190                         // 其它數據類型都看成字符串簡單處理
191                         textValue = value.toString();
192                     }
193                     // 若是不是圖片數據,就利用正則表達式判斷textValue是否所有由數字組成
194                     if (textValue != null) {
195                         Pattern p = Pattern.compile("^//d+(//.//d+)?$");
196                         Matcher matcher = p.matcher(textValue);
197                         if (matcher.matches()) {
198                             // 是數字看成double處理
199                             cell.setCellValue(Double.parseDouble(textValue));
200                         } else {
201                             HSSFRichTextString richString = new HSSFRichTextString(
202                                     textValue);
203                             HSSFFont font3 = workbook.createFont();
204                             font3.setColor(HSSFColor.BLUE.index);
205                             richString.applyFont(font3);
206                             cell.setCellValue(richString);
207                         }
208                     }
209                 } catch (SecurityException e) {
210                     e.printStackTrace();
211                 } catch (NoSuchMethodException e) {
212                     e.printStackTrace();
213                 } catch (IllegalArgumentException e) {
214                     e.printStackTrace();
215                 } catch (IllegalAccessException e) {
216                     e.printStackTrace();
217                 } catch (InvocationTargetException e) {
218                     e.printStackTrace();
219                 } finally {
220                     // 清理資源
221                 }
222             }
223         }
224         try {
225             workbook.write(out);
226         } catch (IOException e) {
227             e.printStackTrace();
228         }
229     }
230 
231 }

  第三步:因爲我使用的的spring-mvc框架,因此在Controller調用上面的工具類ExportExcel數組

 

 1 package com.yjd.admin.vo;
 2 
 3 import java.util.Date;
 4 
 5 public class P2pLoanPlanVo {
 6          private Date repayDate;
 7         private double repayAmount;
 8         private Integer repayDays;
 9         private Integer repayYqDays;
10         private Double lateAmount;
11         private String isPosPaid;
12         private String statusName;
13         private String isSysPay;
14         public Date getRepayDate() {
15             return repayDate;
16         }
17         public void setRepayDate(Date repayDate) {
18             this.repayDate = repayDate;
19         }
20         public double getRepayAmount() {
21             return repayAmount;
22         }
23         public void setRepayAmount(double repayAmount) {
24             this.repayAmount = repayAmount;
25         }
26         public Integer getRepayDays() {
27             return repayDays;
28         }
29         public void setRepayDays(Integer repayDays) {
30             this.repayDays = repayDays;
31         }
32         public Integer getRepayYqDays() {
33             return repayYqDays;
34         }
35         public void setRepayYqDays(Integer repayYqDays) {
36             this.repayYqDays = repayYqDays;
37         }
38         public Double getLateAmount() {
39             return lateAmount;
40         }
41         public void setLateAmount(Double lateAmount) {
42             this.lateAmount = lateAmount;
43         }
44         public String getIsPosPaid() {
45             return isPosPaid;
46         }
47         public void setIsPosPaid(String isPosPaid) {
48             this.isPosPaid = isPosPaid;
49         }
50         public String getStatusName() {
51             return statusName;
52         }
53         public void setStatusName(String statusName) {
54             this.statusName = statusName;
55         }
56         public String getIsSysPay() {
57             return isSysPay;
58         }
59         public void setIsSysPay(String isSysPay) {
60             this.isSysPay = isSysPay;
61         }
62         
63         
64         
65         
66         
67 }

 

 1 /**
 2      * 導出excel數據
 3      * @param id
 4      * @param m
 5      * @return
 6      */
 7     @RequestMapping("/exportExcel")
 8     public void exportExcel(@RequestParam("id") Integer id, Model m,HttpServletRequest req, HttpServletResponse resp) {
 9         try {
10             
11             ExportExcel<P2pLoanPlanVo> ex = new ExportExcel<P2pLoanPlanVo>();
12             String[] headers = {"最遲還款日", "還款金額","剩餘幾天","逾期幾天", "罰息","是否墊付","狀態","是否發放收益"};
13             List<P2pLoanPlanVo> dataset = new ArrayList<P2pLoanPlanVo>();
14             List<P2pLoanPlan> plans = this.planService.getListByLoan(id);
15             for (int i = 0; i < plans.size(); i++) {
16                 P2pLoanPlanVo p2pLoanPlanVo = new P2pLoanPlanVo();
17                 
18                 p2pLoanPlanVo.setRepayDate(plans.get(i).getRepayDate());
19                 p2pLoanPlanVo.setRepayAmount(plans.get(i).getRepayAmount());
20                 
21                 if(plans.get(i).getRepayDays() >= 0 && plans.get(i).getStatus() == 0){
22                     p2pLoanPlanVo.setRepayDays(plans.get(i).getRepayDays());
23                 }else{
24                     p2pLoanPlanVo.setRepayDays(0);
25                 }
26                 if(plans.get(i).getRepayDays() < 0 && plans.get(i).getStatus() == 0){
27                     p2pLoanPlanVo.setRepayYqDays(-plans.get(i).getRepayDays());
28                 }else{
29                     p2pLoanPlanVo.setRepayYqDays(0);
30                 }
31                 
32                 p2pLoanPlanVo.setLateAmount(plans.get(i).getLateAmount());
33                 String IsPosPaid = "";
34                 if(plans.get(i).getIsPosPaid()==true){
35                     IsPosPaid = "已墊付";
36                 }else{
37                     IsPosPaid = "未墊付";
38                 }
39                 p2pLoanPlanVo.setIsPosPaid(IsPosPaid);
40                 p2pLoanPlanVo.setStatusName(plans.get(i).getStatusName());
41                 String IsSysPay ="";
42                 if(plans.get(i).getIsSysPay() == true){
43                     IsSysPay = "已發放收益";
44                 }else{
45                     IsSysPay = "未發放收益";
46                 }
47                 p2pLoanPlanVo.setIsSysPay(IsSysPay);
48                 
49                 dataset.add(p2pLoanPlanVo);
50                 
51             }
52             try {
53                 req.setCharacterEncoding("UTF-8");
54                 resp.setCharacterEncoding("UTF-8");
55                 resp.setContentType("application/x-download");
56                 
57                 String filedisplay = "還款計劃.xls";
58                 //防止文件名含有中文亂碼
59                 filedisplay = new String( filedisplay.getBytes("gb2312"), "ISO8859-1" );
60                 resp.setHeader("Content-Disposition", "attachment;filename="+ filedisplay);
61                 
62                 OutputStream out = resp.getOutputStream();
63                 ex.exportExcel(headers, dataset, out);
64                 out.close();
65             } catch (FileNotFoundException e) {
66                 e.printStackTrace();
67             } catch (IOException e) {
68                 e.printStackTrace();
69             }
70         } catch (Exception e) {
71             Exceptions.getExceptionMsg(e, logger);
72         }
73     }

 

 

注意:此處ExportExcel<T>工具類中的泛型對應P2pLoanPlanVo這個類,P2pLoanPlanVo類中的屬性要對應exportExcel()接口中headers中每一個值而且都要有值,不容許爲空,如有不足的地方還望各位大神多多指點!spring-mvc

未經博主容許,請勿轉載網絡

相關文章
相關標籤/搜索