Java 工具类
来源:互联网 发布:李嫣兔唇原因知乎 编辑:程序博客网 时间:2024/06/05 11:01
使用起来十分简单,只需要定义实体类即可,注意一点,列的顺序必须与实体类字段的顺序一致。
package com.tgb.hz.doc;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;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.ArrayList;import java.util.Collection;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.swing.JOptionPane;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFCellStyle;import org.apache.poi.hssf.usermodel.HSSFClientAnchor;import org.apache.poi.hssf.usermodel.HSSFFont;import org.apache.poi.hssf.usermodel.HSSFPatriarch;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.ss.usermodel.ClientAnchor.AnchorType;import com.tgb.hz.entity.Book;import com.tgb.hz.entity.Student;/** * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处! * * @author hezhao * @version v1.0 * @param <T> * 应用泛型,代表任意一个符合javabean风格的类 * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx() * byte[]表jpg格式的图片数据 */ public class ExportExcelByPoi<T> { //%%%%%%%%-------字段部分 开始----------%%%%%%%%% /** * 标题栏背景颜色 默认白色 */ private short titleBackColor = HSSFColor.WHITE.index; /** * 标题栏文字颜色 默认黑色 */ private short titleFontColor = HSSFColor.BLACK.index; /** * 标题栏文字大小 默认12 */ private short titleFontSize = 12; /** * 标题栏文字是否粗体 默认true */ private boolean titleFontBold = true; /** * 标题栏高度 默认13 */ private short titleHeight = 13; /** * 数据栏背景颜色 默认白色 */ private short columnBackColor = HSSFColor.WHITE.index; /** * 数据栏文字颜色 默认黑色 */ private short columnFontColor = HSSFColor.BLACK.index; /** * 数据栏文字大小 默认10 */ private short columnFontSize = 10; /** * 数据栏文字是否粗体 默认false */ private boolean columnFontBold = false; /** * 数据栏高度 默认13 */ private short columnHeight = 13; /** * 表格默认宽度 15个字节 */ private short widthDefault = 15; /** * 图片高度 默认60 */ private short imageHeight = 60; /** * 是否有框线 */ private boolean needBorder = true; /** * 对齐方式 默认中间对齐 */ private short align = HSSFCellStyle.ALIGN_CENTER; /** * 日期格式化 */ private String pattern = "yyyy-MM-dd"; /** * 表头 可为空 */ private String[] headers; /** * 数据 */ private Collection<T> dataset; /** * 输出流 */ private OutputStream out; //%%%%%%%%-------字段部分 结束----------%%%%%%%%% public ExportExcelByPoi(){ } /** * 生成Excel * @param sheetName 工作表名称 * @param widths 宽度集合 当需要自定义某一列的宽度时,需要把那个字段名作为键,然后宽度作为值存入widths,其余未存入的按照默认宽度处理 */ public void createExcel(String sheetName,Map<String,Integer> widths) { create(sheetName,widths); } /** * 生成Excel * @param sheetName 工作表名称 */ public void createExcel(String sheetName) { create(sheetName,null); } /** * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上 * * @param sheetName * 表格标题名 * @param headers * 表格属性列名数组 * @param dataset * 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据) * @param out * 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 * @param pattern * 如果有时间数据,设定输出格式。默认为"yyyy-MM-dd" */ @SuppressWarnings("unchecked") private void create(String sheetName,Map<String,Integer> widths) { // 声明一个工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); // 生成一个表格 HSSFSheet sheet = workbook.createSheet(sheetName); // 设置表格默认列宽度 sheet.setDefaultColumnWidth(this.widthDefault); // 标题栏样式 HSSFCellStyle style = createTitleStyle(workbook); //数据栏样式 HSSFCellStyle style2 = createColumnStyle(workbook); // 声明一个画图的顶级管理器 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // 定义注释的大小和位置,详见文档 // HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, // 0, 0, 0, (short) 4, 2, (short) 6, 5)); // 设置注释内容 // comment.setString(new HSSFRichTextString("可以在POI中添加注释!")); // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容. // comment.setAuthor("leno"); // 产生表格标题行 HSSFRow row = sheet.createRow(0); row.setHeight((short) (titleHeight * 20)); 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); row.setHeight((short) (columnHeight * 20)); T t = (T) it.next(); // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 Field[] fields = t.getClass().getDeclaredFields(); for (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, 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;// textValue = new HSSFRichTextString(String.valueOf(dValue));// cell.setCellValue(textValue);// } else if (value instanceof Long) {// long longValue = (Long) value;// cell.setCellValue(longValue);// }// else// if (value instanceof Boolean) // { // boolean bValue = (Boolean) value; // textValue = "男"; // if (!bValue) // { // textValue = "女"; // } // } // else if (value instanceof Date) { Date date = (Date) value; SimpleDateFormat sdf = new SimpleDateFormat(pattern); textValue = sdf.format(date); } else if (value instanceof byte[]) { int width = 80; //处理自定义宽度 if(widths!=null && widths.containsKey(fieldName)){ width = widths.get(fieldName); } // 有图片时,设置行高为60px; row.setHeightInPoints(this.imageHeight); // 设置图片所在列宽度为80px,注意这里单位的一个换算 sheet.setColumnWidth(i, (short) (35.7 * width * 7.666)); // sheet.autoSizeColumn(i); byte[] bsValue = (byte[]) value; HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6, index); anchor.setAnchorType(AnchorType.MOVE_DONT_RESIZE); // AnchorType.MOVE_DONT_RESIZE = 2 patriarch.createPicture(anchor, workbook.addPicture( bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG)); } else { // 其它数据类型都当作字符串简单处理 textValue = value.toString(); } // 如果不是图片数据 if (textValue != null) { //处理自定义宽度 if(widths!=null && widths.containsKey(fieldName)){ int width = widths.get(fieldName); // 设置所在列宽度为 width px,注意这里单位的一个换算 sheet.setColumnWidth(i, (short) (35.7 * width * 7.666)); } //利用正则表达式判断textValue是否全部由数字组成 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); 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(); } } /** *数据栏样式 * @param workbook * @return */ private HSSFCellStyle createColumnStyle(HSSFWorkbook workbook) { // 生成并设置另一个样式 HSSFCellStyle style2 = workbook.createCellStyle(); style2.setFillForegroundColor(this.columnBackColor); style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //是否需要框线 if(this.needBorder){ style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); style2.setBorderLeft(HSSFCellStyle.BORDER_THIN); style2.setBorderRight(HSSFCellStyle.BORDER_THIN); style2.setBorderTop(HSSFCellStyle.BORDER_THIN); }else{ style2.setBorderBottom(HSSFCellStyle.BORDER_NONE); style2.setBorderLeft(HSSFCellStyle.BORDER_NONE); style2.setBorderRight(HSSFCellStyle.BORDER_NONE); style2.setBorderTop(HSSFCellStyle.BORDER_NONE); } style2.setAlignment(this.align); style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 生成另一个字体 HSSFFont font2 = workbook.createFont(); font2.setColor(this.columnFontColor); font2.setFontHeightInPoints(this.columnFontSize); if(this.columnFontBold){ font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); }else{ font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); } // 把字体应用到当前的样式 style2.setFont(font2); return style2; } /** * 标题栏样式 * @param workbook * @return */ private HSSFCellStyle createTitleStyle(HSSFWorkbook workbook) { // 生成一个样式 HSSFCellStyle style = workbook.createCellStyle(); // 设置这些样式 style.setFillForegroundColor(this.titleBackColor); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //是否需要框线 if(this.needBorder){ style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); }else{ style.setBorderBottom(HSSFCellStyle.BORDER_NONE); style.setBorderLeft(HSSFCellStyle.BORDER_NONE); style.setBorderRight(HSSFCellStyle.BORDER_NONE); style.setBorderTop(HSSFCellStyle.BORDER_NONE); } //对齐方式 style.setAlignment(this.align); // 生成一个字体 HSSFFont font = workbook.createFont(); font.setColor(this.titleFontColor); font.setFontHeightInPoints(this.titleFontSize); if(this.titleFontBold){ font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); }else{ font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); } // 把字体应用到当前的样式 style.setFont(font); return style; } public static void main(String[] args) { // 测试学生 ExportExcelByPoi<Student> ex = new ExportExcelByPoi<Student>(); String[] headers = { "学号", "姓名", "年龄", "性别", "出生日期" }; List<Student> dataset = new ArrayList<Student>(); dataset.add(new Student(10000001, "张三", 20, true, new Date())); dataset.add(new Student(20000002, "李四", 24, false, new Date())); dataset.add(new Student(30000003, "王五", 22, true, new Date())); // 测试图书 ExportExcelByPoi<Book> ex2 = new ExportExcelByPoi<Book>(); String[] headers2 = { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社", "封面图片" }; List<Book> dataset2 = new ArrayList<Book>(); try { BufferedInputStream bis = new BufferedInputStream( new FileInputStream("D://barcode.png")); byte[] buf = new byte[bis.available()]; while ((bis.read(buf)) != -1) { // } dataset2.add(new Book(1, "jsp", "leno", 300.33f, "1234567", "清华出版社", buf)); dataset2.add(new Book(2, "java编程思想", "brucl", 300.33f, "1234567", "阳光出版社", buf)); dataset2.add(new Book(3, "DOM艺术", "lenotang", 300.33f, "1234567", "清华出版社", buf)); dataset2.add(new Book(4, "c++经典", "leno", 400.33f, "1234567", "清华出版社", buf)); dataset2.add(new Book(5, "c#入门", "leno", 300.33f, "1234567", "汤春秀出版社", buf)); OutputStream out = new FileOutputStream("E://a.xls"); OutputStream out2 = new FileOutputStream("E://b.xls"); Map<String,Integer> widths = new HashMap<String, Integer>(); widths.put("isbn", 15); widths.put("preface", 30); ex.setDataset(dataset); ex.setHeaders(headers); ex.setOut(out); ex.setAlign(HSSFCellStyle.ALIGN_LEFT); ex.setColumnFontColor(HSSFColor.RED.index); ex.setNeedBorder(false); ex.setTitleBackColor(HSSFColor.BLUE_GREY.index); ex.setWidthDefault(20); ex.setTitleFontSize(16); ex.setTitleFontBold(false); ex.setColumnFontSize(14); ex2.setDataset(dataset2); ex2.setHeaders(headers2); ex2.setOut(out2); ex2.setImageHeight(80); ex.createExcel("学生信息"); ex2.createExcel("书籍信息",widths); out.close(); out2.close(); JOptionPane.showMessageDialog(null, "导出成功!"); System.out.println("excel导出成功!"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public short getTitleBackColor() { return titleBackColor; } /** * 标题栏背景颜色 默认白色 HSSFColor.WHITE.index * @param titleBackColor */ public void setTitleBackColor(short titleBackColor) { this.titleBackColor = titleBackColor; } public short getTitleFontColor() { return titleFontColor; } /** * 标题栏文字颜色 默认黑色 HSSFColor.BLACK.index * @param titleFontColor */ public void setTitleFontColor(short titleFontColor) { this.titleFontColor = titleFontColor; } public short getTitleFontSize() { return titleFontSize; } /** * 标题栏文字大小 默认 12 * @param titleFontSize */ public void setTitleFontSize(int titleFontSize) { this.titleFontSize = (short)titleFontSize; } public boolean getTitleFontBold() { return titleFontBold; } /** * 标题栏文字是否粗体 默认true * @param titleFontBold */ public void setTitleFontBold(boolean titleFontBold) { this.titleFontBold = titleFontBold; } public short getColumnBackColor() { return columnBackColor; } /** * 数据栏背景颜色 默认白色 HSSFColor.WHITE.index * @param columnBackColor */ public void setColumnBackColor(short columnBackColor) { this.columnBackColor = columnBackColor; } public short getColumnFontColor() { return columnFontColor; } /** * 数据栏文字颜色 默认黑色 HSSFColor.BLACK.index * @param columnFontColor */ public void setColumnFontColor(short columnFontColor) { this.columnFontColor = columnFontColor; } public short getColumnFontSize() { return columnFontSize; } /** * 数据栏文字大小 默认10 * @param columnFontSize */ public void setColumnFontSize(int columnFontSize) { this.columnFontSize = (short)columnFontSize; } public boolean getColumnFontBold() { return columnFontBold; } /** * 数据栏文字是否粗体 默认false * @param columnFontBold */ public void setColumnFontBold(boolean columnFontBold) { this.columnFontBold = columnFontBold; } public short getWidthDefault() { return widthDefault; } /** * 表格默认宽度 15个字节 * @param widthDefault */ public void setWidthDefault(int widthDefault) { this.widthDefault = (short)widthDefault; } public boolean isNeedBorder() { return needBorder; } /** * 是否有框线 * @param needBorder */ public void setNeedBorder(boolean needBorder) { this.needBorder = needBorder; } public short getAlign() { return align; } /** * 对齐方式 默认中间对齐 HSSFCellStyle.ALIGN_CENTER * @param align */ public void setAlign(short align) { this.align = align; } public String getPattern() { return pattern; } /** * 日期格式化 * @param pattern */ public void setPattern(String pattern) { this.pattern = pattern; } public String[] getHeaders() { return headers; } /** * 标题栏 * @param headers */ public void setHeaders(String[] headers) { this.headers = headers; } public Collection<T> getDataset() { return dataset; } /** * 表格数据集合 * @param dataset */ public void setDataset(Collection<T> dataset) { this.dataset = dataset; } public OutputStream getOut() { return out; } /** * 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 * @param out */ public void setOut(OutputStream out) { this.out = out; } public short getImageHeight() { return imageHeight; } /** * 图片高度 默认60 * @param imageHeight */ public void setImageHeight(int imageHeight) { this.imageHeight = (short)imageHeight; } public short getTitleHeight() { return titleHeight; } /** * 标题栏高度 默认13 * @param titleHeight */ public void setTitleHeight(int titleHeight) { this.titleHeight = (short) titleHeight; } public short getColumnHeight() { return columnHeight; } /** * 数据栏高度 默认13 * @param columnHeight */ public void setColumnHeight(int columnHeight) { this.columnHeight = (short) columnHeight; }}
提供一下实体类供测试使用
Book
package com.tgb.hz.entity;/** * ┏┓ ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃ ┃ * ┃ ━ ┃ ++ + + + * ████━████ ┃+ * ┃ ┃ + * ┃ ┻ ┃ * ┃ ┃ + + * ┗━┓ ┏━┛ * ┃ ┃ * ┃ ┃ + + + + * ┃ ┃ Code is far away from bug with the animal protecting * ┃ ┃ + 神兽保佑,代码无bug * ┃ ┃ * ┃ ┃ + * ┃ ┗━━━┓ + + * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ + + + + * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛+ + + + * <p> * Created by hezhao on 2018-08-16 16:33 */public class Book { private int bookId; private String name; private String author; private float price; private String isbn; private String pubName; private byte[] preface; public Book() { } public Book(int bookId, String name, String author, float price, String isbn, String pubName, byte[] preface) { this.bookId = bookId; this.name = name; this.author = author; this.price = price; this.isbn = isbn; this.pubName = pubName; this.preface = preface; } public int getBookId() { return bookId; } public void setBookId(int bookId) { this.bookId = bookId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getPubName() { return pubName; } public void setPubName(String pubName) { this.pubName = pubName; } public byte[] getPreface() { return preface; } public void setPreface(byte[] preface) { this.preface = preface; }}
Student
package com.tgb.hz.entity;import java.util.Date;/** * ┏┓ ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃ ┃ * ┃ ━ ┃ ++ + + + * ████━████ ┃+ * ┃ ┃ + * ┃ ┻ ┃ * ┃ ┃ + + * ┗━┓ ┏━┛ * ┃ ┃ * ┃ ┃ + + + + * ┃ ┃ Code is far away from bug with the animal protecting * ┃ ┃ + 神兽保佑,代码无bug * ┃ ┃ * ┃ ┃ + * ┃ ┗━━━┓ + + * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ + + + + * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛+ + + + * <p> * Created by hezhao on 2018-08-16 16:33 */public class Student { private long id; private String name; private int age; private boolean sex; private Date birthday; public Student() { } public Student(long id, String name, int age, boolean sex, Date birthday) { this.id = id; this.name = name; this.age = age; this.sex = sex; this.birthday = birthday; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean getSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + (sex?"男":"女")+ ", birthday=" + birthday + "]"; }}
阅读全文
0 0
- java文件工具类
- java日期工具类
- java 绝对路径工具类
- java工具类
- Java 数据处理工具类
- java日期工具类
- java工具类Assert
- 一些Java工具类
- anroid&java工具类
- java StringUtil 工具类
- java身份证号工具类
- java 日期工具类
- Java开发工具类
- java 加密工具类
- java集合工具类
- java时间工具类
- java 时间工具类
- Java加密工具类
- Typical Policy Representation in Policy Search Methods
- 认识EXTJS
- NMF 非负矩阵分解 -- 原理与应用
- 串口通信数据位长度对传输数据的影响
- Lost in Translation
- Java 工具类
- python数据类型的四个练手小作业
- leetcode 640. Solve the Equation
- spring开始
- C++11 新特性:Lambda 表达式
- Java线程模型
- Android之Drawerlayout——实现侧滑菜单
- Python笔记目录
- 网络编程