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

1、什么是POI?

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

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

POIJXL
Excel 文档HSSFWorkbookWorkbook
Excel 的工作表HSSFSheetSheet
Excel 的行HSSFRow
Excel 中的单元格HSSFCellCell
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");
            }
        })
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清如许.

整理不易,点滴助力就是不竭动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值