java操作excell工具类
2016-06-01 17:55
423 查看
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @Title: ExcelUtil.java * @Description: * @DateTime: 2015年12月2日下午6:17:18 * @Version: 1.0.0 */ public class ExcelUtil { private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class); /** * 创建excel文档, * @param list 数据 * @param keys list中map的key数组集合 * @param columnNames excel的列名 * */ public static Workbook createWorkBook(List<Map<String, Object>> list,String []keys,String columnNames[]) { // 创建excel工作簿 Workbook wb = new HSSFWorkbook(); // 创建第一个sheet(页),并命名 Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString()); // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。 for(int i=0;i<keys.length;i++){ sheet.setColumnWidth((short) i, (short) (35.7 * 150)); } // 创建第一行 Row row = sheet.createRow((short) 0); // 创建两种单元格格式 CellStyle cs = wb.createCellStyle(); CellStyle cs2 = wb.createCellStyle(); // 创建两种字体 org.apache.poi.ss.usermodel.Font f = wb.createFont(); org.apache.poi.ss.usermodel.Font f2 = wb.createFont(); // 创建第一种字体样式(用于列名) f.setFontHeightInPoints((short) 10); f.setColor(IndexedColors.BLACK.getIndex()); // f.setBoldweight(Font.BOLDWEIGHT_BOLD); // 创建第二种字体样式(用于值) f2.setFontHeightInPoints((short) 10); f2.setColor(IndexedColors.BLACK.getIndex()); // Font f3=wb.createFont(); // f3.setFontHeightInPoints((short) 10); // f3.setColor(IndexedColors.RED.getIndex()); // 设置第一种单元格的样式(用于列名) cs.setFont(f); cs.setBorderLeft(CellStyle.BORDER_THIN); cs.setBorderRight(CellStyle.BORDER_THIN); cs.setBorderTop(CellStyle.BORDER_THIN); cs.setBorderBottom(CellStyle.BORDER_THIN); cs.setAlignment(CellStyle.ALIGN_CENTER); // 设置第二种单元格的样式(用于值) cs2.setFont(f2); cs2.setBorderLeft(CellStyle.BORDER_THIN); cs2.setBorderRight(CellStyle.BORDER_THIN); cs2.setBorderTop(CellStyle.BORDER_THIN); cs2.setBorderBottom(CellStyle.BORDER_THIN); cs2.setAlignment(CellStyle.ALIGN_CENTER); //设置列名 for(int i=0;i<columnNames.length;i++){ Cell cell = row.createCell(i); cell.setCellValue(columnNames[i]); cell.setCellStyle(cs); } //设置每行每列的值 for (short i = 1; i < list.size(); i++) { // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的 // 创建一行,在页sheet上 Row row1 = sheet.createRow((short) i); // 在row行上创建一个方格 for(short j=0;j<keys.length;j++){ Cell cell = row1.createCell(j); cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString()); cell.setCellStyle(cs2); } } return wb; } /** * 导出Excel文件静态方法 * * @param fileName 导出Excel文件名称 * @param keys 导出数据中Map的key数组 * @param list 导出Excel的数据 * @param columnNames 导出Excel文件列名数组 * @param response */ public static void exportExcel(String fileName,List<Map<String, Object>> list,String[] keys,String[] columnNames,HttpServletResponse response){ if(null == list || list.size() <= 0){ return; } ServletOutputStream out = null; BufferedInputStream bis = null; BufferedOutputStream bos = null; try{ out = response.getOutputStream(); ByteArrayOutputStream os = new ByteArrayOutputStream(); //创建Excel文档 ExcelUtil.createWorkBook(list, keys, columnNames).write(os); byte[] content = os.toByteArray(); InputStream is = new ByteArrayInputStream(content); // 设置response参数,可以打开下载页面 response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xls").getBytes(), "iso-8859-1")); bis = new BufferedInputStream(is); bos = new BufferedOutputStream(out); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))){ bos.write(buff, 0, bytesRead); } }catch(Exception e){ logger.error(e.getMessage(),e); throw new ServiceException(e.getMessage()); }finally { try { if (bis != null) bis.close(); if (bos != null) bos.close(); } catch (IOException e) { logger.error(e.getMessage(),e); } } } }
相关文章推荐
- Java基础--递归算法
- Java设计模式(十):装饰者模式Decorator
- Spring RMI学习
- java日期工具类
- 各种排序算法的分析及其Java代码的实现
- Eclipse中的制表符改为四个空格
- Spring Bean的命名(学习笔记)
- java 动态代理总结
- springmvc+ibatis 项目命名规范
- Struts2登录拦截器的简单示例
- Java中ArrayList和LinkedList区别
- 定时任务实现方法总结与分析
- Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法
- Java中关于 单例 多例 单线程 多线程
- Netty之Java堆外内存扫盲
- java.lang.OutOfMemoryError: PermGen space
- 理解java动态代理
- java源码分析(7)-Throwable
- 6.1JAVA基础
- Java并发编程:volatile关键字解析