Java Excel导入导出工具类_excel导入导出工具类java-程序员宅基地

技术标签: java  

Java Excel导入导出工具类

第一步导入maven依赖

 <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.14</version>
  </dependency>
  
  <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-scratchpad</artifactId>
       <version>3.14</version>
   </dependency>
   
   <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml</artifactId>
       <version>3.14</version>
   </dependency>

二、excel导入导出工具类的实现

/**
 * @author xiaowang
 * @date 创建时间:2021年2月4日 下午2:13:30
 * @version 1.0
 */
public class ImportExcelUtil {
    
    final static String notnullerror = "请填入第{0}行的{1},{2}不能为空";
    final static String errormsg = "第{0}行的{1}数据导入错误";
    /**
     * 导入Excel
     * @param clazz
     * @param xls
     * @return
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static List importExcel(Class<?> clazz, InputStream xls) throws Exception {
    
        try {
    
            // 取得Excel
            HSSFWorkbook wb = new HSSFWorkbook(xls);
            HSSFSheet sheet = wb.getSheetAt(0);
            Field[] fields = clazz.getDeclaredFields();
            List<Field> fieldList = new ArrayList<Field>(fields.length);
            for (Field field : fields) {
    
                if (field.isAnnotationPresent(ModelProp.class)) {
    
                    ModelProp modelProp = field.getAnnotation(ModelProp.class);
                    if (modelProp.colIndex() != -1) {
    
                        fieldList.add(field);
                    }
                }
            }
            EmployeeDTO employee = new EmployeeDTO();
            // 行循环
            List<ImportModel> modelList = new ArrayList<ImportModel>(sheet.getPhysicalNumberOfRows() * 2);
            for (int i = 2; i < sheet.getPhysicalNumberOfRows(); i++) {
    
                // 数据模型
                ImportModel model = (ImportModel) clazz.newInstance();
                int nullCount = 0;
                Exception nullError = null;
                for (Field field : fieldList) {
    
                    ModelProp modelProp = field.getAnnotation(ModelProp.class);
                    HSSFCell cell = sheet.getRow(i).getCell(modelProp.colIndex());
                    try {
    
                        if (cell == null || cell.toString().length() == 0) {
    
                            nullCount++;
                            if (!modelProp.nullable()) {
    
                                nullError = new Exception(StringUtil.format(notnullerror,
                                        new String[] {
     "" + (1 + i), modelProp.name(), modelProp.name() }));

                            }
                        } else if (field.getType().equals(Date.class)) {
    
                            if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(), new Date(parseDate(parseString(cell))));
                            } else {
    
                                BeanUtils.setProperty(model, field.getName(),
                                        new Date(cell.getDateCellValue().getTime()));

                            }
                        } else if (field.getType().equals(Timestamp.class)) {
    
                            if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(),
                                        new Timestamp(parseDate(parseString(cell))));
                            } else {
    
                                BeanUtils.setProperty(model, field.getName(),
                                        new Timestamp(cell.getDateCellValue().getTime()));
                            }

                        } else if (field.getType().equals(java.sql.Date.class)) {
    
                            if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(),
                                        new java.sql.Date(parseDate(parseString(cell))));
                            } else {
    
                                BeanUtils.setProperty(model, field.getName(),
                                        new java.sql.Date(cell.getDateCellValue().getTime()));
                            }
                        } else if (field.getType().equals(java.lang.Integer.class)) {
    
                            if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(), (int) cell.getNumericCellValue());
                            } else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(), Integer.parseInt(parseString(cell)));
                            }
                        } else if (field.getType().equals(java.math.BigDecimal.class)) {
    
                            if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(),
                                        new BigDecimal(cell.getNumericCellValue()));
                            } else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(), new BigDecimal(parseString(cell)));
                            }
                        } else {
    
                            if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(),
                                        new BigDecimal(cell.getNumericCellValue()));
                            } else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    
                                BeanUtils.setProperty(model, field.getName(), parseString(cell));
                            }
                        }
                    } catch (Exception e) {
    
                        e.printStackTrace();
                        throw new Exception(StringUtil.format(errormsg, new String[] {
     "" + (1 + i), modelProp.name() })
                                + "," + e.getMessage());
                    }
                }
                if (nullCount == fieldList.size()) {
    
                    break;
                }
                if (nullError != null) {
    
                    throw nullError;
                }
                modelList.add(model);
            }
            return modelList;

        } finally {
    
            xls.close();
        }
    }

    private final static int colsizeN = 630;
    private final static int colsizeM = 1000;

    /**
     * 下载Excel模版
     *
     * @param clazz
     * @param map
     * @param rowSize
     * @return
     */
    public static InputStream excelModelbyClass(Class<?> clazz, Map<Integer, String[]> map, Integer rowSize) {
    
        try {
    
            if (!clazz.isAnnotationPresent(ModelTitle.class)) {
    
                throw new Exception("请在此类型中加上ModelTitle注解");
            }
            if (rowSize == null) {
    
                rowSize = 1000;
            }
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet();
            /**
             * 设置标题样式
             */
            HSSFCellStyle titleStyle = wb.createCellStyle();
            titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            HSSFFont font = wb.createFont();
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            font.setFontHeight((short) 400);
            titleStyle.setFont(font);
            HSSFCell titleCell = sheet.createRow(0).createCell(0); // 创建第一行,并在该行创建单元格,设置内容,做为标题行
            /**
             * 获取标题
             */
            ModelTitle modelTitle = clazz.getAnnotation(ModelTitle.class);
            titleCell.setCellValue(new HSSFRichTextString(modelTitle.name()));
            titleCell.setCellStyle(titleStyle);

            Field[] fields = clazz.getDeclaredFields();
            HSSFRow headRow = sheet.createRow(1);
            int colSzie = 0;
            /**
             * 设置表头样式
             */
            HSSFCellStyle headStyle = wb.createCellStyle();
            headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            HSSFFont headFont = wb.createFont();
            headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            headFont.setFontHeight((short) 240);
            headStyle.setFont(headFont);
            List<Integer> cells = new ArrayList<Integer>();

            for (Field field : fields) {
    
                if (field.isAnnotationPresent(ModelProp.class)) {
    
                    ModelProp modelProp = field.getAnnotation(ModelProp.class);
                    if (modelProp.colIndex() == -1)
                        continue;
                    cells.add(modelProp.colIndex());
                    HSSFCell cell = headRow.createCell(modelProp.colIndex());
                    cell.setCellValue(new HSSFRichTextString(modelProp.name()));
                    cell.setCellStyle(headStyle);
                    colSzie++;
                    sheet.autoSizeColumn((short) modelProp.colIndex());
                    sheet.setColumnWidth(modelProp.colIndex(), modelProp.name().length() * colsizeN + colsizeM);

                    // 设置列为下拉框格式
                    if (map != null && map.get(new Integer(modelProp.colIndex())) != null) {
    
                        DVConstraint constraint = DVConstraint
                                .createExplicitListConstraint(map.get(modelProp.colIndex()));
                        CellRangeAddressList regions = new CellRangeAddressList(2, rowSize, modelProp.colIndex(),
                                modelProp.colIndex());
                        HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraint);
                        sheet.addValidationData(dataValidation);
                    }
                }
            }
            HSSFCellStyle cellStyle = wb.createCellStyle();
            HSSFDataFormat format = wb.createDataFormat();
            cellStyle.setDataFormat(format.getFormat("@"));
            for (int i = 2; i < rowSize; i++) {
    
                HSSFRow row = sheet.createRow(i);
                for (Integer integer : cells) {
    
                    HSSFCell cell = row.createCell(integer);
                    cell.setCellStyle(cellStyle);
                }
            }
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, colSzie - 1));
            if (map != null) {
    
                for (Integer colIndex : map.keySet()) {
    
                    DVConstraint constraint = DVConstraint.createExplicitListConstraint(map.get(colIndex));
                    CellRangeAddressList regions = new CellRangeAddressList(2, 1000, colIndex, colIndex);
                    HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraint);
                    sheet.addValidationData(dataValidation);
                }
            }

            ByteArrayOutputStream os = new ByteArrayOutputStream();
            try {
    
                wb.write(os);
            } catch (IOException e) {
    
                e.printStackTrace();
            }

            byte[] b = os.toByteArray();

            ByteArrayInputStream in = new ByteArrayInputStream(b);
            return in;
        } catch (Exception e) {
    
            e.printStackTrace();
            return null;
        }
    }

    private static String parseString(HSSFCell cell) {
    
        return String.valueOf(cell).trim();
    }

    private static long parseDate(String dateString) throws ParseException {
    
        if (dateString.indexOf("/") == 4) {
    
            return new SimpleDateFormat("yyyy/MM/dd").parse(dateString).getTime();
        } else if (dateString.indexOf("-") == 4) {
    
            return new SimpleDateFormat("yyyy-MM-dd").parse(dateString).getTime();
        } else if (dateString.indexOf("年") == 4) {
    
            return new SimpleDateFormat("yyyy年MM月dd").parse(dateString).getTime();
        } else if (dateString.length() == 8) {
    
            return new SimpleDateFormat("yyyyMMdd").parse(dateString).getTime();
        } else {
    
            return new Date().getTime();
        }
    }

}

三、自定义spring注解

/**
 * @author xiaowang
 * @date 创建时间:2021年2月4日 下午2:13:30
 * @version 1.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ModelProp{
    
    public String name();
    public int colIndex() default -1;
    public boolean nullable() default true;
    public String interfaceXmlName() default "";
}
/**
 * @author xiaowang
 * @date 创建时间:2021年2月4日 下午2:13:30
 * @version 1.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
 public @interface ModelTitle{
    
     public String name();
}

四、定义实体类父类

/**
 * @author xiaowang
 * @date 创建时间:2021年2月4日 下午2:13:30
 * @version 1.0
 */
public class ImportModel {
    
}

五、定义实体类

/**
 * @author xiaowang
 * @date 创建时间:2021年2月4日 下午2:13:30
 * @version 1.0
 */
@ModelTitle(name="人员列表")
public class EmployeeDTO extends ImportModel implements Serializable {
    
    private static final long serialVersionUID = -3434719712955859295L;
    private Long id;
    @ModelProp(name = "电话", colIndex = 1, nullable = false)
    private String telephone;
    @ModelProp(name = "名称", colIndex = 0, nullable = false)
    private String name;
    @ModelProp(name = "性别", colIndex = 2, nullable = false)
    private Integer sex;
}

六、定义controller

/**
 * @author xiaowang
 * @date 创建时间:2021年2月4日 下午2:13:30
 * @version 1.0
 */
@RestController
@RequestMapping("/api/excelOpera")
public class ImportEmployeeController extends BaseController {
    

    private static Logger logger = LoggerFactory.getLogger(ImportEmployeeController.class);
    /**
     * 导入excel表
     * @version 1.0
     * @since 1.0
     */
    @RequestMapping(path = "/importEmployee", method = RequestMethod.POST)
    public RespMsg uploadExcel(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
    
        try{
    

            List<EmployeeDTO> employeeDTOList  = ImportExcelUtil.importExcel(EmployeeDTO.class, file.getInputStream());
            //可做持久化操作,现只打印观察
            for(EmployeeDTO employeeDTO : employeeDTOList){
    
                logger.info("name=" + employeeDTO.getName() + ",telephone=" + employeeDTO.getTelephone()+",sex=" + employeeDTO.getSex());
            }
        }catch(Exception e){
    
            logger.error(e.getMessage());
        }
        return null;
    }
    /**
     * 导出excel模版
     * @version 1.0
     * @since 1.0
     */
    @RequestMapping(path = "/downloadEmployeeModel", method = RequestMethod.GET)
    public RespMsg downloadEmployeeModel(HttpServletResponse response) {
    
        try{
    
            response.setContentType("application/xls");
            response.addHeader("Content-Disposition", "attachment;filename="+new String(("eeelist").getBytes("UTF-8"),"iso-8859-1")+".xls");
            Map<Integer,String[]> paramMap = new HashMap<Integer,String[]>();
            //excel第三行为下拉选择框
            paramMap.put(2, new String[]{
    "man","women"});
            BufferedInputStream input = new BufferedInputStream(ImportExcelUtil.excelModelbyClass(EmployeeDTO.class, paramMap, null));
            byte buffBytes[] = new byte[1024];
            OutputStream os = response.getOutputStream();
            int read = 0;
            while ((read = input.read(buffBytes)) != -1) {
    
                os.write(buffBytes, 0, read);
            }
            os.flush();
            os.close();
            input.close();
            return success("下载成功!");
        }catch(Exception e){
    
            logger.error("downloadEmployeeModel() catch Exception ",e);
            return fail("下载失败!");
        }
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaowang199303/article/details/113651840

智能推荐

计算机基础——操作系统-程序员宅基地

文章浏览阅读8.5k次,点赞28次,收藏38次。本章将会讲解计算机的操作系统。操作系统(Operating System,OS)就好比一个计算机内部的管理者,是管理和控制计算机硬件与软件资源的计算机程序,直接运行在“裸机”上的最基本的系统软件,任何其他应用软件都必须在操作系统的支持下才能运行,操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。操作系统的功能包括管理计算机系统的硬件,软件及数据资源,控制程序运行,为其他应用软件提供支持等。_操作系统

Python之pip download 命令用法-下载指定平台和python版本的依赖包-程序员宅基地

文章浏览阅读1.9w次,点赞7次,收藏27次。pip download 和 pip install 有着相同的解析和下载过程,不同的是,pip install 会安装依赖项,而 pip download 会把所有已下载的依赖项保存到指定的目录 ( 默认是当前目录 ),此目录稍后可以作为值传递给 pip install --find-links 以便离线或锁定下载包安装_pip download

centos7设置密码策略_CentOS7 设置密码复杂度-程序员宅基地

文章浏览阅读3.4k次。在CentOS下设置密码复杂度分为两步(1)修改/etc/login.defs文件vim /etc/login.defsPASS_MAX_DAYS90   # 密码最长过期天数PASS_MIN_DAYS80    # 密码最小过期天数PASS_MIN_LEN10    # 密码最小长度PASS_WARN_AGE7    # 密码过期警告天数(2)..._echo 'mypassword' | openssl passwd -6 -stdin centos7

王斌老师的博客_王斌 github-程序员宅基地

文章浏览阅读480次。http://blog.sina.com.cn/s/blog_736d0b9101018cgc.html_王斌 github

ACM OJ Collection_htt//acm.wydtang.top/-程序员宅基地

文章浏览阅读737次。原文来自:http://blog.csdn.net/hncqp/article/details/4455263 ACM OJ Collection(排名不分先后):中国:浙江大学(ZJU):http://acm.zju.edu.cn/北京大学(PKU):htt_htt//acm.wydtang.top/

ios 自己服务器 苹果支付_修复苹果IOS支付-程序员宅基地

文章浏览阅读467次。更新记录1.0.0(2019-07-01)插件简介专门用来修复苹果IOS支付时出现"您已购买此App内购买项目。此项目将免费恢复"。问题描述首先在IOS平台里面创建“APP内购买项目”,选择的是“消耗型项目”,然后用uni-app官方的支付api进行支付,多支付几次,有时候就会出现提示“您已购买此App内购买项目。此项目将免费恢复”,特别是在沙盒测试里面支付很大几率出现,我明明选的是消耗型项目,应..._ios开发苹果支付恢复权益

随便推点

郁金香2021年游戏辅助技术中级班(七)_squad辅助科技-程序员宅基地

文章浏览阅读379次。郁金香2021年游戏辅助技术中级班(七)058-C,C++写代码HOOK分析封包数据格式A059-C,C++写代码HOOK分析封包数据格式B-detours劫持060-C,C++写代码HOOK分析封包数据格式C-过滤和格式化061-C,C++写代码HOOK分析封包数据格式D-写入配置文件062-C,C++写代码HOOK分析封包数据格式D-读取配置文件058-C,C++写代码HOOK分析封包数据格式A_squad辅助科技

ssh登录qemu虚拟机里的linux系统_qemu ssh连接-程序员宅基地

文章浏览阅读350次。上面的命令启动了一个带有NAT网络的QEMU虚拟机,并设置了端口转发,将主机的2222端口映射到虚拟机的22端口(SSH端口)。1、安装openssh,如果是根文件系统用buildroot构建,打开 BR2_PACKAGE_OPENSSH 开关。2、在qemu的启动脚本里增加。3、在虚拟机里增加一个新用户。4、向虚拟机里发送文件。_qemu ssh连接

用netty实现zcool_Netty框架入门-程序员宅基地

文章浏览阅读63次。一、概述Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。二、体系结构图三、Netty的核心结构Netty是典型的Reactor模型结构,在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是当前服务器的..._channelconnected

SpringBoot 过滤器 filter 3种方法_spring boot filter 配置-程序员宅基地

文章浏览阅读4.7k次。最近Spring Boot项目做单点登录对接的时候,在配置过滤器的时候,找了几种方法,记录一下。欢迎评论补充沟通~由于之前JAVA Web项目最开始都有web.xml配置,随着框架慢慢的进化,从Spring Boot开始,已经没有了web.xml配置文件。那原来在web.xml里,配置的filter过滤器,在Spring Boot中怎么配置呢?注意,这个自定义类,也不能加@Component或@Configuration注解,加了就会初始化Filter了,过滤全部的路径了。_spring boot filter 配置

Ubuntu下,Python源码制作deb包_unmet build dependencies: debhelper (>= 11)-程序员宅基地

文章浏览阅读1k次。背景: 自己写了一个Python的qt客户端, 然后需要制作deb包1.先贴上代码的目录结构x@hostv6:~/mywork/my-client$ tree.├── 1├── debian│ ├── changelog│ ├── compat│ ├── control│ ├── copyright│ ├── README.Debian│ ├── rules│ ├── source│ │ ├── format│ │ └── loc..._unmet build dependencies: debhelper (>= 11)

13. PyQt5实现多页面切换之QTabWidget_pyqt5 tabwidget-程序员宅基地

文章浏览阅读2.8w次,点赞19次,收藏96次。QTabWidget 类,是一个实现多页面切换的类,该类已经实现了多页面切换的部分功能,只需再对其进行少量的设计(主要是要设计页面中的内容)便可实现多页面切换了。因此,使用该类实现多页面切换时,就不需要再使用 QStackedLayout 布局把页面与选项卡相关联,也不需要使用类似 QVBoxLayout 的布局把选项卡和页面放置在一起。与 QStackedLayout 布局原理相同,只有当前页面(即可见页面)是可见的,所有其他页面都不可见,用户可通过选择不同的选项卡来显示其对应的其他页面。_pyqt5 tabwidget

推荐文章

热门文章

相关标签