POI

1 POI概述

1 什么是poi

​ Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

2 包结构说明

  • HSSF提供读写Microsoft Excel XLS格式档案的功能。
  • XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。
  • HWPF提供读写Microsoft Word DOC格式档案的功能。
  • HSLF提供读写Microsoft PowerPoint格式档案的功能。
  • HDGF提供读Microsoft Visio格式档案的功能。
  • HPBF提供读Microsoft Publisher格式档案的功能。
  • HSMF提供读Microsoft Outlook格式档案的功能。

2 POI的使用

2.1 Excel的操作

2.2.1 jar包依赖

导入jar包–本次使用maven,所以导入pom依赖。

<dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>3.1.0</version></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><dependency><groupId>poi</groupId><artifactId>poi-scratchpad-2.5.1-final</artifactId><version>20040804</version></dependency>
</dependencies>

2.2.2 Excel文件的导出

public static void writerExcel() throws IOException {ArrayList<Student> students = new ArrayList<>();for (int i = 0; i < 5; i++) {students.add(new Student(i+1000,"张三"+i,"男",60+Float.parseFloat(""+Math.random()*40)));}//1.创建excel对象HSSFWorkbook sheets = new HSSFWorkbook();//2.创建一个sheetHSSFSheet sheet1 = sheets.createSheet("sheet1");//4.创建行列并赋值:下标默认从0开始HSSFRow row = sheet1.createRow(0);//3.设置样式HSSFCellStyle style = sheets.createCellStyle();style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index);//设置图案颜色style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);//设置图案样式String[] rows=new String[]{"序号","学号","名字","性别","成绩"};for (int i = 0; i < rows.length; i++) {//HSSFCell cell = row.createCell(i);Cell cell = row.createCell(i);cell.setCellValue(rows[i]);cell.setCellStyle(style);System.out.println(cell.getCellStyle().getFillBackgroundColor());}for (int i = 0; i < students.size(); i++) {HSSFRow tempRow = sheet1.createRow(i+1);Student tempStudent = students.get(i);HSSFCell cell = tempRow.createCell(0);cell.setCellValue(i+1);tempRow.createCell(1).setCellValue(tempStudent.getId());tempRow.createCell(2).setCellValue(tempStudent.getName());tempRow.createCell(3).setCellValue(tempStudent.getSex());tempRow.createCell(4).setCellValue(tempStudent.getScore());}//5.创建关联输出流和文件FileOutputStream fileOutputStream = new FileOutputStream("14_poi/studentScoreBook.xls");sheets.write(fileOutputStream);fileOutputStream.close();
}

2.2.3 EXCEL文件的读

public static void readExcel() throws IOException {//创建文件输入流关联表FileInputStream fileInputStream = new FileInputStream("14_poi/studentScoreBook.xls");//1.创建工作簿HSSFWorkbook sheets = new HSSFWorkbook(fileInputStream);//2.获取工作表int numberOfSheets = sheets.getNumberOfSheets();//3.获取每一个单元格for (int i = 0; i < numberOfSheets; i++) {HSSFSheet sheetAt = sheets.getSheetAt(i);Iterator<Row> rowIterator = sheetAt.iterator();while (rowIterator.hasNext()){//获取一行Row rowNext = rowIterator.next();Iterator<Cell> cellIterator = rowNext.cellIterator();while (cellIterator.hasNext()){//获取每一个单元格Cell cellNext = cellIterator.next();int cellType = cellNext.getCellType();if (cellType== HSSFCell.CELL_TYPE_NUMERIC){//日期和数字类型的if (HSSFDateUtil.isCellDateFormatted(cellNext)){Date dateCellValue = cellNext.getDateCellValue();System.out.println(dateCellValue);}else {double numericCellValue = cellNext.getNumericCellValue();System.out.println("numeric::"+numericCellValue);}}else if (cellType==HSSFCell.CELL_TYPE_BOOLEAN){boolean booleanCellValue = cellNext.getBooleanCellValue();System.out.println("boolean::"+booleanCellValue);}else{String stringCellValue = cellNext.getStringCellValue();System.out.println("其他类型使用字符串进行接收::"+stringCellValue);}}}fileInputStream.close();}
}

2.2.4 文件的上传与下载

​ 需求:上传一个文件并保存到本地磁盘中去。

@RequestMapping("/extractAllStudentToExcel")
public ResponseEntity<byte[]> extractAllStudentToExcel(HttpServletRequest request) {//1.获取全部的学生对象List<Student> allStudent = studentDao.getAllStudent();allStudent.forEach(System.out::println);//2.创建工作表HSSFWorkbook sheets = new HSSFWorkbook();HSSFSheet sheet = sheets.createSheet("学生信息表");//4.创建行列并赋值:下标默认从0开始HSSFRow row = sheet.createRow(0);//3.设置样式String[] rows=new String[]{"序号","学号","名字","性别","成绩","入学时间"};System.out.println(HSSFWorkbook.class.getProtectionDomain().getCodeSource().getLocation());for (int i = 0; i < rows.length; i++) {Cell cell = row.createCell(i);cell.setCellValue(rows[i]);}for (int i = 0; i < allStudent.size(); i++) {HSSFRow tempRow = sheet.createRow(i+1);Student tempStudent = allStudent.get(i);HSSFCell cell = tempRow.createCell(0);cell.setCellValue(i+1);tempRow.createCell(1).setCellValue(tempStudent.getId());tempRow.createCell(2).setCellValue(tempStudent.getName());tempRow.createCell(3).setCellValue(tempStudent.getSex());tempRow.createCell(4).setCellValue(tempStudent.getScore());Cell dateTemp=tempRow.createCell(5);HSSFCellStyle style4 = sheets.createCellStyle();HSSFDataFormat df = sheets.createDataFormat(); // 此处设置数据格式style4.setDataFormat(df.getFormat("yyyy-MM-dd hh:mm:ss"));dateTemp.setCellValue(tempStudent.getBirth());dateTemp.setCellStyle(style4);}//5.创建关联输出流和文件String fileName="学生信息.xls";String mimeType = request.getServletContext().getMimeType(fileName);MultiValueMap<String,String> headers=new HttpHeaders();headers.add("Content-Disposition","attchement;filename="+new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));System.out.println("mmeType:"+mimeType);headers.add("Content-Type", mimeType);byte[] bytes = sheets.getBytes();System.out.println(bytes);return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
}
@RequestMapping("/saveStudentByExcel")
public String saveStudentByExcel(@RequestParam(value = "file",required = false)MultipartFile file) throws IOException {if (!file.isEmpty()){InputStream inputStream = file.getInputStream();//1.创建工作簿HSSFWorkbook sheets = new HSSFWorkbook(inputStream);//2.获取工作表Sheet sheet = sheets.getSheetAt(0);//获取一个工作表for (int k = 1; k < sheet.getPhysicalNumberOfRows(); k++) {Row row = sheet.getRow(k);//获取一行数据//获取行下的所有单元格Student s = new Student();for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {Cell cell = row.getCell(j);//获取下标为j的单元格//判断单元格数据的类型if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {String value = cell.getStringCellValue();if (j==2){s.setName(value);}else if(j==3){s.setSex(value);}} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {//数字和日期类型//判断单元格数据的格式if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式Date value = cell.getDateCellValue();s.setBirth(value);} else {double value = cell.getNumericCellValue();if (j == 1) {s.setId((int) value);}if (j == 4) {s.setScore((float) value);}}}}studentDao.addOne(s);}}return "success";
}

2.2 单元格的样式设置

​ HSSFCellStyle cellStyle = wb.createCellStyle();

2.3.1 设置背景色

cellStyle.setFillForegroundColor((short) 13);// 设置背景色  cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

2.3.2 设置边框

cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框  cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框  cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框  cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

2.3.3 设置居中:

cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中

2.3.4 设置字体:

HSSFFont font = wb.createFont();
font.setFontName("黑体");
font.setFontHeightInPoints((short) 16);//设置字体大小  HSSFFont font2 = wb.createFont();
font2.setFontName("仿宋_GB2312");
font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
font2.setFontHeightInPoints((short) 12);  cellStyle.setFont(font);//选择需要用到的字体格式

2.3.5 设置列宽:

sheet.setColumnWidth(0, 3766); //第一个参数代表列id(从0开始),第2个参数代表宽度值  参考 :"2012-08-10"的宽度为2500

2.3.6 设置自动换行:

cellStyle.setWrapText(true);//设置自动换行

2.3.7 合并单元格:

Region region1 = new Region(0, (short) 0, 0, (short) 6);//参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号
//此方法在POI3.8中已经被废弃,建议使用下面一个
或者用
CellRangeAddress region1 = new CellRangeAddress(rowNumber, rowNumber, (short) 0, (short) 11);
//参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
但应注意两个构造方法的参数不是一样的,具体使用哪个取决于POI的不同版本。
sheet.addMergedRegion(region1);

2.excel导出-poi使用相关推荐

  1. 工具类--Excel 导出poi

    实现功能 --批量导出excel 文件,配置一个sheet多少条数据,根据查询数据量的多少确定生成几个sheet页. pom 文件导入ExcelUtils工具包,依赖于poi包. <!-- ht ...

  2. Poi实现Excel导出

    Poi实现Excel导出 Appache Poi提供了HSSFWorkbook操作2003版本的Excel文件, XSSFWorkbook操作2007版Excel文件. 简单的具体实现在网上有很多案例 ...

  3. Apache POI操作Excel导出JAVABEAN对象方法

    2019独角兽企业重金招聘Python工程师标准>>> Apache POI操作Excel导出方法说明 Apache的POI组件是Java操作Microsoft Office办公套件 ...

  4. springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解

    提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并 ...

  5. Excel导入poi、导出poi

    Excel导入poi.导出poi 依赖Jar包 <!-- 处理Excel2003 --> <dependency><groupId>org.apache.poi&l ...

  6. 从Excel导出宕机到初学Apache POI

    学习来由 因为在定位一个公司的OOM的时候,花了2天时间,定位问题定位出了方向,知道是导出Excel的时候对象占用太大导致的OOM,但是后来计算了一下数据完全没有达到OOM的情况.症结点就是结论是没错 ...

  7. POI百万级大数据量EXCEL导出

    一. 简介 excel导出,如果数据量在百万级,会出现俩点内存溢出的问题: 1. 查询数据量过大,导致内存溢出. 该问题可以通过分批查询来解决: 2. 最后下载的时候大EXCEL转换的输出流内存溢出: ...

  8. POI的Excel导出数据之后,单元格数据无法换行

    ** POI的Excel导出数据之后,单元格数据无法换行 问题描述: POI导出excel数据之后,代码中使用"\n"换行,导出数据之后数据并未换行,只有双击之后才展现换行效果,截 ...

  9. SpringBoot+POI+JXL实现excel导出并添加水印功能

    SpringBoot+POI+JXL实现excel导出并添加水印功能 1.Pom引入 实现过程,部分代码如下 1.Pom引入 <dependency><groupId>org. ...

最新文章

  1. WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧
  2. Locality Sensitive Hashing(局部敏感哈希)
  3. 高度不定垂直居中_经典:CSS垂直居中的七种方法
  4. Java Persistence with MyBatis 小结2
  5. 1070. 结绳(25)
  6. 什么是传感器? 传感器由哪几部分组成? 传感器分类?
  7. SpringSecurity自定义登陆页面和跳转页面
  8. python在工厂中的应用_python中的工厂方法
  9. Volume group VolGroup00 not found
  10. iOS语音识别功能实现
  11. leetcode讲解--937. Reorder Log Files
  12. Gflops是什么?
  13. nordic nFR52832 PCA10040 blinky例程分析
  14. SQL IF语句的使用
  15. python之轻量级框架flask开发接口,操作数据库
  16. Zabbix 服务器修改时区时间
  17. vmware 桌面 服务器版,vmware云桌面软件服务器(vmware云桌面搭建教程)
  18. java导出word加水印(已实现)
  19. 知乎上这个话题引起了我的兴趣:在实体经济一片下滑的大环境中,哪些行业还可以?
  20. 边缘计算?相对于云计算

热门文章

  1. Mysql__leecode/0197. 上升的温度
  2. html里br和p,HTML中br与p标签有什么区别
  3. 画出计算机硬件结构框图,计算机组成原理点题集1.doc
  4. html 长度vm,vm与html
  5. 创建型设计模式——抽象工厂模式
  6. ArrayList排序返回值问题
  7. 如何用PC下载WAP站点的手机软件?
  8. 滑动改变标题栏的颜色
  9. 一文带你了解JavaScript函数式编程
  10. 链表实现栈 FILO