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

Java實現(xiàn)集合和Excel文件相互轉(zhuǎn)換

 更新時間:2025年08月01日 09:51:48   作者:CAT_cwds  
本文主要介紹了使用Java和ApachePOI庫將集合轉(zhuǎn)化為包含合并單元格的Excel文件,及從Excel文件流中讀取并轉(zhuǎn)化為集合,具有一定的參考價值,感興趣的可以了解一下

一、集合轉(zhuǎn)化為Excel文件

效果如下,是將集合轉(zhuǎn)化為Excel文件,Excel包含合并單元格。

實體類:

@Data
public class ClassGrade {
    /** 年級 */
    private String grade;
    /** 班主任 */
    private String leader;
    /** 學(xué)生列表 */
    private List<Student> students;

    @Data
    public static class Student {
        /** 姓名 */
        private String name;
        /** 年齡 */
        private Integer age;
        /** 性別 */
        private String sex;
        /** 成績 */
        private Integer gradeResult;
    }
}

需求就是將ClassGrade的集合轉(zhuǎn)化為Excel表格對外輸出。沒有針對當(dāng)前類去逐個取值處理,用到了反射來處理,達到了簡化代碼通用的目的。這個只針對有一個合并單元格的情形,如果是合并單元格中包含合并單元格的話,還需要加代碼去處理。

實現(xiàn)代碼如下:

1.初始化表頭類,參數(shù)為表頭集合

    public static SXSSFWorkbook makeExcelHead(String[] titles) {
        SXSSFWorkbook workbook = new SXSSFWorkbook();
        CellStyle styleTitle = getTitleStyle(workbook, (short) 16);
        SXSSFSheet sheet = workbook.createSheet();
        SXSSFRow rowTitle = sheet.createRow(0);
        for (int i = 0; i < titles.length; i++) {
            sheet.setDefaultColumnWidth(25);
            SXSSFCell cellTitle = rowTitle.createCell(i);
            // 為標(biāo)題設(shè)置背景顏色
            styleTitle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            styleTitle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex());
            cellTitle.setCellValue(titles[i]);
            cellTitle.setCellStyle(styleTitle);
        }
        return workbook;
    }

2.反射獲取實體的值

    public static <T> Object getProperty(T t, String propertyName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IndexOutOfBoundsException {
        Class<?> aClass = t.getClass();
        propertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
        Method method = aClass.getMethod("get" + propertyName);
        Object invoke = method.invoke(t);
        return invoke;
    }

2.將集合轉(zhuǎn)化為Excel

    @Test
    public void exportExcel() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        //初始化數(shù)據(jù)
        List<ClassGrade> fileList = new ArrayList<>();
        for (int m = 1; m <= 1; m++) {
            fileList.addAll(getGrades());
        }

        //表頭名稱
        String[] title = {"班主任", "學(xué)生姓名", "學(xué)生年齡", "學(xué)生性別", "學(xué)生成績", "班級"};
        SXSSFWorkbook workbook = SXSSFWorkbookUtil.makeExcelHead(title);

        //每一列表頭屬性,如果子類里面的,則提取子類里面對應(yīng)的屬性名
        String[] properties = {"leader", "name", "age", "sex", "gradeResult", "grade"};

        //獲取當(dāng)前sheet
        SXSSFSheet sheet = workbook.getSheetAt(0);
        int initRowNum = 0;
        //遍歷數(shù)據(jù),需要根據(jù)業(yè)務(wù)邏輯去處理是否合并單元格
        for (int i = 0; i < fileList.size(); i++) {
            ClassGrade file = fileList.get(i);
            int size = file.getStudents().size();

			//創(chuàng)建行,以子類的集合數(shù)為準(zhǔn)
            int startRowNum = initRowNum + 1;
            int lastRowNum = startRowNum + size - 1;
            SXSSFRow row = sheet.getRow(startRowNum);
            if (row == null) {
                row = sheet.createRow(startRowNum);
            }

            //班主任一列,處理合并單元格
            for (int m = 0; m < 1; m++) {
                if (lastRowNum - startRowNum > 0) {
                    sheet.addMergedRegion(new CellRangeAddress(startRowNum, lastRowNum, m, m));
                }
                createCell(row, m, SXSSFWorkbookUtil.getProperty(file, properties[m]));
            }

            //處理學(xué)生姓名~學(xué)生成績四列,非合并單元格信息
            int xRowNum = startRowNum;
            List<ClassGrade.Student> receiptItems = file.getStudents();
            for (ClassGrade.Student student : receiptItems) {
                SXSSFRow row1 = sheet.getRow(xRowNum);
                if (row1 == null) {
                    row1 = sheet.createRow(xRowNum);
                }
                for (int q = 1; q <= 4; q++) {
                	//利用反射獲取到值,并且設(shè)置到cell里面
                    createCell(row1, q, SXSSFWorkbookUtil.getProperty(student, properties[q]));
                }
                xRowNum++;
            }

            //處理班級信息合并單元格
            for (int n = 5; n <= 5; n++) {
                if (lastRowNum - startRowNum >= 1) {
                    sheet.addMergedRegion(new CellRangeAddress(startRowNum, lastRowNum, n, n));
                }
                createCell(row, n, SXSSFWorkbookUtil.getProperty(file, properties[n]));
            }
            initRowNum = lastRowNum;

        }

        //導(dǎo)出
        try (
                FileOutputStream excel = new FileOutputStream("excel.xls");
                BufferedOutputStream bos = new BufferedOutputStream(excel)) {
            workbook.write(bos);
            System.out.println("導(dǎo)出完成");
        } catch (
                IOException e) {
            System.out.println("導(dǎo)出失敗:" + e.getMessage());
        }

    }

    private void createCell(SXSSFRow row, int column, Object value) {
        SXSSFCell cell = row.createCell(column);
        if (value != null) {
            cell.setCellValue(String.valueOf(value));
        }
    }

效果

二、Excel文件轉(zhuǎn)化為集合

如題,將獲取到的excel文件流轉(zhuǎn)化為集合進行處理。挺簡單的。思路就是將一個文件流轉(zhuǎn)化為一個備用類,再將備用類轉(zhuǎn)化為想要的集合。

excel:

備用類代碼:

@Data
public class ClassGrade2 {
    /** 年級 */
    private String grade;
    /** 班主任 */
    private String leader;
    /** 姓名 */
    private String name;
    /** 年齡 */
    private Integer age;
    /** 性別 */
    private String sex;
    /** 成績 */
    private Integer gradeResult;
}

轉(zhuǎn)化代碼:

    @Test
    public void test1() {
        ExcelReader reader = ExcelUtil.getReader("excelToList.xls");
        List<List<Object>> rows = reader.read();
        //根據(jù)excel的結(jié)構(gòu),需要準(zhǔn)備一個備用類接收數(shù)據(jù)
        List<ClassGrade2> listBaks = new ArrayList<>();

        //初始化屬性,屬性是備用類的屬性名
        String[] properties = {"leader", "name", "age", "sex", "gradeResult", "grade"};
        for (int j = 1; j < rows.size(); j++) {
            List<Object> cells = rows.get(j);
            try {
                //反射獲取值,組裝成備用類
                ClassGrade2 file = new ClassGrade2();
                Class<?> clz = file.getClass();
                Method[] methods = clz.getDeclaredMethods();
                for (int i = 0; i < cells.size(); i++) {
                    String propertyName = properties[i].substring(0, 1).toUpperCase() + properties[i].substring(1);
                    Method method = Arrays.stream(methods).filter(m -> Objects.equal(m.getName(), "set" + propertyName)).findFirst().orElse(null);
                    Object cell = cells.get(i);
                    if (cell == null) {
                        continue;
                    }
                    Field field = clz.getDeclaredField(properties[i]);
                    String fieldType = field.getType().getName();
                    if (fieldType.equals("java.lang.String")) {
                        method.invoke(file, String.valueOf(cell));
                    } else if (fieldType.equals("java.math.BigDecimal")) {
                        method.invoke(file, new BigDecimal(String.valueOf(cell)));
                    }
                }
                listBaks.add(file);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } finally {

            }
        }
        //備用類轉(zhuǎn)化為想要的集合類
        int i = 0;
        List<ClassGrade> files = new ArrayList<>();
        for (int m = 0; m < listBaks.size(); m++) {
            ClassGrade2 fileBak = listBaks.get(m);
            if (Strings.isNotEmpty(fileBak.getGrade())) {
                ClassGrade file = BeanUtil.copyProperties(fileBak, ClassGrade.class);
                files.add(file);

                ClassGrade.Student item = BeanUtil.copyProperties(fileBak, ClassGrade.Student.class);
                List<ClassGrade.Student> items = new ArrayList<>();
                items.add(item);
                file.setStudents(items);
                i++;
            } else {
                ClassGrade.Student item = BeanUtil.copyProperties(fileBak, ClassGrade.Student.class);
                ClassGrade file = files.get(i - 1);
                List<ClassGrade.Student> items = CollectionUtils.isEmpty(file.getStudents()) ? new ArrayList<>() : file.getStudents();
                items.add(item);
                file.setStudents(items);
            }
        }
        log.info("{}", JSONArray.toJSONString(listBaks));
        log.info("{}", JSONArray.toJSONString(files));
    }

實現(xiàn)效果:

11:47:03.635 [main] INFO Excel3Test - [{"grade":"八年級1班","leader":"趙老師","name":"張三","sex":"女"},{"grade":"八年級1班","leader":"趙老師","name":"李四","sex":"女"},{"grade":"八年級1班","leader":"趙老師","name":"王五","sex":"女"}]
11:47:03.647 [main] INFO Excel3Test - [{"grade":"八年級1班","leader":"趙老師","students":[{"name":"張三","sex":"女"}]},{"grade":"八年級1班","leader":"趙老師","students":[{"name":"李四","sex":"女"}]},{"grade":"八年級1班","leader":"趙老師","students":[{"name":"王五","sex":"女"}]}]

到此這篇關(guān)于Java實現(xiàn)集合和Excel文件相互轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Java集合和Excel文件相互轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java反射之Method的invoke方法實現(xiàn)教程詳解

    java反射之Method的invoke方法實現(xiàn)教程詳解

    這篇文章主要給大家介紹了關(guān)于java反射之Method的invoke方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Spring中的SpringApplicationRunListener詳細解析

    Spring中的SpringApplicationRunListener詳細解析

    這篇文章主要介紹了Spring中的SpringApplicationRunListener詳細解析,SpringApplicationRunListener是一個監(jiān)聽SpringApplication中run方法的接口,在項目啟動過程的各個階段進行事件的發(fā)布,需要的朋友可以參考下
    2023-11-11
  • 深入理解java自旋鎖

    深入理解java自旋鎖

    這篇文章主要介紹了如何深入理解java自旋鎖,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,下面和小編來一起學(xué)習(xí)下吧
    2019-05-05
  • java 8 lambda表達式list操作分組、過濾、求和、最值、排序、去重代碼詳解

    java 8 lambda表達式list操作分組、過濾、求和、最值、排序、去重代碼詳解

    java8的lambda表達式提供了一些方便list操作的方法,主要涵蓋分組、過濾、求和、最值、排序、去重,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • 學(xué)習(xí)SpringBoot容器功能及注解原理

    學(xué)習(xí)SpringBoot容器功能及注解原理

    這篇文章主要介紹了學(xué)習(xí)SpringBoot容器功能及注解原理,文中通過詳細的代碼示例對SpringBoot容器功能及注解原理進行了解析,有需要的朋友可以借鑒參考下
    2021-09-09
  • Java?Spring聲明式事務(wù)失效情況解決辦法(天翼通訊)

    Java?Spring聲明式事務(wù)失效情況解決辦法(天翼通訊)

    在Spring的聲明式事務(wù)中,多線程環(huán)境下事務(wù)會失效,因為子線程無法繼承父線程的事務(wù)上下文,這篇文章主要介紹了Java?Spring聲明式事務(wù)失效情況解決辦法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-10-10
  • SpringCloud微服務(wù)踩坑記錄分享

    SpringCloud微服務(wù)踩坑記錄分享

    本文記錄了作者在使用SpringCloud微服務(wù)時遇到的問題,首先,作者嘗試修改配置文件中的service-name和instance-id,但仍然無法解決問題,后來,作者嘗試更換SpringCloud版本為2.2.5,并搭配Hoxton.SR3版本,問題得以解決
    2024-11-11
  • Java 整合模板徹底解決ssm配置難題

    Java 整合模板徹底解決ssm配置難題

    SSM框架是spring MVC ,spring和mybatis框架的整合,是標(biāo)準(zhǔn)的MVC模式,將整個系統(tǒng)劃分為表現(xiàn)層,controller層,service層,DAO層四層,使用spring MVC負(fù)責(zé)請求的轉(zhuǎn)發(fā)和視圖管理,spring實現(xiàn)業(yè)務(wù)對象管理,mybatis作為數(shù)據(jù)對象的持久化引擎
    2021-10-10
  • Spring Security 圖片驗證碼功能的實例代碼

    Spring Security 圖片驗證碼功能的實例代碼

    spring security是一系列的過濾器鏈,所以在這里驗證碼也聲明為過濾器,加在過濾器鏈的 登錄過濾器之前,然后自定義一個異常類,來響應(yīng)驗證碼的錯誤信息.這篇文章主要介紹了Spring Security 圖片驗證碼,需要的朋友可以參考下
    2018-03-03
  • Idea如何使用System.getenv()獲取環(huán)境變量的值

    Idea如何使用System.getenv()獲取環(huán)境變量的值

    文章介紹了如何在Java中使用`System.getenv()`方法讀取環(huán)境變量的值,并提供了兩種配置環(huán)境變量的方法:啟動項配置和系統(tǒng)環(huán)境變量配置,對于系統(tǒng)環(huán)境變量,文章特別指出需要重啟電腦或程序才能使其生效
    2024-11-11

最新評論

大关县| 南岸区| 康乐县| 九龙城区| 洪雅县| 库车县| 大英县| 屏南县| 老河口市| 墨竹工卡县| 宣武区| 襄城县| 鄂伦春自治旗| 彰武县| 洪洞县| 旅游| 上杭县| 元氏县| 青河县| 屏南县| 沐川县| 乌拉特中旗| 巴林右旗| 温宿县| 阿城市| 南川市| 庄浪县| 垫江县| 合水县| 麦盖提县| 交城县| 玛沁县| 库尔勒市| 磐石市| 诸城市| 义马市| 靖安县| 赤城县| 苗栗市| 广河县| 丘北县|