POI简介,以及使用POI技术实现Excel文件的导入导出案例

1、什么是POI?

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

常用的两种java操作Excel技术POi和JXL的对比:
在这里插入图片描述
POI 和 JXL 对 Excel 抽象出来的对象对比

POI JXL
Excel 文档 HSSFWorkbook Workbook
Excel 的工作表 HSSFSheet Sheet
Excel 的行 HSSFRow
Excel 中的单元格 HSSFCell Cell
Excel 字体 HSSFFont
Excel 单元格样式 HSSFCellStyle
Excel 颜色 HSSFColor
合并单元格 CellRangeAddress

2、使用POI实现Excel的导入导出

先来回忆一下window使用Excel和POi对Excel抽象出来的对象

  1. 创建一个Excel文件 HSSFWorkbook
  2. 创建一张工作表 HSSFSheet
  3. 选中一行 HSSFRow
  4. 选中一个单元格 HSSFCell
  5. 在单元格中写入数据
  6. 保存

第一个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");
            }
        })
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章