Java使用Poi导出Excel表格方法实例
一、导出下面的表格
二、流程详解
1、导出excel需要先将数据准备好
2、创建工作傅对象SXSSFWorkbook
3、使用工作傅对象创建sheet对象(工作页)
4、使用sheet对象创建行对象row(行对象)
5、使用row对象创建cell对象(单元格对象)
6、将数据依次插入对应的单元格
7、创建excel文件,写入数据
三、代码
3.1、依赖
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency>
注意:本文使用的是SXSSFSheet对象,所以使用的是上面的依赖
3.2、主要代码
3.2.1、实体类
import lombok.Data; @Data public class MyCell { private int top; private int below; private int left; private int right; public MyCell(){} public MyCell(int top,int below,int left,int right){ this.top = top; this.below = below; this.left = left; this.right = right; } }
3.2.2、工具类
public class ExportUtil { public static void main(String[] args) { //1、准备数据 List<HashMap<String,List<List<String>>>> list = new ArrayList<>();//存放一个excel文件所有数据(可放多个sheet页) HashMap<String,List<List<String>>> map = new HashMap<>();//存放一个sheet页所有数据 List<List<String>> titleList = new ArrayList<>();//存放一个sheet页表头数据 List<List<String>> bodyList = new ArrayList<>();//存放一个sheet页表体数据 List<String> title = new ArrayList<>();//存一行表头数据 List<String> body = null;//存一行表体数据 int length = 8;//-------------------------每行8个数据,即8列表格 title.add("报表表体"); for (int i = 0; i < 7; i++) { title.add(""); } titleList.add(title);//把第一行表头数据放入titleList title = new ArrayList<>(); title.add("代码 : 000000"); for (int i = 0; i < 3; i++){ title.add(""); } title.add("报告期 : 2023年6月"); for (int i = 0; i < length - 5; i++){ title.add(""); } titleList.add(title);//把第二行表头数据放入titleList String str1 = ""; for (int i = 0; i <= 8; i++){//放8行表体数据 body = new ArrayList<>(); for (int j = 0; j < length; j++) { body.add(i + 1 + "行" + (j + 1) + "列"); } bodyList.add(body);//把第i行表体数据放入bodyList } map.put("title_key",titleList);//把一个sheet页表头数据放入map map.put("body_key",bodyList);//把一个sheet页表体数据放入map list.add(map);//把一个sheet页的所有数据放list //--------------------------------------------------------------数据已准备完毕 //2、创建工作傅(即一个excel对象,可以包含多个sheet对象) SXSSFWorkbook wb = new SXSSFWorkbook(500);//创建一个工作副本,保留500条数据在内存中 for (int i = 0;i < list.size(); i++){ HashMap<String,List<List<String>>> map1 = list.get(i);//获取一个sheet页的所有数据 exportExcelFiles(wb,map1,"第一页");//将一个sheet页的所有数据插入wb对象中 } //--------------------------------------------------------------数据已插入完毕 //3、创建excel文件,并写入数据 FileOutputStream fos = null; File file = new File("D:\\" + "00年的大帅哥" + ".xls"); try { fos = new FileOutputStream(file); wb.write(fos);//写入数据 } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } System.out.println("------------导出成功-------------"); } } //插入数据 public static void exportExcelFiles(SXSSFWorkbook wb,HashMap<String,List<List<String>>> map,String name) { //1、准备数据 List<List<String>> head = map.get("title_key");//取出表头数据 List<List<String>> body = map.get("body_key");//取出表体数据 int rowEleCount = body.get(0).size();//表体一共多少列 //2、创建一个sheet对象并插入数据 SXSSFSheet sheet = wb.createSheet(name);//创建一个工作页,并设置sheet的name //wb.setSheetName(0,name);//设置sheet名字,可以根据下标设置sheet的name sheet.setDefaultColumnWidth(20);//设置默认列宽 mergeCell(sheet,rowEleCount);//---------------------------------------------------------先合并表头的单元格 List<CellStyle> headStyleList = getHeadCellStyleList(wb);// 获取一个表头样式集合 List<CellStyle> bodyStyleList = getBodyCellStyleList(wb);// 获取一个表体样式集合 setExcelHead(sheet,head,headStyleList);// 插入表头数据 setExcelBody(sheet,body,bodyStyleList);// 插入表体数据 } // 合并表头 public static void mergeCell(SXSSFSheet sheet,int rowEleCount) { List<MyCell> listMerge = new ArrayList<>();//存储前3行合并单元格的信息 MyCell myCell1 = new MyCell(0,0,0,rowEleCount); listMerge.add(myCell1); MyCell myCell2 = new MyCell(1,2,0,3); listMerge.add(myCell2); MyCell myCell3 = new MyCell(1,2,4,rowEleCount); listMerge.add(myCell3); for (int i = 0; i < listMerge.size() ; i++){ sheet.addMergedRegion(new CellRangeAddress(listMerge.get(i).getTop(),//开始行 listMerge.get(i).getBelow(),//结束行 listMerge.get(i).getLeft(),//开始列 listMerge.get(i).getRight()));//结束列 } } //插入表头数据 public static void setExcelHead(SXSSFSheet sheet, List<List<String>> head,List<CellStyle> cellStyleList) { int rowNum = head.size();//表头有几行 int rowElementNum = head.get(0).size();//每行有几列 SXSSFRow row = null;//声明一个行对象 SXSSFCell cell = null;//声明一个列对象(即一个单元格对象) for (int i = 0; i < rowNum; i++){ row = sheet.createRow(i);//创建第 i + 1 行的行对象 //设置行高 if(i == 1 || i == 2){//将第二行和第三行的行高设置为400 row.setHeight((short) 400); } for(int j = 0; j < rowElementNum; j++) { cell = row.createCell(j);//创建第 i + 1 行,第 j + 1 列的单元格 cell.setCellValue(head.get(i).get(j));//设置单元格内容(插入数据) //设置表头样式 switch (i){ case 0: cell.setCellStyle(cellStyleList.get(0));//将第一行设置为上下左右居中,单元格无边框,字体:等线,字号:12 break; default: switch (j){ case 0: cell.setCellStyle(cellStyleList.get(1));//将第二行第1个单元格设置为靠左,单元格无边框,上下居中,字体:等线,字号:10 break; case 4: cell.setCellStyle(cellStyleList.get(2));//将第二行第5个单元格设置上下左右居中,单元格无边框,字体:等线,字号:10 break; default: cell.setCellStyle(cellStyleList.get(3));//其他单元格 } } } } } //插入表体数据 public static void setExcelBody(SXSSFSheet sheet, List<List<String>> body,List<CellStyle> bodyStyleList) { int rowNum = body.size();//表体有几行 int rowElementNum = body.get(0).size();//每行有几列 List<String> rowList = null;//声明一个行数据集合 SXSSFRow row = null;//声明一个行对象 SXSSFCell cell = null;//声明一个单元格对象 for (int i = 3; i < rowNum + 3; i++) {//前3行是表头,从第4行开始创建行对象 row = sheet.createRow(i);//创建行对象 //将第4行行高设为600 if(i == 3){ row.setHeight((short)600); } rowList = body.get(i - 3);//取出表体的一行数据 for (int j = 0; j < rowList.size() ; j++){ cell = row.createCell(j);//创建第 i + 1 行,第 j + 1 列的单元格 cell.setCellValue(rowList.get(j));//设置单元格内容(插入数据) //设置单元格数据样式 switch (i){ case 3: cell.setCellStyle(bodyStyleList.get(3));//第4行设置为上下左右居中,单元格有边框,字体:等线,字号:10 break; case 4: cell.setCellStyle(bodyStyleList.get(3));//第5行设置为上下左右居中,单元格有边框,字体:等线,字号:10 break; default: switch (j){ case 0: cell.setCellStyle(bodyStyleList.get(0));//其他行第一列设置为靠左,上下居中,单元格有左右边框,无上下边框,字体:等线,字号:10 break; case 1: cell.setCellStyle(bodyStyleList.get(1));//其他行第二列设置为靠左,上下居中,单元格有左右边框,无上下边框,字体:等线,字号:10 break; default: cell.setCellStyle(bodyStyleList.get(2));//其他行其他列设置为上下左右居中,单元格有左右边框,无上下边框,字体:等线,字号:10 } } } } } //获取表头样式集合 private static List<CellStyle> getHeadCellStyleList(SXSSFWorkbook wb) { List<CellStyle> cellStyleList = new ArrayList<>(); CellStyle bodyStyle1 = headStyle1(wb); CellStyle bodyStyle2 = headStyle2(wb); CellStyle bodyStyle3 = headStyle3(wb); CellStyle bodyStyle4 = headStyle3(wb); cellStyleList.add(bodyStyle1); cellStyleList.add(bodyStyle2); cellStyleList.add(bodyStyle3); cellStyleList.add(bodyStyle4); return cellStyleList; } //获取表体样式集合 private static List<CellStyle> getBodyCellStyleList(SXSSFWorkbook wb) { List<CellStyle> list = new ArrayList<>(); CellStyle cellStyle1 = bodyStyle1(wb); CellStyle cellStyle2 = bodyStyle2(wb); CellStyle cellStyle3 = bodyStyle3(wb); CellStyle cellStyle4 = bodyStyle4(wb); list.add(cellStyle1); list.add(cellStyle2); list.add(cellStyle3); list.add(cellStyle4); return list; } //字体 public static Font getFont(SXSSFWorkbook wb,String fontName,int height){ Font font = wb.createFont(); //font.setBoldweight((short) 10);// 设置字体的宽度 //font.setFontHeightInPoints((short) height);// 设置字体的高度 //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示 font.setFontHeightInPoints((short)height);//设置字号 font.setFontName(fontName);//设置字体(输入字体名) return font; } //表头样式1 public static CellStyle headStyle1(SXSSFWorkbook wb) { CellStyle style1 = wb.createCellStyle();// 样式对象 // 设置单元格上、下、左、右的边框线 style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框 style1.setBorderBottom(HSSFCellStyle.BORDER_NONE); style1.setBorderLeft(HSSFCellStyle.BORDER_NONE); style1.setBorderRight(HSSFCellStyle.BORDER_NONE); Font font = getFont(wb,"等线",12);// 创建一个字体对象 style1.setFont(font);// 设置style1的字体 //style1.setWrapText(true);// 设置自动换行 style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向) style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向) return style1; } //表头样式2 public static CellStyle headStyle2(SXSSFWorkbook wb) { CellStyle style1 = wb.createCellStyle();// 样式对象 // 设置单元格上、下、左、右的边框线 style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框 style1.setBorderLeft(HSSFCellStyle.BORDER_NONE); style1.setBorderRight(HSSFCellStyle.BORDER_NONE); style1.setBorderTop(HSSFCellStyle.BORDER_NONE); Font font = getFont(wb,"等线",10);// 创建一个字体对象 style1.setFont(font);// 设置style1的字体 //style1.setWrapText(true);// 设置自动换行 style1.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 设置单元格字体显示居中(左右方向) style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_BOTTOM);// 设置单元格字体显示居中(上下方向) return style1; } //表头样式3 public static CellStyle headStyle3(SXSSFWorkbook wb) { CellStyle style1 = wb.createCellStyle();// 样式对象 // 设置单元格上、下、左、右的边框线 style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框 style1.setBorderLeft(HSSFCellStyle.BORDER_NONE); style1.setBorderRight(HSSFCellStyle.BORDER_NONE); style1.setBorderTop(HSSFCellStyle.BORDER_NONE); Font font = getFont(wb,"等线",10);// 创建一个字体对象 style1.setFont(font);// 设置style1的字体 //style1.setWrapText(true);// 设置自动换行 style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向) style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向) return style1; } //表体样式1 public static CellStyle bodyStyle1(SXSSFWorkbook wb) { // 设置style1的样式,此样式运用在第二行 CellStyle style = wb.createCellStyle();//样式对象 // 设置单元格上、下、左、右的边框线 style.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框 style.setBorderBottom(HSSFCellStyle.BORDER_NONE); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); Font font = getFont(wb,"等线",10);// 创建一个字体对象 style.setFont(font);// 设置style1的字体 //style1.setWrapText(true);// 设置自动换行 style.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 设置单元格字体显示靠左(左右方向) style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向) return style; } //表体样式2 public static CellStyle bodyStyle2(SXSSFWorkbook wb) { // 设置style1的样式,此样式运用在第二行 CellStyle style1 = wb.createCellStyle();// 样式对象 // 设置单元格上、下、左、右的边框线 style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框 style1.setBorderBottom(HSSFCellStyle.BORDER_NONE); style1.setBorderLeft(HSSFCellStyle.BORDER_THIN); style1.setBorderRight(HSSFCellStyle.BORDER_THIN); Font font = getFont(wb,"等线",10);// 创建一个字体对象 style1.setFont(font);// 设置style1的字体 //style1.setWrapText(true);// 设置自动换行 style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向) style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向) return style1; } //表体样式3 public static CellStyle bodyStyle3(SXSSFWorkbook wb) { // 设置style1的样式,此样式运用在第二行 CellStyle style1 = wb.createCellStyle();//样式对象 // 设置单元格上、下、左、右的边框线 style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框 style1.setBorderBottom(HSSFCellStyle.BORDER_NONE); style1.setBorderLeft(HSSFCellStyle.BORDER_THIN); style1.setBorderRight(HSSFCellStyle.BORDER_THIN); Font font = getFont(wb,"等线",10);// 创建一个字体对象 style1.setFont(font);// 设置style1的字体 //style1.setWrapText(true);// 设置自动换行 style1.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 设置单元格字体显示靠右(左右方向) style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向) return style1; } //表体样式4 public static CellStyle bodyStyle4(SXSSFWorkbook wb) { // 设置style1的样式 CellStyle style1 = wb.createCellStyle();//样式对象 // 设置单元格上、下、左、右的边框线 style1.setBorderTop(HSSFCellStyle.BORDER_THIN);//NONE为不显示边框,THIN为显示边框 style1.setBorderBottom(HSSFCellStyle.BORDER_THIN); style1.setBorderLeft(HSSFCellStyle.BORDER_THIN); style1.setBorderRight(HSSFCellStyle.BORDER_THIN); Font font = getFont(wb,"等线",10);// 创建一个字体对象 style1.setFont(font);// 设置style1的字体 //style1.setWrapText(true);// 设置自动换行 style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向) style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向) return style1; } }
设置样式,如字体、单元格等(详细的可以去看官方文档)
// 设置单元格的横向和纵向对齐方式, cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY); cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //设置背景颜色 cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
四、总结
单元格合并,单元格样式、字体样式,在代码中都有注释,上述代码,讲述了复杂excel的导出,可以导出多个sheet页,可自己准备数据测试
到此这篇关于Java使用Poi导出Excel表格的文章就介绍到这了,更多相关Java Poi导出Excel表格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
最新评论