[Utils]POI实现excel导入导出

1.分析excel

2.poi工具类

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import org.zenzzat.toa.nsfw.user.entity.User;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * excel导入导出工具类
 * Created by Zenz.
 */
public class ExcelUtil {

    /**
     * 导出excel格式用户列表
     * @param userList 需要导出的用户列表
     * @param response 输出响应
     */
    public static void exportUserExcel(List<User> userList, HttpServletResponse response) {
        try {
            //设置文件类型
            response.setContentType("application/x-excel");
            //设置文件名称,中文用iso-8859-1编码
            response.setHeader("Content-Disposition", "attachment;filename=" + new String("用户列表.xls".getBytes(), "ISO-8859-1"));
            ServletOutputStream outputStream = response.getOutputStream();

            //1、创建工作簿
            HSSFWorkbook workbook = new HSSFWorkbook();
            //1.1、创建合并单元格对象
            CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, 4);//起始行号,结束行号,起始列号,结束列号
            //1.2、头标题样式
            HSSFCellStyle headStyle = createCellStyle(workbook, (short) 16);
            //1.3、列标题样式
            HSSFCellStyle colStyle = createCellStyle(workbook, (short) 13);

            //2、创建工作表
            HSSFSheet sheet = workbook.createSheet("用户列表");
            //2.1、加载合并单元格对象
            sheet.addMergedRegion(cellRangeAddress);
            //设置默认列宽
            sheet.setDefaultColumnWidth(25);

            //3、创建行
            //3.1、创建头标题行;并且设置头标题
            HSSFRow headRow = sheet.createRow(0);
            HSSFCell headCel = headRow.createCell(0);
            //加载单元格样式
            headCel.setCellStyle(headStyle);
            headCel.setCellValue("用户列表");

            //3.2、创建列标题行;并且设置列标题
            HSSFRow colRew = sheet.createRow(1);
            String[] titles = {"用户名", "帐号", "所属部门", "性别", "电子邮箱"};
            for (int i = 0; i < titles.length; i++) {
                HSSFCell colCel = colRew.createCell(i);
                //加载单元格样式
                colCel.setCellStyle(colStyle);
                colCel.setCellValue(titles[i]);
            }

            //4、操作单元格;将用户列表写入excel
            if (userList != null) {
                for (int j = 0; j < userList.size(); j++) {
                    HSSFRow row = sheet.createRow(j + 2);
                    HSSFCell cell0 = row.createCell(0);
                    cell0.setCellValue(userList.get(j).getName());
                    HSSFCell cell1 = row.createCell(1);
                    cell1.setCellValue(userList.get(j).getAccount());
                    HSSFCell cell2 = row.createCell(2);
                    cell2.setCellValue(userList.get(j).getDept());
                    HSSFCell cell3 = row.createCell(3);
                    cell3.setCellValue(userList.get(j).getGender() ? "男" : "女");
                    HSSFCell cell4 = row.createCell(4);
                    cell4.setCellValue(userList.get(j).getEmail());
                }
            }
            //5、输出
            workbook.write(outputStream);
            workbook.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建单元格样式
     * @param workbook 工作簿
     * @param fontSize 字体大小
     * @return 单元格样式
     */
    private static HSSFCellStyle createCellStyle(HSSFWorkbook workbook, short fontSize) {
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        //创建字体
        HSSFFont font = workbook.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体
        font.setFontHeightInPoints(fontSize);
        //加载字体
        style.setFont(font);
        return style;
    }

    /**
     * 导入excel格式用户列表
     * @param userExcel 要导入的excel文件
     * @return 读取到用户列表
     */
    public static List<User> importUserExcel(MultipartFile userExcel) {
        if (userExcel != null) {
            String userExcelFileName = userExcel.getOriginalFilename();
            //是否是excel
            if (userExcelFileName.matches("^.+\\.(?i)((xls)|(xlsx))$")) {
                List<User> userList = new ArrayList<>();
                try {
                    InputStream inputStream = userExcel.getInputStream();
                    boolean is03Excel = userExcelFileName.matches("^.+\\.(?i)(xls)$");
                    //1.读取工作簿
                    Workbook workbook = is03Excel ? new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
                    //2.读取工作表
                    Sheet sheet = workbook.getSheetAt(0);
                    //3.读取行
                    if (sheet.getPhysicalNumberOfRows() > 2) {
                        User user;
                        for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
                            user = new User();
                            user.setId(UUIDUtil.getUUID());
                            //4.读取单元格
                            Row row = sheet.getRow(i);
                            //用户名
                            Cell cell0 = row.getCell(0);
                            user.setName(cell0.getStringCellValue());
                            //账号
                            Cell cell1 = row.getCell(1);
                            user.setAccount(cell1.getStringCellValue());
                            //所属部门
                            Cell cell2 = row.getCell(2);
                            user.setDept(cell2.getStringCellValue());
                            //性别
                            Cell cell3 = row.getCell(3);
                            user.setGender(cell3.getStringCellValue().equals("男"));
                            //手机号-数字需特殊处理:如果是字符串,直接读取,如果是数字,需要转换为字符串
                            String mobileNum = "";
                            Cell cell4 = row.getCell(4);
                            try {
                                mobileNum = cell4.getStringCellValue();
                            } catch (Exception e) {
                                double mobileDlb = cell4.getNumericCellValue();
                                mobileNum = BigDecimal.valueOf(mobileDlb).toString();
                            }
                            user.setMobile(mobileNum);
                            //电子邮箱
                            Cell cell5 = row.getCell(5);
                            user.setEmail(cell5.getStringCellValue());
                            //生日
                            Cell cell6 = row.getCell(6);
                            if (cell6.getDateCellValue() != null) {
                                user.setBirthday(cell6.getDateCellValue());
                            }
                            //非空字段需额外设置默认值
                            //默认密码123456
                            user.setPassword("123456");
                            //默认状态为 有效
                            user.setState(User.USER_STATE_VALID);
                            //5.保存用户
                            userList.add(user);
                        }
                    }
                    //关闭资源
                    workbook.close();
                    inputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return userList;
            }
            return null;
        }
        return null;
    }
}

  3.附导出导入的文件样式

时间: 2024-09-30 09:58:58

[Utils]POI实现excel导入导出的相关文章

POI实现excel导入导出

1.分析excel import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.Ce

【原创】POI操作Excel导入导出工具类ExcelUtil

关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.ThreadLocalMap以当前ThreadLocal为key进行存储,设置一次变量,则其他线程也会有上次数据的残留,因此在addMergeArea方法中进行清空的操作.为了保证原子性, 采用ReentrantLock确保一次只有一个线程可以进行添加合并数据的操作. 线程安全性从以上两个方面保证. 水

一个基于POI的通用excel导入导出工具类的简单实现及使用方法

前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴.经过思考,认为一百个客户在录入excel的时候,就会有一百个格式版本,所以在实现这个功能之前,所以要统一excel的格式.于是提供了一个通用excel模版的下载功能.当所有客户用模版录入好数据再上传到系统,后端对excel进行解析,然后再持久化到数据库. 概述: 此工具类的几大特点 1.基本导入导出

java poi excel 导入导出数据

背景:1.pringmvc 框架下 的excel 导入导出   2.OI 操作office. 页面代码: <div class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true"> <div class=&quo

开发指南专题十五:JEECG微云快速开发平台EXCEL导入导出

 开发指南专题十五:JEECG微云快速开发平台EXCEL导入导出 14.EXCEL导入导出 Excel的导入导出抽取通用功能,简化大家对POI的操作,对实体对象进行简单的注解配置就可以完成导入导出,模板的使用更是可以让打造漂亮的Excle报表,从而使大家从重复的工作中解脱出来,更加关注与业务的处理. 14.1注解介绍    注解名 作用对象 描述 是否必须 Excel 字段 对Excel字段的cell属性设置 是 ExcelCollection 字段 对集合对象进行标记表示一对多导出 否 E

java Excel 导入导出

使用poi实现springMVC的Excel导入导出 需要jar包:poi.jar    poi-ooxml.jar    poi-ooxml-schemas.jar    xbean.jar(用于解析excel2007) controller层导出: 1 // 导出excel 2 if (action != null && action.equals("export")) { 3 List<LoadPriceShipownerQueryItem> expo

Excel导入导出的业务进化场景及组件化的设计方案(转)

1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候,再分享分享. 话说最近外面IT行情飞涨还咋的,人都飞哪去了呢,听说各地的军情都进入紧急状态了. 回归下正题,今天就抽点时间,写写技术文,和大伙分享一下近年在框架设计上的取的一些技术成果. 2:项目背景 在针对运营商(移动.联通.电信.铁塔)的信息类的系统中,由于相关的从业人员习惯于Excel的办公

利用反射实现通用的excel导入导出

如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 1 package com.bean; 2 3 public class Book { 4 private int id; 5 private String name; 6 private String type; 7 // public int a; 8 9 public String getType() { 10 System.ou

excel导入导出优化

对于上一篇excel中出现的问题,在excel导入导出中都做了优化.还是eclipse+jdk1.8,但是这个项目是一个web项目,需要配合Tomcat服务器,并且使用了SSH框架, I/O操作过多 首先,对于I/O操作过多,那么就不像之前一样,一条一条的添加或者更新;而且凑齐一堆,也就是一个list集合,然后统一的批量保存. 使用SessionFactory获取当前的session,然后调用session的persist方法,保存实体.只是设置了一个批量的量值.每到30条数据,就将缓存同步到数