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

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

1、什么是POI?

Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对

Microsoft Office 格式档案读和写的功能。

常用的两种java操作Excel技术POi和JXL的对比:

POI 和 JXL 对 Excel 抽象出来的对象对比

image.png

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");
            }
        })
    }
目录
相关文章
|
3天前
|
数据库 C语言 索引
必知的技术知识:excel函数
必知的技术知识:excel函数
|
10天前
|
Java 数据库 数据安全/隐私保护
Java操作Excel文件导入导出【内含有 jxl.jar 】
Java操作Excel文件导入导出【内含有 jxl.jar 】
21 0
|
5天前
|
Java easyexcel
java开发excel导入导出工具类基于EasyExcel
java开发excel导入导出工具类基于EasyExcel
13 1
|
3天前
必知的技术知识:Excel通过身份证获取出生年月,性别,年龄,生肖,星座,省份等信息总结归纳
必知的技术知识:Excel通过身份证获取出生年月,性别,年龄,生肖,星座,省份等信息总结归纳
|
3天前
|
数据格式 Windows
必知的技术知识:Excel公式SWITCH函数你用过吗?多种查找函数介绍
必知的技术知识:Excel公式SWITCH函数你用过吗?多种查找函数介绍
|
4天前
|
前端开发 Java 开发工具
如何在Spring Boot框架下实现高效的Excel服务端导入导出?
ArtifactId:是项目的唯一标识符,在实际开发中一般对应项目的名称,就是项目根目录的名称。 Group Id,Artfact Id是保证项目唯一性的标识,一般来说如果项目打包上传至maven这样的包管理仓库中。在搜索你的项目时,Group Id,Artfact Id是必要的条件。 Version:版本号,默认0.0.1-SNAPSHOT。SNAPSHOT代表不稳定的版本,与之相对的有RELEASE。 Project type:工程的类型,maven工程还是gradle工程。 Language:语言(Java,Kotlin,Groovy)。
|
4天前
|
easyexcel Java API
Apache POI与easyExcel:Excel文件导入导出的技术深度分析
Apache POI与easyExcel:Excel文件导入导出的技术深度分析
|
1月前
|
前端开发 Java
基于Java爬取微博数据(二) 正文长文本+导出数据Excel
【5月更文挑战第12天】基于Java爬取微博数据,正文长文本+导出数据Excel
|
1月前
|
Java
java导出复杂excel
java导出复杂excel
|
11天前
|
easyexcel Java API
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
35 1