/** * */ package com.zlp.servlet; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.formula.functions.T; import com.zlp.execl.Book; import com.zlp.execl.ExportExcel; import com.zlp.execl.IndexConfig; import com.zlp.execl.IndexItem; import com.zlp.execl.IndexMonitor; /** * @author zhangliping * 2015年4月20日 */ public class FileExportServlet extends HttpServlet { /* (non-Javadoc) * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { File file = new File(getServletContext() .getRealPath("book.jpg")); resp.setContentType("octets/stream"); resp.addHeader("Content-Disposition", "attachment;filename=test.xls"); IndexMonitor indexMonitor = new IndexMonitor(); indexMonitor.setExecuteTime("2012-12-21 20:00:00"); IndexItem indexItem = new IndexItem(); indexItem.setIndexName("tps"); indexItem.setIndexValue("20"); indexMonitor.setIndexItem(indexItem); List<IndexConfig> qosList = new ArrayList<IndexConfig>(); IndexConfig qosIndexConfig = new IndexConfig(); qosIndexConfig.setIndexName("响应时间"); qosIndexConfig.setIndexValue("220"); qosList.add(qosIndexConfig); IndexConfig qosIndexConfig3 = new IndexConfig(); qosIndexConfig3.setIndexName("响应时间3"); qosIndexConfig3.setIndexValue("330"); qosList.add(qosIndexConfig3); IndexConfig qosIndexConfig2 = new IndexConfig(); qosIndexConfig2.setIndexName("内存利用率"); qosIndexConfig2.setIndexValue("10%"); qosList.add(qosIndexConfig2); List<IndexConfig> resList = new ArrayList<IndexConfig>(); IndexConfig resIndexConfig = new IndexConfig(); resIndexConfig.setIndexName("cpu利用率"); resIndexConfig.setIndexValue("250"); resList.add(resIndexConfig); IndexConfig resIndexConfig2 = new IndexConfig(); resIndexConfig2.setIndexName("节点内存利用率"); resIndexConfig2.setIndexValue("20%"); resList.add(resIndexConfig2); IndexConfig resIndexConfig3 = new IndexConfig(); resIndexConfig3.setIndexName("节点2内存利用率"); resIndexConfig3.setIndexValue("50%"); resList.add(resIndexConfig3); indexMonitor.setQosList(qosList); indexMonitor.setResList(resList); List<String> headList = new ArrayList<String>(); headList.add("执行时间"); headList.add(indexMonitor.getIndexItem().getIndexName()); for (IndexConfig string : indexMonitor.getQosList()) { headList.add(string.getIndexName()); } for (IndexConfig string : indexMonitor.getResList()) { headList.add(string.getIndexName()); } for (int i = 0; i < headList.toArray().length; i++) { System.out.println(headList.toArray()[i]); } List<IndexMonitor> indexMonitorList = new ArrayList<IndexMonitor>(); indexMonitorList.add(indexMonitor); indexMonitorList.add(indexMonitor); indexMonitorList.add(indexMonitor); indexMonitorList.add(indexMonitor); // 测试图书 ExportExcel<Book> ex = new ExportExcel<Book>(); Object[] headers = headList.toArray(); List dataset = new ArrayList(); try { BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); byte[] buf = new byte[bis.available()]; while ((bis.read(buf)) != -1) { // 将图片数据存放到缓冲数组中 } dataset.add(indexMonitorList); OutputStream out = resp.getOutputStream(); ex.exportExcel(headers, indexMonitorList, out); out.close(); System.out.println("excel导出成功!"); // // 测试图书 // ExportExcel<Book> ex = new ExportExcel<Book>(); // String[] headers = { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社", // "封面图片" }; // List<Book> dataset = new ArrayList<Book>(); // try { // BufferedInputStream bis = new BufferedInputStream( // new FileInputStream(file)); // byte[] buf = new byte[bis.available()]; // while ((bis.read(buf)) != -1) { // // 将图片数据存放到缓冲数组中 // } // dataset.add(new Book(1, "jsp", "leno", 300.33f, "1234567", "清华出版社", // buf)); // dataset.add(new Book(2, "java编程思想", "brucl", 300.33f, "1234567", // "阳光出版社", buf)); // dataset.add(new Book(3, "DOM艺术", "lenotang", 300.33f, "1234567", // "清华出版社", buf)); // dataset.add(new Book(4, "c++经典", "leno", 400.33f, "1234567", // "清华出版社", buf)); // dataset.add(new Book(5, "c#入门", "leno", 300.33f, "1234567", // "汤春秀出版社", buf)); // OutputStream out = resp.getOutputStream(); // ex.exportExcel(headers, dataset, out); // out.close(); // System.out.println("excel导出成功!"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* (non-Javadoc) * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doGet(req, resp); } }
/** * */ package com.zlp.execl; /** * @author zhangliping * 2015年4月20日 */ 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> * 应用泛型,代表任意一个符合javabean风格的类 * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx() * byte[]表jpg格式的图片数据 */ public class ExportExcel<T> { public void exportExcel(List<T> dataset, OutputStream out) { exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd"); } public void exportExcel(Object[] headers, List dataset, OutputStream out) { exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd"); } public void exportExcel(String[] headers, List dataset, OutputStream out, String pattern) { exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern); } /** * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上 * * @param title * 表格标题名 * @param headers * 表格属性列名数组 * @param dataset * 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据) * @param out * 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 * @param pattern * 如果有时间数据,设定输出格式。默认为"yyy-MM-dd" */ @SuppressWarnings("unchecked") public void exportExcel(String title, Object[] headers, List dataset, OutputStream out, String pattern) { // 声明一个工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); // 生成一个表格 HSSFSheet sheet = workbook.createSheet(title); // 设置表格默认列宽度为15个字节 sheet.setDefaultColumnWidth((short) 15); // 生成一个样式 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); // 生成一个字体 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); // 声明一个画图的顶级管理器 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); for (short i = 0; i < headers.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString(headers[i].toString()); cell.setCellValue(text); } int index = 0; for (Iterator iterator = dataset.iterator(); iterator.hasNext();) { index++; row = sheet.createRow(index); IndexMonitor object = (IndexMonitor) iterator.next(); HSSFCell cell = row.createCell(0); cell.setCellValue(object.getExecuteTime()); HSSFCell cell2 = row.createCell(1); cell2.setCellValue(object.getIndexItem().getIndexValue()); List qosList = object.getQosList(); for (int i = 0; i < qosList.size(); i++) { IndexConfig indexConfig = (IndexConfig) qosList.get(i); HSSFCell cell3 = row.createCell(i+2); cell3.setCellValue(indexConfig.getIndexValue()); } List resList = object.getResList(); for (int i = 0; i < resList.size(); i++) { IndexConfig indexConfig = (IndexConfig) resList.get(i); HSSFCell cell3 = row.createCell(i+2+qosList.size()); cell3.setCellValue(indexConfig.getIndexValue()); } // // 利用反射,根据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); // // } // 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[]) { // // 有图片时,设置行高为60px; // row.setHeightInPoints(60); // // 设置图片所在列宽度为80px,注意这里单位的一个换算 // sheet.setColumnWidth(i, (short) (35.7 * 80)); // // sheet.autoSizeColumn(i); // byte[] bsValue = (byte[]) value; // HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, // 1023, 255, (short) 6, index, (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) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (IllegalArgumentException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (IllegalAccessException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (InvocationTargetException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } finally { // // 清理资源 // } // } } try { workbook.write(out); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { // 测试学生 ExportExcel<Student> ex = new ExportExcel<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())); // 测试图书 ExportExcel<Book> ex2 = new ExportExcel<Book>(); String[] headers2 = { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社", "封面图片" }; List<Book> dataset2 = new ArrayList<Book>(); try { BufferedInputStream bis = new BufferedInputStream( new FileInputStream("C:/book.jpg")); 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)); File file1 = new File("d:/a.xls"); if(!file1.exists()) { file1.createNewFile(); } File file2 = new File("d:/b.xls"); if (!file2.exists()) { file2.createNewFile(); } OutputStream out = new FileOutputStream("d:/a.xls"); OutputStream out2 = new FileOutputStream("d:/b.xls"); ex.exportExcel(headers, dataset, out); ex2.exportExcel(headers2, dataset2, out2); out.close(); JOptionPane.showMessageDialog(null, "导出成功!"); System.out.println("excel导出成功!"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
<a href="FileExportServlet" target="_bank" >下载</a>
设置单元格样式为:背景是绿色 字体红色
HSSFCellStyle style3 = workbook.createCellStyle(); style3.setFillForegroundColor(IndexedColors.GREEN.getIndex()); style3.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFFont font3 = workbook.createFont(); font3.setColor(IndexedColors.RED.getIndex()); style3.setFont(font3); cell3.setCellStyle(style3);
而且sheet页的名称最长为31位