Java-POI 4.1.2 表格导入导出2020.2.17官网发布的库
Java-POI表格导入导出
Java-POI表格导入导出,给予POI4.1.2,poi-bin-4.1.2-20200217 版本,2020.2.17官网发布的库
.
1 一、读取表格
2
3
4
5 <%@ page import="codedna616.demo.commom.POIExcelReader" %>
6 <%@ page import="codedna616.demo.commom.Student" %>
7 <%@ page import="java.util.List" %>
8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
9 <html>
10 <head>
11 <title>读取表格数据</title>
12
13 <style>
14 table td{border:1px solid #F00}
15 </style>
16 </head>
17 <body>
18 <%
19 //"想办法找到要提供下载的文件的物理路径+文件名";
20 String localFilePath = request.getServletContext().getRealPath("") + "\\本地导出的文件.xls";
21 %>
22 <h3>读取表格实例 <%=localFilePath%></h3>
23
24
25 <%
26 // 读取Excel文件内容
27 List<Student> readResult = POIExcelReader.readExcel(localFilePath);
28 out.println("<table style=\"border:1px\">");
29 out.println("<tr><td>编号</td><td>姓名</td><td>学号</td> <br>");
30 for (Student item : readResult) {
31 out.println("<tr><td>"+item.getId() + "</td><td>" + item.getName() + "</td><td>" + item.getStudentNo() + "</td></tr>"+"");
32 }
33 out.println("</table>");
34 %>
35 </body>
36 </html>
37
38
39
40
41 二、导出本地表格
42
43 <%@ page import="java.io.FileInputStream" %>
44 <%@ page import="java.net.URLEncoder" %>
45 <%@ page import="codedna616.demo.commom.Utils" %>
46 <%@ page import="codedna616.demo.commom.Student" %>
47 <%@ page import="codedna616.demo.commom.PoiExportExcelUtil" %>
48 <%@ page import="java.io.FileOutputStream" %>
49 <%@ page import="java.util.List" %>
50 <%@ page import="java.util.ArrayList" %><%--
51 Created by IntelliJ IDEA.
52 User: Administrator
53 Date: 2020/7/16
54 Time: 9:27
55 To change this template use File | Settings | File Templates.
56 --%>
57 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
58 <html>
59 <head>
60 <title>下载表格</title>
61 </head>
62 <body>
63 <%
64 if (request.getParameter("type") == "2003") {
65
66 } else {
67
68 }
69
70 String[] columnNames = {"ID", "姓名", "学号"};
71
72 List<Student> list = new ArrayList<>();
73 for (int i = 1; i <= 100; i++) {
74 Student model = new Student();
75 model.Id = Integer.toString(i);
76 model.Name = "学生" + i;
77 model.StudentNo = "序号000" + i;
78 list.add(model);
79 }
80
81 //方式1:直接导出表格测试【保存到本地】
82 PoiExportExcelUtil<Student> util = new PoiExportExcelUtil<Student>();
83
84 String localFilePath = request.getServletContext().getRealPath("") + "\\本地导出的文件.xls";
85 util.exportExcel("用户导出", columnNames, list, new FileOutputStream(localFilePath), PoiExportExcelUtil.EXCEL_FILE_2003);
86
87 out.print("写入完成"+localFilePath);
88 %>
89 </body>
90 </html>
91
92
93
94
95
96
97
98 三、下载表格
99
100
101
102 <%@ page import="java.net.URLEncoder" %>
103 <%@ page import="codedna616.demo.commom.Utils" %>
104 <%@ page import="java.io.FileInputStream" %>
105
106 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
107 <html>
108 <head>
109 <title>下载web表格</title>
110 </head>
111 <body>
112 <%
113
114 //方式2:通过流下载文件(适合web下载)
115 //关于文件下载时采用文件流输出的方式处理:
116 //加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
117 response.reset();//可以加也可以不加
118 response.setContentType("application/x-download");
119 //application.getRealPath("/main/mvplayer/CapSetup.msi");获取的物理路径
120
121 //"想办法找到要提供下载的文件的物理路径+文件名";
122 String localFilePath=request.getServletContext().getRealPath("")+"\\本地导出的文件.xls";
123
124 String filedisplay ="web下载的文件"+ Utils.getDateTimeNow()+".xls" ;//"给用户提供的下载文件名";
125 filedisplay = URLEncoder.encode(filedisplay,"UTF-8");
126 response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
127
128 java.io.OutputStream outp = null;
129 java.io.FileInputStream in = null;
130 try {
131 outp = response.getOutputStream();
132 in = new FileInputStream(localFilePath);
133 byte[] b = new byte[1024];
134 int i = 0;
135 while((i = in.read(b)) > 0) {
136 outp.write(b, 0, i);
137 }
138 outp.flush();
139 //要加以下两句话,否则会报错
140 //java.lang.IllegalStateException: getOutputStream() has already been called for //this response
141
142 out.clear();
143 out = pageContext.pushBody();
144
145
146 } catch(Exception e){
147 System.out.println("Error!");
148 e.printStackTrace();
149 }finally{
150 if(in != null){
151 in.close();
152 in = null;
153 }
154 //这里不能关闭
155 //if(outp != null) {
156 //outp.close();
157 //outp = null;
158 //}
159 }
160
161 %>
162 </body>
163 </html>
164
165
166 核心方法如下,建议下载完整代码查看
167
168
169
170 ==》》》读取表格
171
172 POIExcelReader.java
173
174
175
176 package codedna616.demo.commom;
177
178 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
179 import org.apache.poi.ss.usermodel.Cell;
180 import org.apache.poi.ss.usermodel.Row;
181 import org.apache.poi.ss.usermodel.Sheet;
182 import org.apache.poi.ss.usermodel.Workbook;
183 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
184 //import org.springframework.web.multipart.MultipartFile;
185
186 import java.io.File;
187 import java.io.FileInputStream;
188 import java.io.IOException;
189 import java.io.InputStream;
190 import java.text.DecimalFormat;
191 import java.util.*;
192 import java.util.logging.Logger;
193
194 /**
195 * Author: Dreamer-1
196 * Date: 2019-03-01
197 * Time: 10:21
198 * Description: 读取Excel内容
199 */
200 public class POIExcelReader {
201
202 private static Logger logger = Logger.getLogger(POIExcelReader.class.getName()); // 日志打印类
203
204 private static final String XLS = "xls";
205 private static final String XLSX = "xlsx";
206
207 /**
208 * 根据文件后缀名类型获取对应的工作簿对象
209 * @param inputStream 读取文件的输入流
210 * @param fileType 文件后缀名类型(xls或xlsx)
211 * @return 包含文件数据的工作簿对象
212 * @throws IOException
213 */
214 public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
215 Workbook workbook = null;
216 if (fileType.equalsIgnoreCase(XLS)) {
217 workbook = new HSSFWorkbook(inputStream);
218 } else if (fileType.equalsIgnoreCase(XLSX)) {
219 workbook = new XSSFWorkbook(inputStream);
220 }
221 return workbook;
222 }
223
224 /**
225 * 读取Excel文件内容
226 * @param fileName 要读取的Excel文件所在路径
227 * @return 读取结果列表,读取失败时返回null
228 */
229 public static List<Student> readExcel(String fileName) {
230
231 Workbook workbook = null;
232 FileInputStream inputStream = null;
233
234 try {
235 // 获取Excel后缀名
236 String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
237 // 获取Excel文件
238 File excelFile = new File(fileName);
239 if (!excelFile.exists()) {
240 logger.warning("指定的Excel文件不存在!");
241 return null;
242 }
243
244 // 获取Excel工作簿
245 inputStream = new FileInputStream(excelFile);
246 workbook = getWorkbook(inputStream, fileType);
247
248 // 读取excel中的数据
249 List<Student> resultDataList = parseExcel(workbook);
250
251 return resultDataList;
252 } catch (Exception e) {
253 logger.warning("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
254 return null;
255 } finally {
256 try {
257 if (null != workbook) {
258 workbook.close();
259 }
260 if (null != inputStream) {
261 inputStream.close();
262 }
263 } catch (Exception e) {
264 logger.warning("关闭数据流出错!错误信息:" + e.getMessage());
265 return null;
266 }
267 }
268 }
269
270 /**
271 * 读取Excel文件内容
272 * @param file 上传的Excel文件
273 * @return 读取结果列表,读取失败时返回null
274 */
275 // public static List<Student> readExcel(MultipartFile file) {
276 //
277 // Workbook workbook = null;
278 //
279 // try {
280 // // 获取Excel后缀名
281 // String fileName = file.getOriginalFilename();
282 // if (fileName == null || fileName.isEmpty() || fileName.lastIndexOf(".") < 0) {
283 // logger.warning("解析Excel失败,因为获取到的Excel文件名非法!");
284 // return null;
285 // }
286 // String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
287 //
288 // // 获取Excel工作簿
289 // workbook = getWorkbook(file.getInputStream(), fileType);
290 //
291 // // 读取excel中的数据
292 // List<Student> resultDataList = parseExcel(workbook);
293 //
294 // return resultDataList;
295 // } catch (Exception e) {
296 // logger.warning("解析Excel失败,文件名:" + file.getOriginalFilename() + " 错误信息:" + e.getMessage());
297 // return null;
298 // } finally {
299 // try {
300 // if (null != workbook) {
301 // workbook.close();
302 // }
303 // } catch (Exception e) {
304 // logger.warning("关闭数据流出错!错误信息:" + e.getMessage());
305 // return null;
306 // }
307 // }
308 // }
309
310
311 /**
312 * 解析Excel数据
313 * @param workbook Excel工作簿对象
314 * @return 解析结果
315 */
316 private static List<Student> parseExcel(Workbook workbook) {
317 List<Student> resultDataList = new ArrayList<>();
318 // 解析sheet
319 for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
320 Sheet sheet = workbook.getSheetAt(sheetNum);
321
322 // 校验sheet是否合法
323 if (sheet == null) {
324 continue;
325 }
326
327 // 获取第一行数据
328 int firstRowNum = sheet.getFirstRowNum();
329 Row firstRow = sheet.getRow(firstRowNum);
330 if (null == firstRow) {
331 logger.warning("解析Excel失败,在第一行没有读取到任何数据!");
332 }
333
334 // 解析每一行的数据,构造数据对象
335 int rowStart = firstRowNum + 1;
336 int rowEnd = sheet.getPhysicalNumberOfRows();
337 for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
338 Row row = sheet.getRow(rowNum);
339
340 if (null == row) {
341 continue;
342 }
343
344 Student resultData = convertRowToData(row);
345 if (null == resultData) {
346 logger.warning("第 " + row.getRowNum() + "行数据不合法,已忽略!");
347 continue;
348 }
349 resultDataList.add(resultData);
350 }
351 }
352
353 return resultDataList;
354 }
355
356 /**
357 * 将单元格内容转换为字符串
358 * @param cell
359 * @return
360 */
361 private static String convertCellValueToString(Cell cell) {
362 if(cell==null){
363 return null;
364 }
365 String returnValue = null;
366 switch (cell.getCellType()) {
367 case NUMERIC: //数字
368 Double doubleValue = cell.getNumericCellValue();
369
370 // 格式化科学计数法,取一位整数
371 DecimalFormat df = new DecimalFormat("0");
372 returnValue = df.format(doubleValue);
373 break;
374 case STRING: //字符串
375 returnValue = cell.getStringCellValue();
376 break;
377 case BOOLEAN: //布尔
378 Boolean booleanValue = cell.getBooleanCellValue();
379 returnValue = booleanValue.toString();
380 break;
381 case BLANK: // 空值
382 break;
383 case FORMULA: // 公式
384 returnValue = cell.getCellFormula();
385 break;
386 case ERROR: // 故障
387 break;
388 default:
389 break;
390 }
391 return returnValue;
392 }
393
394 /**
395 * 提取每一行中需要的数据,构造成为一个结果数据对象
396 *
397 * 当该行中有单元格的数据为空或不合法时,忽略该行的数据
398 *
399 * @param row 行数据
400 * @return 解析后的行数据对象,行数据错误时返回null
401 */
402 private static Student convertRowToData(Row row) {
403 Student resultData = new Student();
404
405 Cell cell;
406 int cellNum = 0;
407 // 获取第一列
408 cell = row.getCell(0);
409 String id = convertCellValueToString(cell);
410 resultData.setId(id);
411 // 第二列
412 cell = row.getCell(1);
413 String name = convertCellValueToString(cell);
414 resultData.setName(name);
415 // 第三列
416 cell = row.getCell(2);
417 String sutdnetNo = convertCellValueToString(cell);
418 resultData.setStudentNo(sutdnetNo);
419
420 return resultData;
421 }
422
423 }
424
425
426
427
428 ==》》》》导出表格
429
430 PoiExportExcelUtil.java文件
431 package codedna616.demo.commom;
432
433 import java.io.IOException;
434 import java.io.OutputStream;
435 import java.lang.reflect.Field;
436 import java.lang.reflect.InvocationTargetException;
437 import java.lang.reflect.Method;
438 import java.text.SimpleDateFormat;
439 import java.util.Collection;
440 import java.util.Date;
441 import java.util.Iterator;
442 import java.util.regex.Matcher;
443 import java.util.regex.Pattern;
444
445 //import org.apache.commons.lang3.StringUtils;
446 import org.apache.poi.hssf.usermodel.HSSFCell;
447 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
448 import org.apache.poi.hssf.usermodel.HSSFFont;
449 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
450 import org.apache.poi.hssf.usermodel.HSSFRow;
451 import org.apache.poi.hssf.usermodel.HSSFSheet;
452 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
453 import org.apache.poi.hssf.util.HSSFColor;
454 import org.apache.poi.xssf.usermodel.XSSFCell;
455 import org.apache.poi.xssf.usermodel.XSSFCellStyle;
456 import org.apache.poi.xssf.usermodel.XSSFColor;
457 import org.apache.poi.xssf.usermodel.XSSFFont;
458 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
459 import org.apache.poi.xssf.usermodel.XSSFRow;
460 import org.apache.poi.xssf.usermodel.XSSFSheet;
461 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
462
463
464 /**
465 * 导出Excel
466 *
467 * @param <T>
468 * @author
469 */
470 public class PoiExportExcelUtil<T> {
471
472 // 2007 版本以上 最大支持1048576行
473 public final static String EXCEl_FILE_2007 = "2007";
474 // 2003 版本 最大支持65536 行
475 public final static String EXCEL_FILE_2003 = "2003";
476
477 /**
478 * <p>
479 * 导出无头部标题行Excel <br>
480 * 时间格式默认:yyyy-MM-dd hh:mm:ss <br>
481 * </p>
482 *
483 * @param title 表格标题
484 * @param dataset 数据集合
485 * @param out 输出流
486 * @param version 2003 或者 2007,不传时默认生成2003版本
487 */
488 public void exportExcel(String title, Collection<T> dataset, OutputStream out, String version) {
489 if (Utils.isNullOrEmpty(version) || EXCEL_FILE_2003.equals(version.trim())) {
490 exportExcel2003(title, null, dataset, out, "yyyy-MM-dd HH:mm:ss");
491 } else {
492 exportExcel2007(title, null, dataset, out, "yyyy-MM-dd HH:mm:ss");
493 }
494 }
495
496 /**
497 * <p>
498 * 导出带有头部标题行的Excel <br>
499 * 时间格式默认:yyyy-MM-dd hh:mm:ss <br>
500 * </p>
501 *
502 * @param title 表格标题
503 * @param headers 头部标题集合
504 * @param dataset 数据集合
505 * @param out 输出流
506 * @param version 2003 或者 2007,不传时默认生成2003版本
507 */
508 public void exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out, String version) {
509 if (Utils.isNullOrEmpty(version) || EXCEL_FILE_2003.equals(version.trim())) {
510 exportExcel2003(title, headers, dataset, out, "yyyy-MM-dd HH:mm:ss");
511 } else {
512 exportExcel2007(title, headers, dataset, out, "yyyy-MM-dd HH:mm:ss");
513 }
514 }
515
516 /**
517 * <p>
518 * 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
519 * 此版本生成2007以上版本的文件 (文件后缀:xlsx)
520 * </p>
521 *
522 * @param title 表格标题名
523 * @param headers 表格头部标题集合
524 * @param dataset 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
525 * JavaBean属性的数据类型有基本数据类型及String,Date
526 * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
527 * @param pattern 如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
528 */
529 @SuppressWarnings({"unchecked", "rawtypes"})
530 public void exportExcel2007(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {
531 // 声明一个工作薄
532 XSSFWorkbook workbook = new XSSFWorkbook();
533 // 生成一个表格
534 XSSFSheet sheet = workbook.createSheet(title);
535 // 设置表格默认列宽度为15个字节
536 sheet.setDefaultColumnWidth(20);
537 // 生成一个样式
538 XSSFCellStyle style = workbook.createCellStyle();
539 // 设置这些样式
540 style.setFillForegroundColor(new XSSFColor(java.awt.Color.gray));
541 // style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
542 //
543 // style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
544 // style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
545 // style.setBorderRight(XSSFCellStyle.BORDER_THIN);
546 // style.setBorderTop(XSSFCellStyle.BORDER_THIN);
547 // style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
548 // 生成一个字体
549 XSSFFont font = workbook.createFont();
550 //font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
551 font.setFontName("宋体");
552 font.setColor(new XSSFColor(java.awt.Color.BLACK));
553 font.setFontHeightInPoints((short) 11);
554 // 把字体应用到当前的样式
555 style.setFont(font);
556 // 生成并设置另一个样式
557 XSSFCellStyle style2 = workbook.createCellStyle();
558 style2.setFillForegroundColor(new XSSFColor(java.awt.Color.WHITE));
559 // style2.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
560 // style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);
561 // style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);
562 // style2.setBorderRight(XSSFCellStyle.BORDER_THIN);
563 // style2.setBorderTop(XSSFCellStyle.BORDER_THIN);
564 // style2.setAlignment(XSSFCellStyle.ALIGN_CENTER);
565 // style2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
566 // 生成另一个字体
567 XSSFFont font2 = workbook.createFont();
568 //font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
569 // 把字体应用到当前的样式
570 style2.setFont(font2);
571
572 // 产生表格标题行
573 XSSFRow row = sheet.createRow(0);
574 XSSFCell cellHeader;
575 for (int i = 0; i < headers.length; i++) {
576 cellHeader = row.createCell(i);
577 cellHeader.setCellStyle(style);
578 cellHeader.setCellValue(new XSSFRichTextString(headers[i]));
579 }
580
581 // 遍历集合数据,产生数据行
582 Iterator<T> it = dataset.iterator();
583 int index = 0;
584 T t;
585 Field[] fields;
586 Field field;
587 XSSFRichTextString richString;
588 Pattern p = Pattern.compile("^//d+(//.//d+)?$");
589 Matcher matcher;
590 String fieldName;
591 String getMethodName;
592 XSSFCell cell;
593 Class tCls;
594 Method getMethod;
595 Object value;
596 String textValue;
597 SimpleDateFormat sdf = new SimpleDateFormat(pattern);
598 while (it.hasNext()) {
599 index++;
600 row = sheet.createRow(index);
601 t = (T) it.next();
602 // 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
603 fields = t.getClass().getDeclaredFields();
604 for (int i = 0; i < fields.length; i++) {
605 cell = row.createCell(i);
606 cell.setCellStyle(style2);
607 field = fields[i];
608 fieldName = field.getName();
609 getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()
610 + fieldName.substring(1);
611 try {
612 tCls = t.getClass();
613 getMethod = tCls.getMethod(getMethodName, new Class[]{});
614 value = getMethod.invoke(t, new Object[]{});
615 // 判断值的类型后进行强制类型转换
616 textValue = null;
617 if (value instanceof Integer) {
618 cell.setCellValue((Integer) value);
619 } else if (value instanceof Float) {
620 textValue = String.valueOf((Float) value);
621 cell.setCellValue(textValue);
622 } else if (value instanceof Double) {
623 textValue = String.valueOf((Double) value);
624 cell.setCellValue(textValue);
625 } else if (value instanceof Long) {
626 cell.setCellValue((Long) value);
627 }
628 if (value instanceof Boolean) {
629 textValue = "是";
630 if (!(Boolean) value) {
631 textValue = "否";
632 }
633 } else if (value instanceof Date) {
634 textValue = sdf.format((Date) value);
635 } else {
636 // 其它数据类型都当作字符串简单处理
637 if (value != null) {
638 textValue = value.toString();
639 }
640 }
641 if (textValue != null) {
642 matcher = p.matcher(textValue);
643 if (matcher.matches()) {
644 // 是数字当作double处理
645 cell.setCellValue(Double.parseDouble(textValue));
646 } else {
647 richString = new XSSFRichTextString(textValue);
648 cell.setCellValue(richString);
649 }
650 }
651 } catch (SecurityException e) {
652 e.printStackTrace();
653 } catch (NoSuchMethodException e) {
654 e.printStackTrace();
655 } catch (IllegalArgumentException e) {
656 e.printStackTrace();
657 } catch (IllegalAccessException e) {
658 e.printStackTrace();
659 } catch (InvocationTargetException e) {
660 e.printStackTrace();
661 } finally {
662 // 清理资源
663 }
664 }
665 }
666 try {
667 workbook.write(out);
668 } catch (IOException e) {
669 e.printStackTrace();
670 }
671 }
672
673
674 /**
675 * <p>
676 * 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
677 * 此方法生成2003版本的excel,文件名后缀:xls <br>
678 * </p>
679 *
680 * @param title 表格标题名
681 * @param headers 表格头部标题集合
682 * @param dataset 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
683 * JavaBean属性的数据类型有基本数据类型及String,Date
684 * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
685 * @param pattern 如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
686 */
687 @SuppressWarnings({"unchecked", "rawtypes"})
688 public void exportExcel2003(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {
689 // 声明一个工作薄
690 HSSFWorkbook workbook = new HSSFWorkbook();
691 // 生成一个表格
692 HSSFSheet sheet = workbook.createSheet(title);
693 // 设置表格默认列宽度为15个字节
694 sheet.setDefaultColumnWidth(20);
695 // 生成一个样式
696 HSSFCellStyle style = workbook.createCellStyle();
697 // 设置这些样式
698 // style.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
699 // style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
700 // style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
701 // style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
702 // style.setBorderRight(HSSFCellStyle.BORDER_THIN);
703 // style.setBorderTop(HSSFCellStyle.BORDER_THIN);
704 // style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
705 // 生成一个字体
706 HSSFFont font = workbook.createFont();
707 // font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
708 font.setFontName("宋体");
709 // font.setColor(HSSFColor.WHITE.index);
710 font.setFontHeightInPoints((short) 11);
711 // 把字体应用到当前的样式
712 style.setFont(font);
713 // 生成并设置另一个样式
714 HSSFCellStyle style2 = workbook.createCellStyle();
715 // style2.setFillForegroundColor(HSSFColor.WHITE.index);
716 // style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
717 // style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
718 // style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
719 // style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
720 // style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
721 // style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
722 // style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
723 // 生成另一个字体
724 HSSFFont font2 = workbook.createFont();
725 // font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
726 // 把字体应用到当前的样式
727 style2.setFont(font2);
728
729 // 产生表格标题行
730 HSSFRow row = sheet.createRow(0);
731 HSSFCell cellHeader;
732 for (int i = 0; i < headers.length; i++) {
733 cellHeader = row.createCell(i);
734 cellHeader.setCellStyle(style);
735 cellHeader.setCellValue(new HSSFRichTextString(headers[i]));
736 }
737
738 // 遍历集合数据,产生数据行
739 Iterator<T> it = dataset.iterator();
740 int index = 0;
741 T t;
742 Field[] fields;
743 Field field;
744 HSSFRichTextString richString;
745 Pattern p = Pattern.compile("^//d+(//.//d+)?$");
746 Matcher matcher;
747 String fieldName;
748 String getMethodName;
749 HSSFCell cell;
750 Class tCls;
751 Method getMethod;
752 Object value;
753 String textValue;
754 SimpleDateFormat sdf = new SimpleDateFormat(pattern);
755 while (it.hasNext()) {
756 index++;
757 row = sheet.createRow(index);
758 t = (T) it.next();
759 // 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
760 fields = t.getClass().getDeclaredFields();
761 for (int i = 0; i < fields.length; i++) {
762 cell = row.createCell(i);
763 cell.setCellStyle(style2);
764 field = fields[i];
765 fieldName = field.getName();
766 getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()
767 + fieldName.substring(1);
768 try {
769 tCls = t.getClass();
770 getMethod = tCls.getMethod(getMethodName, new Class[]{});
771 value = getMethod.invoke(t, new Object[]{});
772 // 判断值的类型后进行强制类型转换
773 textValue = null;
774 if (value instanceof Integer) {
775 cell.setCellValue((Integer) value);
776 } else if (value instanceof Float) {
777 textValue = String.valueOf((Float) value);
778 cell.setCellValue(textValue);
779 } else if (value instanceof Double) {
780 textValue = String.valueOf((Double) value);
781 cell.setCellValue(textValue);
782 } else if (value instanceof Long) {
783 cell.setCellValue((Long) value);
784 }
785 if (value instanceof Boolean) {
786 textValue = "是";
787 if (!(Boolean) value) {
788 textValue = "否";
789 }
790 } else if (value instanceof Date) {
791 textValue = sdf.format((Date) value);
792 } else {
793 // 其它数据类型都当作字符串简单处理
794 if (value != null) {
795 textValue = value.toString();
796 }
797 }
798 if (textValue != null) {
799 matcher = p.matcher(textValue);
800 if (matcher.matches()) {
801 // 是数字当作double处理
802 cell.setCellValue(Double.parseDouble(textValue));
803 } else {
804 richString = new HSSFRichTextString(textValue);
805 cell.setCellValue(richString);
806 }
807 }
808 } catch (SecurityException e) {
809 e.printStackTrace();
810 } catch (NoSuchMethodException e) {
811 e.printStackTrace();
812 } catch (IllegalArgumentException e) {
813 e.printStackTrace();
814 } catch (IllegalAccessException e) {
815 e.printStackTrace();
816 } catch (InvocationTargetException e) {
817 e.printStackTrace();
818 } finally {
819 // 清理资源
820 }
821 }
822 }
823 try {
824 workbook.write(out);
825 } catch (IOException e) {
826 e.printStackTrace();
827 }catch (Exception e) {
828 e.printStackTrace();
829 }
830 }
831 }
下载链接:http://video-course-upyun.51minicloud.com/java/POIDemo_codedna618.zip
http://edu.51minicloud.com/Course/Detail?vid=1137
备用下载链接:
一、读取表格
<%@ page import="codedna616.demo.commom.POIExcelReader" %>
<%@ page import="codedna616.demo.commom.Student" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>读取表格数据</title>
<style>
table td{border:1px solid #F00}
</style>
</head>
<body>
<%
//"想办法找到要提供下载的文件的物理路径+文件名";
String localFilePath = request.getServletContext().getRealPath("") + "\\本地导出的文件.xls";
%>
<h3>读取表格实例 <%=localFilePath%></h3>
<%
// 读取Excel文件内容
List<Student> readResult = POIExcelReader.readExcel(localFilePath);
out.println("<table style=\"border:1px\">");
out.println("<tr><td>编号</td><td>姓名</td><td>学号</td> <br>");
for (Student item : readResult) {
out.println("<tr><td>"+item.getId() + "</td><td>" + item.getName() + "</td><td>" + item.getStudentNo() + "</td></tr>"+"");
}
out.println("</table>");
%>
</body>
</html>
二、导出本地表格
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="codedna616.demo.commom.Utils" %>
<%@ page import="codedna616.demo.commom.Student" %>
<%@ page import="codedna616.demo.commom.PoiExportExcelUtil" %>
<%@ page import="java.io.FileOutputStream" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2020/7/16
Time: 9:27
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>下载表格</title>
</head>
<body>
<%
if (request.getParameter("type") == "2003") {
} else {
}
String[] columnNames = {"ID", "姓名", "学号"};
List<Student> list = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
Student model = new Student();
model.Id = Integer.toString(i);
model.Name = "学生" + i;
model.StudentNo = "序号000" + i;
list.add(model);
}
//方式1:直接导出表格测试【保存到本地】
PoiExportExcelUtil<Student> util = new PoiExportExcelUtil<Student>();
String localFilePath = request.getServletContext().getRealPath("") + "\\本地导出的文件.xls";
util.exportExcel("用户导出", columnNames, list, new FileOutputStream(localFilePath), PoiExportExcelUtil.EXCEL_FILE_2003);
out.print("写入完成"+localFilePath);
%>
</body>
</html>
三、下载表格
<%@ page import="java.net.URLEncoder" %>
<%@ page import="codedna616.demo.commom.Utils" %>
<%@ page import="java.io.FileInputStream" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>下载web表格</title>
</head>
<body>
<%
//方式2:通过流下载文件(适合web下载)
//关于文件下载时采用文件流输出的方式处理:
//加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
response.reset();//可以加也可以不加
response.setContentType("application/x-download");
//application.getRealPath("/main/mvplayer/CapSetup.msi");获取的物理路径
//"想办法找到要提供下载的文件的物理路径+文件名";
String localFilePath=request.getServletContext().getRealPath("")+"\\本地导出的文件.xls";
String filedisplay ="web下载的文件"+ Utils.getDateTimeNow()+".xls" ;//"给用户提供的下载文件名";
filedisplay = URLEncoder.encode(filedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
java.io.OutputStream outp = null;
java.io.FileInputStream in = null;
try {
outp = response.getOutputStream();
in = new FileInputStream(localFilePath);
byte[] b = new byte[1024];
int i = 0;
while((i = in.read(b)) > 0) {
outp.write(b, 0, i);
}
outp.flush();
//要加以下两句话,否则会报错
//java.lang.IllegalStateException: getOutputStream() has already been called for //this response
out.clear();
out = pageContext.pushBody();
} catch(Exception e){
System.out.println("Error!");
e.printStackTrace();
}finally{
if(in != null){
in.close();
in = null;
}
//这里不能关闭
//if(outp != null) {
//outp.close();
//outp = null;
//}
}
%>
</body>
</html>
核心方法如下,建议下载完整代码查看
==》》》读取表格
POIExcelReader.java
package codedna616.demo.commom;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.*;
import java.util.logging.Logger;
/**
* Author: Dreamer-1
* Date: 2019-03-01
* Time: 10:21
* Description: 读取Excel内容
*/
public class POIExcelReader {
private static Logger logger = Logger.getLogger(POIExcelReader.class.getName()); // 日志打印类
private static final String XLS = "xls";
private static final String XLSX = "xlsx";
/**
* 根据文件后缀名类型获取对应的工作簿对象
* @param inputStream 读取文件的输入流
* @param fileType 文件后缀名类型(xls或xlsx)
* @return 包含文件数据的工作簿对象
* @throws IOException
*/
public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
Workbook workbook = null;
if (fileType.equalsIgnoreCase(XLS)) {
workbook = new HSSFWorkbook(inputStream);
} else if (fileType.equalsIgnoreCase(XLSX)) {
workbook = new XSSFWorkbook(inputStream);
}
return workbook;
}
/**
* 读取Excel文件内容
* @param fileName 要读取的Excel文件所在路径
* @return 读取结果列表,读取失败时返回null
*/
public static List<Student> readExcel(String fileName) {
Workbook workbook = null;
FileInputStream inputStream = null;
try {
// 获取Excel后缀名
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
// 获取Excel文件
File excelFile = new File(fileName);
if (!excelFile.exists()) {
logger.warning("指定的Excel文件不存在!");
return null;
}
// 获取Excel工作簿
inputStream = new FileInputStream(excelFile);
workbook = getWorkbook(inputStream, fileType);
// 读取excel中的数据
List<Student> resultDataList = parseExcel(workbook);
return resultDataList;
} catch (Exception e) {
logger.warning("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
return null;
} finally {
try {
if (null != workbook) {
workbook.close();
}
if (null != inputStream) {
inputStream.close();
}
} catch (Exception e) {
logger.warning("关闭数据流出错!错误信息:" + e.getMessage());
return null;
}
}
}
/**
* 读取Excel文件内容
* @param file 上传的Excel文件
* @return 读取结果列表,读取失败时返回null
*/
// public static List<Student> readExcel(MultipartFile file) {
//
// Workbook workbook = null;
//
// try {
// // 获取Excel后缀名
// String fileName = file.getOriginalFilename();
// if (fileName == null || fileName.isEmpty() || fileName.lastIndexOf(".") < 0) {
// logger.warning("解析Excel失败,因为获取到的Excel文件名非法!");
// return null;
// }
// String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
//
// // 获取Excel工作簿
// workbook = getWorkbook(file.getInputStream(), fileType);
//
// // 读取excel中的数据
// List<Student> resultDataList = parseExcel(workbook);
//
// return resultDataList;
// } catch (Exception e) {
// logger.warning("解析Excel失败,文件名:" + file.getOriginalFilename() + " 错误信息:" + e.getMessage());
// return null;
// } finally {
// try {
// if (null != workbook) {
// workbook.close();
// }
// } catch (Exception e) {
// logger.warning("关闭数据流出错!错误信息:" + e.getMessage());
// return null;
// }
// }
// }
/**
* 解析Excel数据
* @param workbook Excel工作簿对象
* @return 解析结果
*/
private static List<Student> parseExcel(Workbook workbook) {
List<Student> resultDataList = new ArrayList<>();
// 解析sheet
for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
Sheet sheet = workbook.getSheetAt(sheetNum);
// 校验sheet是否合法
if (sheet == null) {
continue;
}
// 获取第一行数据
int firstRowNum = sheet.getFirstRowNum();
Row firstRow = sheet.getRow(firstRowNum);
if (null == firstRow) {
logger.warning("解析Excel失败,在第一行没有读取到任何数据!");
}
// 解析每一行的数据,构造数据对象
int rowStart = firstRowNum + 1;
int rowEnd = sheet.getPhysicalNumberOfRows();
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
Row row = sheet.getRow(rowNum);
if (null == row) {
continue;
}
Student resultData = convertRowToData(row);
if (null == resultData) {
logger.warning("第 " + row.getRowNum() + "行数据不合法,已忽略!");
continue;
}
resultDataList.add(resultData);
}
}
return resultDataList;
}
/**
* 将单元格内容转换为字符串
* @param cell
* @return
*/
private static String convertCellValueToString(Cell cell) {
if(cell==null){
return null;
}
String returnValue = null;
switch (cell.getCellType()) {
case NUMERIC: //数字
Double doubleValue = cell.getNumericCellValue();
// 格式化科学计数法,取一位整数
DecimalFormat df = new DecimalFormat("0");
returnValue = df.format(doubleValue);
break;
case STRING: //字符串
returnValue = cell.getStringCellValue();
break;
case BOOLEAN: //布尔
Boolean booleanValue = cell.getBooleanCellValue();
returnValue = booleanValue.toString();
break;
case BLANK: // 空值
break;
case FORMULA: // 公式
returnValue = cell.getCellFormula();
break;
case ERROR: // 故障
break;
default:
break;
}
return returnValue;
}
/**
* 提取每一行中需要的数据,构造成为一个结果数据对象
*
* 当该行中有单元格的数据为空或不合法时,忽略该行的数据
*
* @param row 行数据
* @return 解析后的行数据对象,行数据错误时返回null
*/
private static Student convertRowToData(Row row) {
Student resultData = new Student();
Cell cell;
int cellNum = 0;
// 获取第一列
cell = row.getCell(0);
String id = convertCellValueToString(cell);
resultData.setId(id);
// 第二列
cell = row.getCell(1);
String name = convertCellValueToString(cell);
resultData.setName(name);
// 第三列
cell = row.getCell(2);
String sutdnetNo = convertCellValueToString(cell);
resultData.setStudentNo(sutdnetNo);
return resultData;
}
}
==》》》》导出表格
PoiExportExcelUtil.java文件
package codedna616.demo.commom;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* 导出Excel
*
* @param <T>
* @author
*/
public class PoiExportExcelUtil<T> {
// 2007 版本以上 最大支持1048576行
public final static String EXCEl_FILE_2007 = "2007";
// 2003 版本 最大支持65536 行
public final static String EXCEL_FILE_2003 = "2003";
/**
* <p>
* 导出无头部标题行Excel <br>
* 时间格式默认:yyyy-MM-dd hh:mm:ss <br>
* </p>
*
* @param title 表格标题
* @param dataset 数据集合
* @param out 输出流
* @param version 2003 或者 2007,不传时默认生成2003版本
*/
public void exportExcel(String title, Collection<T> dataset, OutputStream out, String version) {
if (Utils.isNullOrEmpty(version) || EXCEL_FILE_2003.equals(version.trim())) {
exportExcel2003(title, null, dataset, out, "yyyy-MM-dd HH:mm:ss");
} else {
exportExcel2007(title, null, dataset, out, "yyyy-MM-dd HH:mm:ss");
}
}
/**
* <p>
* 导出带有头部标题行的Excel <br>
* 时间格式默认:yyyy-MM-dd hh:mm:ss <br>
* </p>
*
* @param title 表格标题
* @param headers 头部标题集合
* @param dataset 数据集合
* @param out 输出流
* @param version 2003 或者 2007,不传时默认生成2003版本
*/
public void exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out, String version) {
if (Utils.isNullOrEmpty(version) || EXCEL_FILE_2003.equals(version.trim())) {
exportExcel2003(title, headers, dataset, out, "yyyy-MM-dd HH:mm:ss");
} else {
exportExcel2007(title, headers, dataset, out, "yyyy-MM-dd HH:mm:ss");
}
}
/**
* <p>
* 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
* 此版本生成2007以上版本的文件 (文件后缀:xlsx)
* </p>
*
* @param title 表格标题名
* @param headers 表格头部标题集合
* @param dataset 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
* JavaBean属性的数据类型有基本数据类型及String,Date
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern 如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public void exportExcel2007(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {
// 声明一个工作薄
XSSFWorkbook workbook = new XSSFWorkbook();
// 生成一个表格
XSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth(20);
// 生成一个样式
XSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(new XSSFColor(java.awt.Color.gray));
// style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
//
// style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
// style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
// style.setBorderRight(XSSFCellStyle.BORDER_THIN);
// style.setBorderTop(XSSFCellStyle.BORDER_THIN);
// style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
XSSFFont font = workbook.createFont();
//font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setColor(new XSSFColor(java.awt.Color.BLACK));
font.setFontHeightInPoints((short) 11);
// 把字体应用到当前的样式
style.setFont(font);
// 生成并设置另一个样式
XSSFCellStyle style2 = workbook.createCellStyle();
style2.setFillForegroundColor(new XSSFColor(java.awt.Color.WHITE));
// style2.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
// style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);
// style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);
// style2.setBorderRight(XSSFCellStyle.BORDER_THIN);
// style2.setBorderTop(XSSFCellStyle.BORDER_THIN);
// style2.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// style2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
XSSFFont font2 = workbook.createFont();
//font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
style2.setFont(font2);
// 产生表格标题行
XSSFRow row = sheet.createRow(0);
XSSFCell cellHeader;
for (int i = 0; i < headers.length; i++) {
cellHeader = row.createCell(i);
cellHeader.setCellStyle(style);
cellHeader.setCellValue(new XSSFRichTextString(headers[i]));
}
// 遍历集合数据,产生数据行
Iterator<T> it = dataset.iterator();
int index = 0;
T t;
Field[] fields;
Field field;
XSSFRichTextString richString;
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
Matcher matcher;
String fieldName;
String getMethodName;
XSSFCell cell;
Class tCls;
Method getMethod;
Object value;
String textValue;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
t = (T) it.next();
// 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
fields = t.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
cell = row.createCell(i);
cell.setCellStyle(style2);
field = fields[i];
fieldName = field.getName();
getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
tCls = t.getClass();
getMethod = tCls.getMethod(getMethodName, new Class[]{});
value = getMethod.invoke(t, new Object[]{});
// 判断值的类型后进行强制类型转换
textValue = null;
if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Float) {
textValue = String.valueOf((Float) value);
cell.setCellValue(textValue);
} else if (value instanceof Double) {
textValue = String.valueOf((Double) value);
cell.setCellValue(textValue);
} else if (value instanceof Long) {
cell.setCellValue((Long) value);
}
if (value instanceof Boolean) {
textValue = "是";
if (!(Boolean) value) {
textValue = "否";
}
} else if (value instanceof Date) {
textValue = sdf.format((Date) value);
} else {
// 其它数据类型都当作字符串简单处理
if (value != null) {
textValue = value.toString();
}
}
if (textValue != null) {
matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
richString = new XSSFRichTextString(textValue);
cell.setCellValue(richString);
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} finally {
// 清理资源
}
}
}
try {
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* <p>
* 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
* 此方法生成2003版本的excel,文件名后缀:xls <br>
* </p>
*
* @param title 表格标题名
* @param headers 表格头部标题集合
* @param dataset 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
* JavaBean属性的数据类型有基本数据类型及String,Date
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern 如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public void exportExcel2003(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth(20);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
// style.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
// style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
// style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
// style.setBorderRight(HSSFCellStyle.BORDER_THIN);
// style.setBorderTop(HSSFCellStyle.BORDER_THIN);
// style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
// font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
// font.setColor(HSSFColor.WHITE.index);
font.setFontHeightInPoints((short) 11);
// 把字体应用到当前的样式
style.setFont(font);
// 生成并设置另一个样式
HSSFCellStyle style2 = workbook.createCellStyle();
// style2.setFillForegroundColor(HSSFColor.WHITE.index);
// style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
// style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
// style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
// style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
// style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
HSSFFont font2 = workbook.createFont();
// font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
style2.setFont(font2);
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
HSSFCell cellHeader;
for (int i = 0; i < headers.length; i++) {
cellHeader = row.createCell(i);
cellHeader.setCellStyle(style);
cellHeader.setCellValue(new HSSFRichTextString(headers[i]));
}
// 遍历集合数据,产生数据行
Iterator<T> it = dataset.iterator();
int index = 0;
T t;
Field[] fields;
Field field;
HSSFRichTextString richString;
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
Matcher matcher;
String fieldName;
String getMethodName;
HSSFCell cell;
Class tCls;
Method getMethod;
Object value;
String textValue;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
t = (T) it.next();
// 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
fields = t.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
cell = row.createCell(i);
cell.setCellStyle(style2);
field = fields[i];
fieldName = field.getName();
getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
tCls = t.getClass();
getMethod = tCls.getMethod(getMethodName, new Class[]{});
value = getMethod.invoke(t, new Object[]{});
// 判断值的类型后进行强制类型转换
textValue = null;
if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Float) {
textValue = String.valueOf((Float) value);
cell.setCellValue(textValue);
} else if (value instanceof Double) {
textValue = String.valueOf((Double) value);
cell.setCellValue(textValue);
} else if (value instanceof Long) {
cell.setCellValue((Long) value);
}
if (value instanceof Boolean) {
textValue = "是";
if (!(Boolean) value) {
textValue = "否";
}
} else if (value instanceof Date) {
textValue = sdf.format((Date) value);
} else {
// 其它数据类型都当作字符串简单处理
if (value != null) {
textValue = value.toString();
}
}
if (textValue != null) {
matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
richString = new HSSFRichTextString(textValue);
cell.setCellValue(richString);
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} finally {
// 清理资源
}
}
}
try {
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
}
jar文件和代码下载地址,使用ideaj ,java-jdk1.8 导入即可:
下载地址
http://edu.51minicloud.com/ThirdPartDown/Down?id=3034906a3884487e8d93f0a546daea4a&title=cnblog