最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用POI實現(xiàn)excel文件的導入和導出

 更新時間:2023年12月28日 16:59:49   作者:???潪??  
這篇文章主要為大家詳細介紹了Java如何使用POI實現(xiàn)excel文件的導入和導出功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

說明:

1、文件導出功能:

通過反射獲取實體類的屬性名和屬性值,寫入文件是第一行為屬性名,從第二行開始為屬性值,調(diào)用時只需傳入一個任意實體集合(List)即可。

2、文件導入功能

文件導入功能需要定義一個實體類用于接受解析excel后的內(nèi)容。

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、創(chuàng)建一個excel文檔
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 2、創(chuàng)建文檔摘要
        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、創(chuàng)建樣式
        // 創(chuàng)建標題行的樣式
        HSSFCellStyle headerStyle = workbook.createCellStyle();
        headerStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); // 背景顏色
        headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 填充模式

        HSSFSheet sheet = workbook.createSheet();// 不傳name 默認為sheet1
        // 6、創(chuàng)建標題行 第一行數(shù)據(jù)
        // 只循環(huán)一次目的是將對象名寫入到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、創(chuàng)建后面行
        for (int j=0; j<list.size(); j++) {
            T t = list.get(j);
            String[] fieldValues = getFieldValues(t);
            // 由于第一行已經(jīng)寫入了標題,所以這里從第二行開始寫
            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("系統(tǒng)導出文件.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);
    }

    /**
     * 傳入文件,解析并返回實體集合,用于后續(xù)操作
     * @param file
     * @return
     */
    public static List<TestCase> excelToEntity (MultipartFile file) {
        List<TestCase> list = new ArrayList<>();
        TestCase testCase = null;
        try {
            // 1、創(chuàng)建一個workbook對象
            HSSFWorkbook workbook = new HSSFWorkbook(file.getInputStream());
            // 2、獲取workboot中表單的數(shù)量
            int numberOfSheets = workbook.getNumberOfSheets();
            for (int i=0; i<numberOfSheets; i++) {
                // 3、獲取sheet頁
                HSSFSheet sheet = workbook.getSheetAt(i);
                // 4、獲取sheet頁中的行數(shù)
                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; // 防止數(shù)據(jù)中間有空行
                    }
                    // 7、獲取列數(shù)
                    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;
    }

    /**
     * 判斷字符串首字母是否為大寫,如果不是轉(zhuǎn)化為大寫
     * @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實現(xiàn)excel文件的導入和導出的文章就介紹到這了,更多相關Java POI實現(xiàn)excel導入導出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java結(jié)構(gòu)型模式之橋接模式詳解

    Java結(jié)構(gòu)型模式之橋接模式詳解

    橋接模式是一種很實用的結(jié)構(gòu)型模式,如果系統(tǒng)中某個類存在兩個獨立變化的維度,通過橋接模式將這兩個維度分離出來,使兩者可以獨立擴展
    2023-02-02
  • Spring?Boot日志打印配置詳細介紹

    Spring?Boot日志打印配置詳細介紹

    本文詳細介紹了如何在SpringBoot項目中進行日志配置,包括日志框架概述、日志級別配置、日志文件輸出與滾動配置、電商交易系統(tǒng)中的應用示例以及常見日志問題及解決方案,通過靈活的日志配置,開發(fā)者可以更好地管理和調(diào)試軟件系統(tǒng),需要的朋友可以參考下
    2024-11-11
  • 解決mybatis返回boolean值時數(shù)據(jù)庫返回null的問題

    解決mybatis返回boolean值時數(shù)據(jù)庫返回null的問題

    這篇文章主要介紹了解決mybatis返回boolean值時數(shù)據(jù)庫返回null的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 深入了解HttpClient的ResponseHandler接口

    深入了解HttpClient的ResponseHandler接口

    這篇文章主要為大家介紹了深入了解HttpClient的ResponseHandler接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • JAVA CountDownLatch與thread-join()的區(qū)別解析

    JAVA CountDownLatch與thread-join()的區(qū)別解析

    這篇文章主要介紹了JAVA CountDownLatch與thread-join()的區(qū)別解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • java8新特性之日期時間API

    java8新特性之日期時間API

    這篇文章主要介紹了java8新特性之日期時間API,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java對象和Map之間相互轉(zhuǎn)換的五種方法

    Java對象和Map之間相互轉(zhuǎn)換的五種方法

    在Java開發(fā)中,經(jīng)常需要將Java對象轉(zhuǎn)換成Map,或者反過來將Map轉(zhuǎn)換成Java對象,這種轉(zhuǎn)換在很多場景下都非常有用,比如在序列化和反序列化過程中、在數(shù)據(jù)傳輸和持久化時、或者在進行對象屬性的批量操作時,本文將介紹幾種不同的方法來實現(xiàn)Java對象和Map之間的相互轉(zhuǎn)換
    2025-02-02
  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之數(shù)組

    Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之數(shù)組

    數(shù)組是有序的元素序列,若將有限個類型相同的變量的集合命名,那么這個名稱為數(shù)組名。組成數(shù)組的各個變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時也稱為下標變量。數(shù)組是在程序設計中,為了處理方便, 把具有相同類型的若干元素按有序的形式組織起來的一種形式
    2022-02-02
  • Java實現(xiàn)七牛云文件圖片上傳下載

    Java實現(xiàn)七牛云文件圖片上傳下載

    本文主要介紹了Java實現(xiàn)七牛云文件圖片上傳下載,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 解析Java和IDEA中的文件打包問題

    解析Java和IDEA中的文件打包問題

    這篇文章主要介紹了Java和IDEA中的文件打包問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07

最新評論

东海县| 西盟| 漳平市| 新竹市| 剑川县| 通榆县| 永清县| 乡宁县| 中超| 阿瓦提县| 禄劝| 岳西县| 无极县| 观塘区| 观塘区| 手机| 盘山县| 思茅市| 凉城县| 宜兰市| 当雄县| 华安县| 桂东县| 海盐县| 临颍县| 永嘉县| 什邡市| 城固县| 昌吉市| 伊通| 青阳县| 高唐县| 厦门市| 云南省| 卓尼县| 乌鲁木齐县| 车险| 涞源县| 和林格尔县| 登封市| 宁海县|