Java使用POI实现excel文件的导入和导出

 更新时间:2023年12月28日 16:59:49   作者:ะัี潪ิื  
这篇文章主要为大家详细介绍了Java如何使用POI实现excel文件的导入和导出功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

说明:

1、文件导出功能:

通过反射获取实体类的属性名和属性值,写入文件是第一行为属性名,从第二行开始为属性值,调用时只需传入一个任意实体集合(List)即可。

2、文件导入功能

文件导入功能需要定义一个实体类用于接受解析excel后的内容。

package com.cz.excel;

import com.cz.model.TestCase;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 工具类,用于文件上传、下载、解析
 * @program: PostGirl-panent
 * @description: PoiUtils
 * @author: Cheng Zhi
 * @create: 2021-02-28 09:57
 **/
public class PoiUtils {

    /**
     * 将对象集合导出到excel
     * @param list
     * @param <T>
     * @return
     */
    public static <T> ResponseEntity<byte[]> exportToExcel(List<T> list) {

        // 1、创建一个excel文档
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 2、创建文档摘要
        workbook.createInformationProperties();
        // 3、获取并配置文档摘要信息
        DocumentSummaryInformation docInfo = workbook.getDocumentSummaryInformation();
        // 文档类别
        docInfo.setCategory("文档类别");
        // 文档管理员
        docInfo.setManager("PostGirl");
        // 设置公司信息
        docInfo.setCompany("www.postgirl.com");
        // 4、获取文档摘要信息
        SummaryInformation summaryInformation = workbook.getSummaryInformation();
        // 文档标题
        summaryInformation.setTitle("文档标题");
        // 文档作者
        summaryInformation.setAuthor("PostGirl");
        // 备注信息
        summaryInformation.setComments("本文档由 PostGirl 提供");

        // 5、创建样式
        // 创建标题行的样式
        HSSFCellStyle headerStyle = workbook.createCellStyle();
        headerStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); // 背景颜色
        headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 填充模式

        HSSFSheet sheet = workbook.createSheet();// 不传name 默认为sheet1
        // 6、创建标题行 第一行数据
        // 只循环一次目的是将对象名写入到excel标题上
        for (T t : list) {
            HSSFRow row = sheet.createRow(0);
            String[] fieldNames = getFiledNames(t);
            for (int i=0; i<fieldNames.length; i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellValue(fieldNames[i]);
                cell.setCellStyle(headerStyle);
        }
            break;
        }

        // 7、创建后面行
        for (int j=0; j<list.size(); j++) {
            T t = list.get(j);
            String[] fieldValues = getFieldValues(t);
            // 由于第一行已经写入了标题,所以这里从第二行开始写
            HSSFRow rows = sheet.createRow(j+1);
            for (int i=0; i<fieldValues.length; i++) {
                rows.createCell(i).setCellValue(fieldValues[i]);
            }
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        HttpHeaders headers = new HttpHeaders();
        try {
            // 防止乱码
            headers.setContentDispositionFormData("attachment",new String("系统导出文件.xls".getBytes("UTF-8"),"ISO-8859-1"));
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            workbook.write(baos);

        } catch (IOException e) {
            e.printStackTrace();
        }

        return new ResponseEntity<byte[]>(baos.toByteArray(),headers, HttpStatus.CREATED);
    }

    /**
     * 传入文件,解析并返回实体集合,用于后续操作
     * @param file
     * @return
     */
    public static List<TestCase> excelToEntity (MultipartFile file) {
        List<TestCase> list = new ArrayList<>();
        TestCase testCase = null;
        try {
            // 1、创建一个workbook对象
            HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream());
            // 2、获取workboot中表单的数量
            int numberOfSheets = workbook.getNumberOfSheets();
            for (int i=0; i<numberOfSheets; i++) {
                // 3、获取sheet页
                HSSFSheet sheet = workbook.getSheetAt(i);
                // 4、获取sheet页中的行数
                int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();

                for (int j=0; j<physicalNumberOfRows; j++) {
                    if (j==0) {
                        continue; // 跳过标题行
                    }
                    // 6、获取行
                    HSSFRow row = sheet.getRow(j);
                    if (row == null) {
                        continue; // 防止数据中间有空行
                    }
                    // 7、获取列数
                    int physicalNumberOfCells = row.getPhysicalNumberOfCells();
                    testCase = new TestCase();
                    testCase.setCreateDate(new Date());
                    testCase.setLastUpdateDate(new Date());
                    for (int k=0; k<physicalNumberOfCells; k++) {
                        HSSFCell cell = row.getCell(k);
                        switch (k) {
                            case 1:
                                testCase.setRequest(cell.getStringCellValue());
                                break;
                            case 2:
                                testCase.setExpectedResponse(cell.getStringCellValue());
                                break;
                            case 5:
                                testCase.setBusiCode(cell.getStringCellValue());
                                break;
                            default:
                                break;
                        }
                    }
                    list.add(testCase);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return list;
    }
    /**
     * 获取所有对象属性名称
     * @param o
     * @return
     */
    public static String[] getFiledNames(Object o) {
        Field[] fields=o.getClass().getDeclaredFields();
        String[] fieldNames=new String[fields.length];
        for(int i=0;i<fields.length;i++){
            fieldNames[i]=fields[i].getName();
        }
        return fieldNames;
    }
    /**
     * 获取对象属性值
     * @param o
     * @return
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    private static String[] getFieldValues(Object o) {
        Field[] fields=o.getClass().getDeclaredFields();
        String[] fieldNames=new String[fields.length];
        String[] fieldValues = new String[fieldNames.length];
        for(int i=0;i<fields.length;i++){
            fieldNames[i]=fields[i].getName();
        }
        try {
            for (int i=0; i<fieldNames.length; i++) {
                String fieldName = fieldNames[i];
                String field = o.getClass().getMethod("get" + returnFirstCapital(fieldName)).invoke(o).toString();
                fieldValues[i] = field;
            }
        } catch(Exception e) {

        }
        return fieldValues;
    }

    /**
     * 判断字符串首字母是否为大写,如果不是转化为大写
     * @param str
     * @return
     */
    public static String returnFirstCapital(String str) {
        if (str.charAt(0) >= 'A' && str.charAt(0) <= 'Z') {
            return str;
        }
        char[] ch = str.toCharArray();
        ch[0] -= 32;
        return String.valueOf(ch);
    }

}

到此这篇关于Java使用POI实现excel文件的导入和导出的文章就介绍到这了,更多相关Java POI实现excel导入导出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java DataInputStream和DataOutputStream详解及实例代码

    java DataInputStream和DataOutputStream详解及实例代码

    这篇文章主要介绍了java DataInputStream和DataOutputStream详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • 一文了解Spring中拦截器的原理与使用

    一文了解Spring中拦截器的原理与使用

    在web开发中,拦截器是经常用到的功能。它可以帮我们预先设置数据以及统计方法的执行效率等等。今天就来详细的谈一下spring中的拦截器,需要的可以参考一下
    2022-06-06
  • 详解spring boot rest例子

    详解spring boot rest例子

    这篇文章主要介绍了详解spring boot rest例子,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 全面解析Java中的注解与注释

    全面解析Java中的注解与注释

    这篇文章主要介绍了Java中的注解与注释,简单来说注解以@符号开头而注释被包含在/***/符号中,各自具体的作用则来看本文详解,需要的朋友可以参考下
    2016-05-05
  • java导出到excel常用的几种方式总结

    java导出到excel常用的几种方式总结

    导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下,下面这篇文章主要给大家介绍了关于java导出到excel常用的几种方式,需要的朋友可以参考下
    2023-05-05
  • 详解Spring Boot中MyBatis的使用方法

    详解Spring Boot中MyBatis的使用方法

    mybatis初期使用比较麻烦,需要各种配置文件、实体类、dao层映射关联、还有一大推其它配置。当然mybatis也发现了这种弊端。下面通过本文给大家详细介绍Spring Boot中MyBatis的使用方法,感兴趣的朋友一起看看吧
    2017-07-07
  • 关于SpringMVC中控制器如何处理文件上传的问题

    关于SpringMVC中控制器如何处理文件上传的问题

    这篇文章主要介绍了关于SpringMVC中控制器如何处理文件上传的问题,在 Web 应用程序中,文件上传是一个常见的需求,例如用户上传头像、上传文档等,本文将介绍 Spring MVC 中的控制器如何处理文件上传,并提供示例代码,需要的朋友可以参考下
    2023-07-07
  • Java 实现跨平台的操作方式

    Java 实现跨平台的操作方式

    这篇文章主要介绍了Java 实现跨平台的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java使用Runnable和Callable实现多线程的区别详解

    Java使用Runnable和Callable实现多线程的区别详解

    这篇文章主要为大家详细介绍了Java使用Runnable和Callable实现多线程的区别之处,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-07-07
  • 解决IDEA maven 项目修改代码不生效,mvn clean、install后才生效

    解决IDEA maven 项目修改代码不生效,mvn clean、install后才生效

    这篇文章主要介绍了解决IDEA maven 项目修改代码不生效,mvn clean、install后才生效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论