1、什么是POI?
Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对
Microsoft Office 格式档案读和写的功能。
常用的两种java操作Excel技术POi和JXL的对比:
POI 和 JXL 对 Excel 抽象出来的对象对比
2、使用POI实现Excel的导入导出
先来回忆一下window使用Excel和POi对Excel抽象出来的对象
- 创建一个Excel文件 HSSFWorkbook
- 创建一张工作表 HSSFSheet
- 选中一行 HSSFRow
- 选中一个单元格 HSSFCell
- 在单元格中写入数据
- 保存
第一个demo Excel导出
1,导入POI依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11</version> </dependency>
2,POI工具类实现导出
案例1:
package com.macw; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.junit.Test; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class PoiTest { @Test public void test1() throws IOException { // 1.创建一个文件对象 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); // 2.创建一个表对象 通过文件对象创建表对象 HSSFSheet sheet = hssfWorkbook.createSheet("表名:excel数据表"); // 3.获取行对象 下标从0开始 HSSFRow row = sheet.createRow(0); // 4.获取第1个单元格 下标从0开始 HSSFCell cell = row.createCell(0); // 5.在单元格中写入数据 cell.setCellValue("Hello Wolld"); // 6.保存在磁盘中 流 文件名的后缀必须有.xls hssfWorkbook.write(new FileOutputStream("E://demo.xls")); } } ```java 案例2: 模拟从数据库查到的所有用户及用户信息导出到excel文件中
@RequestMapping("/exportAll") public void exportAll(HttpServletResponse resp){ //模拟从数据库查到的所有用户及用户信息 List<User> users = new ArrayList<User>(); User user = new User("1","张三 1","2019-8-10"); User user1 = new User("2","张三 2","2019-8-10"); User user2 = new User("3","张三 3","2019-8-10"); User user3 = new User("4","张三 4","2019-8-10"); User user4 = new User("5","张三 5","2019-8-10"); User user5 = new User("6","张三 6","2019-8-10"); User user6 = new User("7","张三 7","2019-8-10"); User user7 = new User("8","张三 8","2019-8-10"); users.add(user); users.add(user1); users.add(user2); users.add(user3); users.add(user4); users.add(user5); users.add(user6); users.add(user7); //创建工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); //创建工作表 HSSFSheet sheet = workbook.createSheet("用户信息"); //设置列宽 第一个参数:列索引 第二个参数:列宽 sheet.setColumnWidth(2, 4500); //创建导出样式 HSSFCellStyle cellStyle = workbook.createCellStyle(); //创建字体 HSSFFont font = workbook.createFont(); //设置字体颜色 font.setColor(HSSFFont.COLOR_RED); //设置加粗 font.setBold(true); //设置字体 font.setFontName("宋体"); //设置居中 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); //管理字体样式 cellStyle.setFont(font); //创建标题栏 HSSFRow row = sheet.createRow(0); HSSFCell cell = null; String[] titles = {"编号","真实姓名","出生年月"}; for (int i = 0; i < titles.length; i++) { cell = row.createCell(i); cell.setCellValue(titles[i]); //标题行使用样式 cell.setCellStyle(cellStyle); } for (int i = 1; i <= users.size(); i++) { //创建数据行对象 row = sheet.createRow(i); //数据行第一列设值 cell = row.createCell(0); cell.setCellValue(users.get(i-1).getUserId()); //数据行第二列设值 cell = row.createCell(1); cell.setCellValue(users.get(i-1).getRealname()); //数据行第三列设值 cell = row.createCell(2); cell.setCellValue(users.get(i-1).getDharmaName()); } String fileName = "用户报表("+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+").xls"; //处理中文下载名乱码 try { fileName = new String(fileName.getBytes("utf-8"),"utf-8"); //设置 response resp.setContentType("application/vnd.ms-excel"); resp.setHeader("content-disposition","attachment;filename="+fileN ame); workbook.write(resp.getOutputStream()); workbook.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
3、POI导入
@RequestMapping("/uploadIn") @ResponseBody public Map uploadIn(MultipartFile multipartFile) throws IOException { //输出文件名 logger.info("----------文件名为: "+multipartFile.getOriginalFilename()); //1,获取流对象 InputStream inputStream = multipartFile.getInputStream(); // 2.通过poi解析流 得到 Excel文件对象 HSSFWorkbook workbook = new HSSFWorkbook(inputStream); // 3.通过对象获取数据 得到表 HSSFSheet sheet = workbook.getSheetAt(0); // 4.通过表 得到行 int lastRowNum = sheet.getLastRowNum(); //定义计数器,计算批量导入多少条数据 int sum = 0; for (int i = 1; i <= lastRowNum; i++) { Guru guru = new Guru(); HSSFRow row = sheet.getRow(i); // 获取单元格 double guruId = row.getCell(0).getNumericCellValue(); guru.setGuruId((int) guruId); guru.setGuruName(row.getCell(1).getStringCellValue()); guru.setGuruImage(row.getCell(2).getStringCellValue()); guru.setGuruNickname(row.getCell(3).getStringCellValue()); guru.setGuruStatus((int) row.getCell(4).getNumericCellValue()); System.out.println(guru); //执行添加的SQL int insert = guruMapper.insert(guru); //统计添加成功的条数 sum+=insert; } Map map = new HashMap(); map.put("flag", sum+""); return map; }
页面代码:
<div id="insertFile" class="easyui-dialog" data-options="closed:true"> <form id="insertFileForm" enctype="multipart/form-data" method="post"> 上传Excel文件:<input class="easyui-filebox" name="multipartFile" data-options="required:true,missingMessage:'请选择文件'"/><br/><br/> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-save" onClick="insertFileConfirm()">上传</a> </form> </div> js代码: //批量上传的文件提交 function insertFileConfirm() { $("#insertFileForm").form("submit", { url: "${pageContext.request.contextPath}/guru/uploadIn", success: function (data) { console.log(data); alert("成功添加:"+data.flag+" 条数据"); $("#insertFile").dialog("close"); $("#guruManager").datagrid("reload"); } }) }