POI导出EXCEL经典实现

前端开发 作者: 2024-08-25 18:25:01
1.Apache POI简介Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能。2.POI结构HSSF - 提供

student.java

package org.leno.export.util; import java.util.Date; public class Student { private long id; private String name; int age; boolean sex; private Date birthday; public Student() { super(); // TODO Auto-generated constructor stub } public Student(long id,String name,int age,255)">boolean sex,Date birthday) { this.id = id; this.name = name; this.age = age; this.sex = sex; this.birthday = birthday; } long getId() { return id; } void setId(long id) { this.id = id; } public String getName() { return name; } void setName(String name) { this.name = name; } int getAge() { return age; } void setAge(int age) { this.age = age; } boolean getSex() { return sex; } void setSex(boolean sex) { this.sex = sex; } public Date getBirthday() { return birthday; } void setBirthday(Date birthday) { this.birthday = birthday; } }

Book.java

ExportExcel.java

import java.io.*; import java.lang.reflect.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.text.SimpleDateFormat; import javax.swing.JOptionPane; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; /** * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保存以下信息,注明出处! * * @author leno * @version v1.0 * @param <T> * 利用泛型,代表任意1个符合javabean风格的类 * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx() * byte[]表jpg格式的图片数据 */ class ExportExcel<T> { void exportExcel(Collection<T> dataset,OutputStream out) { exportExcel("测试POI导出EXCEL文档",255)">null,dataset,out,"yyyy-MM-dd"); } void exportExcel(String[] headers,Collection<T> dataset,headers,OutputStream out,String pattern) { exportExcel("测试POI导出EXCEL文档",pattern); } * 这是1个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号1定条件的数据以EXCEL 的情势输出到指定IO装备上 * * title * 表格标题名 * headers * 表格属性列名数组 * dataset * 需要显示的数据集合,集合中1定要放置符合javabean风格的类的对象。此方法支持的 * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据) * out * 与输出装备关联的流对象,可以将EXCEL文档导出到本地文件或网络中 * pattern * 如果有时间数据,设定输出格式。默许为"yyy-MM-dd" */ @SuppressWarnings("unchecked") void exportExcel(String title,String[] headers,Collection<T> dataset,String pattern) { 声明1个工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); 生成1个表格 HSSFSheet sheet = workbook.createSheet(title); 设置表格默许列宽度为15个字节 sheet.setDefaultColumnWidth((short) 15); 生成1个样式 HSSFCellStyle style = workbook.createCellStyle(); 设置这些样式 style.setFillForegroundColor(HSSFColor.SKY_BLUE.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); 生成1个字体 HSSFFont font = workbook.createFont(); font.setColor(HSSFColor.VIOLET.index); font.setFontHeightInPoints((short) 12); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 把字体利用到当前的样式 style.setFont(font); 生成并设置另外一个样式 HSSFCellStyle style2 = workbook.createCellStyle(); style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.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); 声明1个画图的顶级管理器 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 定义注释的大小和位置,详见文档 HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,0,(short) 4,2,255)">short) 6,5)); 设置注释内容 comment.setString(new HSSFRichTextString("可以在POI中添加注释!")); 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容. comment.setAuthor("leno"); 产生表格标题行 HSSFRow row = sheet.createRow(0); for (short i = 0; i < headers.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(headers[i]); cell.setCellValue(text); } 遍历集合数据,产生数据行 Iterator<T> it = dataset.iterator(); int index = 0; while (it.hasNext()) { index++; row = sheet.createRow(index); T t = (T) it.next(); 利用反射,根据javabean属性的前后顺序,动态调用getXxx()方法得到属性值 Field[] fields = t.getClass().getDeclaredFields(); short i = 0; i < fields.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(style2); Field field = fields[i]; String fieldName = field.getName(); String getMethodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1); try { Class tCls = t.getClass(); Method getMethod = tCls.getMethod(getMethodName,new Class[] {}); Object value = getMethod.invoke(t,255)">new Object[] {}); 判断值的类型落后行强迫类型转换 String textValue = null; if (value instanceof Integer) { int intValue = (Integer) value; cell.setCellValue(intValue); } else if (value instanceof Float) { float fValue = (Float) value; textValue = new HSSFRichTextString( String.valueOf(fValue)); cell.setCellValue(textValue); } else if (value instanceof Double) { double dValue = (Double) value; String.valueOf(dValue)); } else if (value instanceof Long) { long longValue = (Long) value; cell.setCellValue(longValue); } if (value instanceof Boolean) { boolean bValue = (Boolean) value; textValue = "男"; if (!bValue) { textValue = "女"; } } else instanceof Date) { Date date = (Date) value; SimpleDateFormat sdf = new SimpleDateFormat(pattern); textValue = sdf.format(date); } instanceof byte[]) { 有图片时,设置行高为60px; row.setHeightInPoints(60); 设置图片所在列宽度为80px,注意这里单位的1个换算 sheet.setColumnWidth(i,255)">short) (35.7 * 80)); sheet.autoSizeColumn(i); byte[] bsValue = (byte[]) value; HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,index,255)">short) 6,index); anchor.setAnchorType(2); patriarch.createPicture(anchor,workbook.addPicture( bsValue,HSSFWorkbook.PICTURE_TYPE_JPEG)); } else { 其它数据类型都当作字符串简单处理 textValue = value.toString(); } 如果不是图片数据,就利用正则表达式判断textValue是不是全部由数字组成 if (textValue != null) { Pattern p = Pattern.compile("^//d+(//.//d+)?$"); Matcher matcher = p.matcher(textValue); if (matcher.matches()) { 是数字当作double处理 cell.setCellValue(Double.parseDouble(textValue)); } else { HSSFRichTextString richString = new HSSFRichTextString( textValue); HSSFFont font3 = workbook.createFont(); font3.setColor(HSSFColor.BLUE.index); richString.applyFont(font3); cell.setCellValue(richString); } } } catch (SecurityException e) { TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { catch (IllegalArgumentException e) { catch (IllegalAccessException e) { catch (InvocationTargetException e) { finally { 清算资源 } } } try { workbook.write(out); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } } static void main(String[] args) { 测试学生 ExportExcel<Student> ex = new ExportExcel<Student>(); String[] headers = { "学号","姓名","年龄","性别","诞生日期" }; List<Student> dataset = new ArrayList<Student>(); dataset.add(new Student(10000001,"张3",20,255)">true,255)">new Date())); dataset.add(new Student(20000002,"李4",24,255)">false,255)">new Student(30000003,"王5",22,255)">new Date())); 测试图书 ExportExcel<Book> ex2 = new ExportExcel<Book>(); String[] headers2 = { "图书编号","图书名称","图书作者","图书价格","图书ISBN","图书出版社","封面图片" }; List<Book> dataset2 = new ArrayList<Book>(); try { BufferedInputStream bis = new BufferedInputStream( new FileInputStream("book.jpg")); byte[] buf = new byte[bis.available()]; while ((bis.read(buf)) != ⑴) { // } dataset2.add(new Book(1,"jsp","leno",300.33f,"1234567","清华出版社",buf)); dataset2.add(new Book(2,"java编程思想","brucl","阳光出版社",255)">new Book(3,"DOM艺术","lenotang",255)">new Book(4,"c++经典",400.33f,255)">new Book(5,"c#入门","汤春秀出版社",buf)); OutputStream out = new FileOutputStream("E://a.xls"); OutputStream out2 = new FileOutputStream("E://b.xls"); ex.exportExcel(headers,out); ex2.exportExcel(headers2,dataset2,out2); out.close(); JOptionPane.showMessageDialog(); System.out.println("excel导出成功!"); } catch (FileNotFoundException e) { TODO Auto-generated catch block e.printStackTrace(); } TODO Auto-generated catch block e.printStackTrace(); } } }
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_68536.html
POI导出EXCEL经典实现