Springboot+Poi实现Excel的导入导出
一、poi简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
1、HSSF:HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
2、POI EXCEL文档结构类
- HSSFWorkbook excel文档对象
- HSSFSheet excel的sheet HSSFRow excel的行
- HSSFCell excel的单元格 HSSFFont excel字体
- HSSFName 名称 HSSFDataFormat 日期格式
- HSSFHeader sheet头
- HSSFFooter sheet尾
- HSSFCellStyle cell样式
- HSSFDateUtil 日期
- HSSFPrintSetup 打印
- HSSFErrorConstants 错误信息表
3、导入Excel常用的方法:
- POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:/test.xls"));
- HSSFWorkbook wb = new HSSFWorkbook(fs); //得到Excel工作簿对象
- HSSFSheet sheet = wb.getSheetAt(0); //得到Excel工作表对象
- HSSFRow row = sheet.getRow(i); //得到Excel工作表的行
- HSSFCell cell = row.getCell((short) j); //得到Excel工作表指定行的单元格
- cellStyle = cell.getCellStyle(); //得到单元格样式
4、导出Excel常用的方法:
- HSSFWorkbook wb = new HSSFWorkbook(); //创建Excel工作簿对象
- HSSFSheet sheet = wb.createSheet("new sheet"); //创建Excel工作表对象
- HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行
- cellStyle = wb.createCellStyle(); //创建单元格样式
- row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格
- row.createCell((short)0).setCellValue(1); //设置Excel工作表的值
二、springboot整合poi
主要是springboot+myBatis+poi+mysql的简单应用,从数据库查询到结果集导出excel到本地,从本地中的excel文件导入到数据库表中。
1、添加依赖
[code]<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>RELEASE</version> </dependency>
2、创建一个ExcelUtil类,这里的实现比较简单
[code]package com.example.demo.utils; import com.example.demo.entity.ExcelData; import com.example.demo.entity.User; import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import javax.servlet.http.HttpServletResponse; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import static org.apache.poi.ss.usermodel.CellType.*; /** * 路径:com.example.demo.utils * 类名: * 功能:导入导出 * 备注: * 创建人:typ * 创建时间:2018/10/19 11:21 * 修改人: * 修改备注: * 修改时间: */ @Slf4j public class ExcelUtil { /** * 方法名:exportExcel * 功能:导出Excel * 描述: * 创建人:typ * 创建时间:2018/10/19 16:00 * 修改人: * 修改描述: * 修改时间: */ public static void exportExcel(HttpServletResponse response, ExcelData data) { log.info("导出解析开始,fileName:{}",data.getFileName()); try { //实例化HSSFWorkbook HSSFWorkbook workbook = new HSSFWorkbook(); //创建一个Excel表单,参数为sheet的名字 HSSFSheet sheet = workbook.createSheet("sheet"); //设置表头 setTitle(workbook, sheet, data.getHead()); //设置单元格并赋值 setData(sheet, data.getData()); //设置浏览器下载 setBrowser(response, workbook, data.getFileName()); log.info("导出解析成功!"); } catch (Exception e) { log.info("导出解析失败!"); e.printStackTrace(); } } /** * 方法名:setTitle * 功能:设置表头 * 描述: * 创建人:typ * 创建时间:2018/10/19 10:20 * 修改人: * 修改描述: * 修改时间: */ private static void setTitle(HSSFWorkbook workbook, HSSFSheet sheet, String[] str) { try { HSSFRow row = sheet.createRow(0); //设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度 for (int i = 0; i <= str.length; i++) { sheet.setColumnWidth(i, 15 * 256); } //设置为居中加粗,格式化时间格式 HSSFCellStyle style = workbook.createCellStyle(); HSSFFont font = workbook.createFont(); font.setBold(true); style.setFont(font); style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); //创建表头名称 HSSFCell cell; for (int j = 0; j < str.length; j++) { cell = row.createCell(j); cell.setCellValue(str[j]); cell.setCellStyle(style); } } catch (Exception e) { log.info("导出时设置表头失败!"); e.printStackTrace(); } } /** * 方法名:setData * 功能:表格赋值 * 描述: * 创建人:typ * 创建时间:2018/10/19 16:11 * 修改人: * 修改描述: * 修改时间: */ private static void setData(HSSFSheet sheet, List<String[]> data) { try{ int rowNum = 1; for (int i = 0; i < data.size(); i++) { HSSFRow row = sheet.createRow(rowNum); for (int j = 0; j < data.get(i).length; j++) { row.createCell(j).setCellValue(data.get(i)[j]); } rowNum++; } log.info("表格赋值成功!"); }catch (Exception e){ log.info("表格赋值失败!"); e.printStackTrace(); } } /** * 方法名:setBrowser * 功能:使用浏览器下载 * 描述: * 创建人:typ * 创建时间:2018/10/19 16:20 * 修改人: * 修改描述: * 修改时间: */ private static void setBrowser(HttpServletResponse response, HSSFWorkbook workbook, String fileName) { try { //清空response response.reset(); //设置response的Header response.addHeader("Content-Disposition", "attachment;filename=" + fileName); OutputStream os = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/vnd.ms-excel;charset=gb2312"); //将excel写入到输出流中 workbook.write(os); os.flush(); os.close(); log.info("设置浏览器下载成功!"); } catch (Exception e) { log.info("设置浏览器下载失败!"); e.printStackTrace(); } } /** * 方法名:importExcel * 功能:导入 * 描述: * 创建人:typ * 创建时间:2018/10/19 11:45 * 修改人: * 修改描述: * 修改时间: */ public static List<Object[]> importExcel(String fileName) { log.info("导入解析开始,fileName:{}",fileName); try { List<Object[]> list = new ArrayList<>(); InputStream inputStream = new FileInputStream(fileName); Workbook workbook = WorkbookFactory.create(inputStream); Sheet sheet = workbook.getSheetAt(0); //获取sheet的行数 int rows = sheet.getPhysicalNumberOfRows(); for (int i = 0; i < rows; i++) { //过滤表头行 if (i == 0) { continue; } //获取当前行的数据 Row row = sheet.getRow(i); Object[] objects = new Object[row.getPhysicalNumberOfCells()]; int index = 0; for (Cell cell : row) { if (cell.getCellType().equals(NUMERIC)) { objects[index] = (int) cell.getNumericCellValue(); } if (cell.getCellType().equals(STRING)) { objects[index] = cell.getStringCellValue(); } if (cell.getCellType().equals(BOOLEAN)) { objects[index] = cell.getBooleanCellValue(); } if (cell.getCellType().equals(ERROR)) { objects[index] = cell.getErrorCellValue(); } index++; } list.add(objects); } log.info("导入文件解析成功!"); return list; }catch (Exception e){ log.info("导入文件解析失败!"); e.printStackTrace(); } return null; } //测试导入 public static void main(String[] args) { try { String fileName = "f:/test.xlsx"; List<Object[]> list = importExcel(fileName); for (int i = 0; i < list.size(); i++) { User user = new User(); user.setId((Integer) list.get(i)[0]); user.setUsername((String) list.get(i)[1]); user.setPassword((String) list.get(i)[2]); user.setEnable((Integer) list.get(i)[3]); System.out.println(user.toString()); } } catch (Exception e) { e.printStackTrace(); } } }
具体业务代码在此不赘述,完整代码:https://download.csdn.net/download/typ1805/10737617
三、poi API简述
1、设置sheet名称和单元格内容
[code]workbook.setSheetName(1, "工作表",HSSFCell.ENCODING_UTF_16); cell.setEncoding((short) 1); cell.setCellValue("单元格内容");
2、取得sheet的数目
[code]workbook.getNumberOfSheets()
3、根据index取得sheet对象
[code]HSSFSheet sheet = wb.getSheetAt(0);
4、取得有效的行数
[code]int rowcount = sheet.getLastRowNum();
5、取得一行的有效单元格个数
[code]row.getLastCellNum();
6、单元格值类型读写
[code]cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型 cell.getNumericCellValue();//读取为数值类型的单元格内容
7、设置列宽、行高
[code]sheet.setColumnWidth((short)column,(short)width); row.setHeight((short)height);
8、添加区域,合并单元格
[code]// 合并从第rowFrom行columnFrom列 Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo(short)columnTo); // 到rowTo行columnTo的区域 sheet.addMergedRegion(region); // 得到所有区域 sheet.getNumMergedRegions()
9、保存Excel文件
[code]FileOutputStream fileOut = new FileOutputStream(path); wb.write(fileOut);
10、根据单元格不同属性返回字符串数值
[code]public String getCellStringValue(HSSFCell cell) { String cellValue = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING://字符串类型 cellValue = cell.getStringCellValue(); if(cellValue.trim().equals("")||cellValue.trim().length()<=0) cellValue=" "; break; case HSSFCell.CELL_TYPE_NUMERIC: //数值类型 cellValue = String.valueOf(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_FORMULA: //公式 cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cellValue = String.valueOf(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: cellValue=" "; break; case HSSFCell.CELL_TYPE_BOOLEAN: break; case HSSFCell.CELL_TYPE_ERROR: break; default: break; } return cellValue; }
11、常用单元格边框格式
[code]HSSFCellStyle style = wb.createCellStyle(); style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框 style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框 style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
12、设置字体和内容位置
[code]HSSFFont f = wb.createFont(); f.setFontHeightInPoints((short) 11);//字号 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗 style.setFont(f); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 style.setRotation(short rotation);//单元格内容的旋转的角度 HSSFDataFormat df = wb.createDataFormat(); style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式 cell.setCellFormula(string);//给单元格设公式 style.setRotation(short rotation);//单元格内容的旋转的角度
13、插入图片
[code]//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); BufferedImage bufferImg = ImageIO.read(new File("ok.jpg")); ImageIO.write(bufferImg,"jpg",byteArrayOut); //读进一个excel模版 FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); fs = new POIFSFileSystem(fos); //创建一个工作薄 HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10); patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
14、调整工作表位置
[code]HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("format sheet"); HSSFPrintSetup ps = sheet.getPrintSetup(); sheet.setAutobreaks(true); ps.setFitHeight((short)1); ps.setFitWidth((short)1);
15、设置打印区域
[code]HSSFSheet sheet = wordbook.createSheet("Sheet1"); wordbook.setPrintArea(0, "$A$1:$C$2");
16、标注脚注
[code]HSSFSheet sheet = wordbook.createSheet("format sheet"); HSSFFooter footer = sheet.getFooter() footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );
17、在工作单中清空行数据,调整行位置
[code]HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("row sheet"); // Create various cells and rows for spreadsheet. // Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5) sheet.shiftRows(5, 10, -5);
18、选中指定的工作表
[code]HSSFSheet sheet = wb.createSheet("row sheet"); heet.setSelected(true);
19、工作表的放大缩小
[code]HSSFSheet sheet1 = wb.createSheet("new sheet"); sheet1.setZoom(1,2); // 50 percent magnification
20、头注和脚注
[code]HSSFSheet sheet = wb.createSheet("new sheet"); HSSFHeader header = sheet.getHeader(); header.setCenter("Center Header"); header.setLeft("Left Header"); header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") + HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");
21、自定义颜色
[code]HSSFCellStyle style = wb.createCellStyle(); style.setFillForegroundColor(HSSFColor.LIME.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFFont font = wb.createFont(); font.setColor(HSSFColor.RED.index); style.setFont(font); cell.setCellStyle(style);
22、填充和颜色设置
[code]HSSFCellStyle style = wb.createCellStyle(); style.setFillBackgroundColor(HSSFColor.AQUA.index); style.setFillPattern(HSSFCellStyle.BIG_SPOTS); HSSFCell cell = row.createCell((short) 1); cell.setCellValue("X"); style = wb.createCellStyle(); style.setFillForegroundColor(HSSFColor.ORANGE.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); cell.setCellStyle(style);
23、强行刷新单元格公式
[code]HSSFFormulaEvaluator eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb); private static void updateFormula(Workbook wb,Sheet s,int row){ Row r=s.getRow(row); Cell c=null; FormulaEcaluator eval=null; if(wb instanceof HSSFWorkbook) eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb); else if(wb instanceof XSSFWorkbook) eval=new XSSFFormulaEvaluator((XSSFWorkbook) wb); for(int i=r.getFirstCellNum();i c=r.getCell(i); if(c.getCellType()==Cell.CELL_TYPE_FORMULA) eval.evaluateFormulaCell(c); } }
24、设置不显示excel网格线
[code]sheet.setDisplayGridlines(false);//其中sheet是Sheet对象
25、设置excel单元格中的内容换行
[code]cellStyle.setWrapText(true);
注意:其中cellStyle是WorkBook创建的CellStyle对象,然后将cellStyle设置到要换行的Cell对象,最后在要换行的对象(一般为字符串)加入"/r/n"。例如:
[code]topTile.append("/r/n" +"cellContent");
26、单元格的合并
[code]sheet.addMergedRegion(new CellRangeAddress(0, 4, 0, 2));// 本示例为合并4行2列
27、设置页眉和页脚的页数
[code] HSSFHeader header = sheet.getHeader(); header.setCenter("Center Header"); header.setLeft("Left Header"); header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") + HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16"); HSSFFooter footer = (HSSFFooter )sheet.getFooter() footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );
28、使得一个Sheet适合一页
[code] sheet.setAutobreaks(true);
29、设置放大属性(Zoom被明确为一个分数,例如下面的75%使用3作为分子,4作为分母)
[code]sheet.setZoom(3,4);
30、设置打印
[code] HSSFPrintSetup print = (HSSFPrintSetup) sheet.getPrintSetup(); print.setLandscape(true);//设置横向打印 print.setScale((short) 70);//设置打印缩放70% print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//设置为A4纸张 print.setLeftToRight(true);//設置打印顺序先行后列,默认为先列行 print.setFitHeight((short) 10);设置缩放调整为10页高 print.setFitWidth((short) 10);设置缩放调整为宽高 sheet.setAutobreaks(false); if (i != 0 && i % 30 == 0) { sheet.setRowBreak(i);//設置每30行分頁打印 }
31、反复的行和列(设置打印标题)
[code]HSSFWorkbook wb = new HSSFWorkbook(); wb.setRepeatingRowsAndColumns(0, 0, 12, 1, 6);//设置1到12列,行1到6每一页重复打印
32、调整单元格宽度
[code]sheet.setAutobreaks(true); sheet.setColumnWidth((short)i,colsWidth[i]); //设定单元格长度 sheet.autoSizeColumn((short) i);//自动根据长度调整单元格长度
阅读更多
- SpringBoot中使用POI,快速实现Excel导入导出
- SpringBoot中使用POI,快速实现Excel导入导出
- Spring使用POI实现Excel导入导出
- Spring使用POI实现Excel导入导出
- Spring使用POI实现Excel导入导出
- [置顶] 【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(一)
- [置顶] 【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(三)
- Springboot/SpringMVC+POI 实现Excel导出功能(点击下载方式实现)
- SpringMVC/SpringBoot使用easypoi实现Excel文件导入导出功能实现
- Spring Boot学习笔记----POI(Excel导入导出)
- jsp 中poi 实现导入导出excel
- 使用apache的poi实现导入导出excel
- java实现excel的导入导出(poi详解)
- Spring Boot利用poi导出Excel
- SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)
- 使用apache的poi实现导入导出excel
- 在SSM下使用POI实现Excel表的导入/导出
- java实现excel的导入导出(poi详解)
- poi实现excel的导入导出
- 利用poi实现页面上excel的导入和导出(不刷新页面)之导出