java excel导出

  1 /**

  2  * 利用开源组件POI3.10动态导出EXCEL文档

  3  * 

  4  * @author leno

  5  * @version v1.0

  6  * @param <T>

  7  *            应用泛型,代表任意一个符合javabean风格的类

  8  *            注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()

  9  *            byte[]表jpg格式的图片数据

 10  */

 11 public class ExportExcel<T> {

 12     public void exportExcel(Collection<T> dataset, OutputStream out) {

 13         exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");

 14     }

 15 

 16     public void exportExcel(String[] headers, Collection<T> dataset,

 17             OutputStream out) {

 18         exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");

 19     }

 20 

 21     public void exportExcel(String[] headers, Collection<T> dataset,

 22             OutputStream out, String pattern) {

 23         exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);

 24     }

 25 

 26     /**

 27      * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符合一定条件的数据以EXCEL 的形式输出到指定IO设备上

 28      * 

 29      * @param title

 30      *            表格标题名

 31      * @param headers

 32      *            表格属性列名数组

 33      * @param dataset

 34      *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的

 35      *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)

 36      * @param out

 37      *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中

 38      * @param pattern

 39      *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"

 40      */

 41     @SuppressWarnings("unchecked")

 42     public void exportExcel(String title, String[] headers,

 43             Collection<T> dataset, OutputStream out, String pattern) {

 44         // 声明一个工作薄

 45         HSSFWorkbook workbook = new HSSFWorkbook();

 46         // 生成一个表格

 47         HSSFSheet sheet = workbook.createSheet(title);

 48         // 设置表格默认列宽度为15个字节

 49         sheet.setDefaultColumnWidth((short) 15);

 50         // 生成一个样式

 51         HSSFCellStyle style = workbook.createCellStyle();

 52         // 设置这些样式

 53         style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);

 54         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

 55         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);

 56         style.setBorderLeft(HSSFCellStyle.BORDER_THIN);

 57         style.setBorderRight(HSSFCellStyle.BORDER_THIN);

 58         style.setBorderTop(HSSFCellStyle.BORDER_THIN);

 59         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

 60         // 生成一个字体

 61         HSSFFont font = workbook.createFont();

 62         font.setColor(HSSFColor.VIOLET.index);

 63         font.setFontHeightInPoints((short) 12);

 64         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

 65         // 把字体应用到当前的样式

 66         style.setFont(font);

 67         // 生成并设置另一个样式

 68         HSSFCellStyle style2 = workbook.createCellStyle();

 69         style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);

 70         style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

 71         style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);

 72         style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);

 73         style2.setBorderRight(HSSFCellStyle.BORDER_THIN);

 74         style2.setBorderTop(HSSFCellStyle.BORDER_THIN);

 75         style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);

 76         style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

 77         // 生成另一个字体

 78         HSSFFont font2 = workbook.createFont();

 79         font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);

 80         // 把字体应用到当前的样式

 81         style2.setFont(font2);

 82 

 83         // 声明一个画图的顶级管理器

 84         HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

 85         // 定义注释的大小和位置,详见文档

 86         HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,

 87                 0, 0, 0, (short) 4, 2, (short) 6, 5));

 88         // 设置注释内容

 89         comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));

 90         // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.

 91         comment.setAuthor("leno");

 92 

 93         // 产生表格标题行

 94         HSSFRow row = sheet.createRow(0);

 95         for (short i = 0; i < headers.length; i++) {

 96             HSSFCell cell = row.createCell(i);

 97             cell.setCellStyle(style);

 98             HSSFRichTextString text = new HSSFRichTextString(headers[i]);

 99             cell.setCellValue(text);

100         }

101 

102         // 遍历集合数据,产生数据行

103         Iterator<T> it = dataset.iterator();

104         int index = 0;

105         while (it.hasNext()) {

106             index++;

107             row = sheet.createRow(index);

108             T t = (T) it.next();

109             // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值

110             Field[] fields = t.getClass().getDeclaredFields();

111             for (short i = 0; i < fields.length; i++) {

112                 HSSFCell cell = row.createCell(i);

113                 cell.setCellStyle(style2);

114                 Field field = fields[i];

115                 String fieldName = field.getName();

116                 String getMethodName = "get"

117                         + fieldName.substring(0, 1).toUpperCase()

118                         + fieldName.substring(1);

119                 try {

120                     Class tCls = t.getClass();

121                     Method getMethod = tCls.getMethod(getMethodName,

122                             new Class[] {});

123                     Object value = getMethod.invoke(t, new Object[] {});

124                     // 判断值的类型后进行强制类型转换

125                     String textValue = null;

126                     // if (value instanceof Integer) {

127                     // int intValue = (Integer) value;

128                     // cell.setCellValue(intValue);

129                     // } else if (value instanceof Float) {

130                     // float fValue = (Float) value;

131                     // textValue = new HSSFRichTextString(

132                     // String.valueOf(fValue));

133                     // cell.setCellValue(textValue);

134                     // } else if (value instanceof Double) {

135                     // double dValue = (Double) value;

136                     // textValue = new HSSFRichTextString(

137                     // String.valueOf(dValue));

138                     // cell.setCellValue(textValue);

139                     // } else if (value instanceof Long) {

140                     // long longValue = (Long) value;

141                     // cell.setCellValue(longValue);

142                     // }

143                     if (value instanceof Boolean) {

144                         boolean bValue = (Boolean) value;

145                         textValue = "男";

146                         if (!bValue) {

147                             textValue = "女";

148                         }

149                     } else if (value instanceof Date) {

150                         Date date = (Date) value;

151                         SimpleDateFormat sdf = new SimpleDateFormat(pattern);

152                         textValue = sdf.format(date);

153                     } else if (value instanceof byte[]) {

154                         // 有图片时,设置行高为60px;

155                         row.setHeightInPoints(60);

156                         // 设置图片所在列宽度为80px,注意这里单位的一个换算

157                         sheet.setColumnWidth(i, (short) (35.7 * 80));

158                         // sheet.autoSizeColumn(i);

159                         byte[] bsValue = (byte[]) value;

160                         HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,

161                                 1023, 255, (short) 6, index, (short) 6, index);

162                         anchor.setAnchorType(2);

163                         patriarch.createPicture(anchor, workbook.addPicture(

164                                 bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));

165                     } else {

166                         // 其它数据类型都当作字符串简单处理

167                         textValue = value.toString();

168                     }

169                     // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成

170                     if (textValue != null) {

171                         Pattern p = Pattern.compile("^//d+(//.//d+)?$");

172                         Matcher matcher = p.matcher(textValue);

173                         if (matcher.matches()) {

174                             // 是数字当作double处理

175                             cell.setCellValue(Double.parseDouble(textValue));

176                         } else {

177                             HSSFRichTextString richString = new HSSFRichTextString(

178                                     textValue);

179                             HSSFFont font3 = workbook.createFont();

180                             font3.setColor(HSSFColor.BLUE.index);

181                             richString.applyFont(font3);

182                             cell.setCellValue(richString);

183                         }

184                     }

185                 } catch (SecurityException e) {

186                     e.printStackTrace();

187                 } catch (NoSuchMethodException e) {

188                     e.printStackTrace();

189                 } catch (IllegalArgumentException e) {

190                     e.printStackTrace();

191                 } catch (IllegalAccessException e) {

192                     e.printStackTrace();

193                 } catch (InvocationTargetException e) {

194                     e.printStackTrace();

195                 } finally {

196                     // 清理资源

197                 }

198             }

199         }

200         try {

201             workbook.write(out);

202         } catch (IOException e) {

203             e.printStackTrace();

204         }

205     }

206 /*

207     public static void main(String[] args) {

208         class testUser {

209             String name;

210             String id;

211             String remark;

212 

213             public String getName() {

214                 return name;

215             }

216 

217             public void setName(String name) {

218                 this.name = name;

219             }

220 

221             public String getId() {

222                 return id;

223             }

224 

225             public void setId(String id) {

226                 this.id = id;

227             }

228 

229             public String getRemark() {

230                 return remark;

231             }

232 

233             public void setRemark(String remark) {

234                 this.remark = remark;

235             }

236         }

237         ExportExcel<testUser> ex = new ExportExcel<testUser>();

238         String[] headers = { "id", "详细", "备注" };

239         List<testUser> dataset = new ArrayList<testUser>();

240         testUser t = new testUser();

241         t.setId("id");

242         t.setName("name");

243         t.setRemark("remark");

244         dataset.add(t);

245         testUser t1 = new testUser();

246         t1.setId("id2");

247         t1.setName("name2");

248         t1.setRemark("remark2");

249         dataset.add(t1);

250         try {

251 

252             OutputStream out = new FileOutputStream("D://d.xls");

253             ex.exportExcel("测试POI导出EXCEL文档", headers, dataset, out, null);

254             out.close();

255             JOptionPane.showMessageDialog(null, "导出成功!");

256             System.out.println("excel导出成功!");

257         } catch (FileNotFoundException e) {

258             e.printStackTrace();

259         } catch (IOException e) {

260             e.printStackTrace();

261         }

262     }*/

263 }

POI3.10jar包下载
实现方法参考他人博客,已无法找到出处!仅供大家参考

 

你可能感兴趣的:(Java excel)