Jakarta poi导出excel文件
- 简述
excel导出功能是java常用的功能之一,主要应用于导出数据列表,报表以及特定格式模板等。
目前常用的Excel的技术有两种Jakarta POI和Java Excel。
Jakarta POI是Apache软件基金会的开放源码函式库,它提供API给java程序对microsoft格式档案实现读和写功能。
5种功能:
HSSF-读写Microsoft Excel文档功能(应用最广)
HWPF-读写Microsoft Word文档功能
HSLF-读写Microsoft PowerPoint文档功能
HDGF-读写Microsoft Visio文档功能
XSSF-读写Microsoft EXCEL XML文档功能
- HSSF使用
2.1 引入依赖
使用HSSF,需要引入apache依赖。若已存在,可忽略。
1 <dependency> 2 3 <groupId>org.apache.poi</groupId> 4 5 <artifactId>poi</artifactId> 6 7 <version>3.15</version> 8 9 </dependency>
2.2 HSSF API 组件
HSSF提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象:2.3 生成excel例子
一个excel文件 →→→ 一个workbook(HSSFWorkbook);
一个workbook →→→ 多个sheet(HSSFSheet);
一个sheet →→→ 多个row(HSSFRow);
一个row →→→ 多个cell(HSSFCell);1 //创建HSSFWorkbook对象 2 HSSFWorkbook wb = new HSSFWorkbook(); 3 //创建HSSFSheet对象 4 HSSFSheet sheet = wb.createSheet("sheet0"); 5 //创建HSSFRow对象 6 HSSFRow row = sheet.createRow(0); 7 //创建HSSFCell对象 8 HSSFCell cell=row.createCell(0); 9 //设置单元格的值 10 cell.setCellValue("单元格中的中文"); 11 //输出Excel文件 12 FileOutputStream output=new FileOutputStream("d:\\workbook.xls"); 13 wkb.write(output); 14 output.flush();
- excel导出案例
使用HSSF导出简易excel表格。
1 package com.ytd.ebos.base.db.security; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.OutputStream; 7 import java.util.ArrayList; 8 import java.util.HashMap; 9 import java.util.List; 10 import java.util.Map; 11 import java.util.Map.Entry; 12 13 import org.apache.poi.hssf.usermodel.HSSFCell; 14 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 15 import org.apache.poi.hssf.usermodel.HSSFFont; 16 import org.apache.poi.hssf.usermodel.HSSFRow; 17 import org.apache.poi.hssf.usermodel.HSSFSheet; 18 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 19 import org.apache.poi.hssf.util.HSSFColor; 20 21 public class ExportExceltest { 22 23 public static void main(String[] args) throws IOException { 24 // 创建输出流 25 OutputStream out=new FileOutputStream(new File("d://a.xls")); 26 // 模拟数据 27 List<Map<String,String>> data=new ArrayList<>(); 28 Map<String,String> map=new HashMap<>(); 29 map.put("姓名", "小文"); 30 map.put("颜值", "帅气"); 31 map.put("财富值", "8"); 32 data.add(map); 33 Map<String,String> map1=new HashMap<>(); 34 map1.put("姓名", "小静"); 35 map1.put("颜值", "貌美"); 36 map1.put("财富值", "7"); 37 data.add(map1); 38 // 创建工作表 39 HSSFWorkbook workbook=new HSSFWorkbook(); 40 exportexcelutil(workbook,0,"花名单",data); 41 // 写入文件 42 workbook.write(out); 43 out.close(); 44 } 45 /** 46 * 导出excel工具方法 47 * @param workbook 工作簿 48 * @param sheetnum sheet序号 49 * @param sheetname sheet名称 50 * @param data 数据 51 */ 52 public static void exportexcelutil(HSSFWorkbook workbook,int sheetnum,String sheetname,List<Map<String,String>> data){ 53 //创建sheet 54 HSSFSheet Sheet = workbook.createSheet(); 55 //设置sheet名称 56 workbook.setSheetName(sheetnum, sheetname); 57 //设置表格应用样式 58 HSSFCellStyle style=workbook.createCellStyle(); 59 style.setFillForegroundColor(HSSFColor.GOLD.index); 60 HSSFFont font=workbook.createFont(); 61 font.setFontName("思源宋体"); 62 font.setColor(HSSFColor.RED.index); 63 style.setFont(font); 64 //创建标题行 65 HSSFRow Row = Sheet.createRow(0); 66 List<String> head=new ArrayList<>(); 67 for (Entry<String, String> map : data.get(0).entrySet()) { 68 head.add(map.getKey()); 69 } 70 for (int i = 0; i < head.size(); i++) { 71 HSSFCell Cell = Row.createCell(i); 72 Cell.setCellStyle(style); //应用样式 73 Cell.setCellValue(head.get(i)); 74 } 75 // 写入数据 76 for (int i = 0; i < data.size(); i++) { 77 Row = Sheet.createRow(i+1); 78 int k=0; 79 for (Entry<String, String> map : data.get(i).entrySet()) { 80 HSSFCell Cell = Row.createCell(k); 81 Cell.setCellValue(map.getValue()); 82 k++; 83 } 84 } 85 } 86 87 }
导出excel文件如下:
- excel导出工具类
1 import java.io.ByteArrayOutputStream; 2 import java.io.IOException; 3 import java.lang.reflect.Field; 4 import java.util.List; 5 import java.util.logging.Level; 6 import java.util.logging.Logger; 7 import org.apache.poi.hssf.usermodel.HSSFCell; 8 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 9 import org.apache.poi.hssf.usermodel.HSSFFont; 10 import org.apache.poi.hssf.usermodel.HSSFRow; 11 import org.apache.poi.hssf.usermodel.HSSFSheet; 12 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 13 import org.apache.poi.ss.usermodel.VerticalAlignment; 14 import org.apache.poi.ss.util.CellRangeAddress; 15 16 /** 17 * 18 * @描述 Excel 导出通用工具类 19 */ 20 public class ExcelUtil { 21 22 public static byte[] export(String sheetTitle, String[] title, List<Object> list) { 23 24 HSSFWorkbook wb = new HSSFWorkbook();//创建excel表 25 HSSFSheet sheet = wb.createSheet(sheetTitle); 26 sheet.setDefaultColumnWidth(20);//设置默认行宽 27 28 //表头样式(加粗,水平居中,垂直居中) 29 HSSFCellStyle cellStyle = wb.createCellStyle(); 30 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 31 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 32 //设置边框样式 33 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框 34 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框 35 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框 36 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 37 38 HSSFFont fontStyle = wb.createFont(); 39 fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 40 41 cellStyle.setFont(fontStyle); 42 43 //标题样式(加粗,垂直居中) 44 HSSFCellStyle cellStyle2 = wb.createCellStyle(); 45 cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 46 cellStyle2.setFont(fontStyle); 47 48 //设置边框样式 49 cellStyle2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框 50 cellStyle2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框 51 cellStyle2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框 52 cellStyle2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 53 54 //字段样式(垂直居中) 55 HSSFCellStyle cellStyle3 = wb.createCellStyle(); 56 cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中 57 58 //设置边框样式 59 cellStyle3.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框 60 cellStyle3.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框 61 cellStyle3.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框 62 cellStyle3.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 63 64 //创建表头 65 HSSFRow row = sheet.createRow(0); 66 row.setHeightInPoints(20);//行高 67 68 HSSFCell cell = row.createCell(0); 69 cell.setCellValue(sheetTitle); 70 cell.setCellStyle(cellStyle); 71 72 sheet.addMergedRegion(new CellRangeAddress(0,0,0,(title.length-1))); 73 74 //创建标题 75 HSSFRow rowTitle = sheet.createRow(1); 76 rowTitle.setHeightInPoints(20); 77 78 HSSFCell hc; 79 for (int i = 0; i < title.length; i++) { 80 hc = rowTitle.createCell(i); 81 hc.setCellValue(title[i]); 82 hc.setCellStyle(cellStyle2); 83 } 84 85 byte result[] = null; 86 87 ByteArrayOutputStream out = null; 88 89 try { 90 //创建表格数据 91 Field[] fields; 92 int i = 2; 93 94 for (Object obj : list) { 95 fields = obj.getClass().getDeclaredFields(); 96 97 HSSFRow rowBody = sheet.createRow(i); 98 rowBody.setHeightInPoints(20); 99 100 int j = 0; 101 for (Field f : fields) { 102 103 f.setAccessible(true); 104 105 Object va = f.get(obj); 106 if (null == va) { 107 va = ""; 108 } 109 110 hc = rowBody.createCell(j); 111 hc.setCellValue(va.toString()); 112 hc.setCellStyle(cellStyle3); 113 114 j++; 115 } 116 117 i++; 118 } 119 120 out = new ByteArrayOutputStream(); 121 wb.write(out); 122 result = out.toByteArray(); 123 } catch (Exception ex) { 124 Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex); 125 } finally{ 126 try { 127 if(null != out){ 128 out.close(); 129 } 130 } catch (IOException ex) { 131 Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex); 132 } finally{ 133 try { 134 wb.close(); 135 } catch (IOException ex) { 136 Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex); 137 } 138 } 139 } 140 141 return result; 142 } 143 }
- 常用操作
●合并单元格
sheet.addMergedRegion(newCellRangeAddress(0, 0, 0, 6)); //起始行,结束行,起始列,终止列(6表示第七列)
●单元格居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
●设置自适应列宽
sheet.autoSizeColumn(0); - 分析
在使用java做系统功能设计时,有许多数据列表需要添加excel导出功能。该功能使用的技术简单至极,无非引用一个外部API,按照步骤调用相关方法即可,因此许多人不屑于去研究该技术,百度一搜索相关博客满屏都是,随便拷贝一个即可。甚至大部分公司都已封装该功能,使用时按约定调用,节省大量时间。
然而越简单的技术,实用性却越高,延展性也更强。excel导出也可往细处继续划分,按模板导出,导出花哨样式,导出公式等;只有真正去理解该技术时,才不会被复杂苛刻的需求难倒,万变不离其宗,掌握核心技术。
入行1年8个月,这是我的第一篇博客,说来惭愧。曾在脑海中写了数十篇博客,并且还使用自己搭建的网站,但到真正写的时候才感觉行动跟不上思维。万事开头难,加油做好每一步,立个flag,今年末完成10篇技术博客。