多線程導出word

来源:https://www.cnblogs.com/heavenTang/archive/2023/03/08/17191304.html
-Advertisement-
Play Games

導出word,以下為導出單個和zip的兩種格式。 CountDownLatch運用 CountDownLatch和ExecutorService 線程池cachedThreadPool.submit 1、CountDownLatch 概念 CountDownLatch可以使一個獲多個線程等待其他線程 ...


導出word,以下為導出單個和zip的兩種格式。

CountDownLatch運用
CountDownLatch和ExecutorService 線程池cachedThreadPool.submit

1、CountDownLatch 概念

CountDownLatch可以使一個獲多個線程等待其他線程各自執行完畢後再執行。

CountDownLatch 定義了一個計數器,和一個阻塞隊列, 當計數器的值遞減為0之前,阻塞隊列裡面的線程處於掛起狀態,當計數器遞減到0時會喚醒阻塞隊列所有線程,這裡的計數器是一個標誌,可以表示一個任務一個線程,也可以表示一個倒計時器,
CountDownLatch可以解決那些一個或者多個線程在執行之前必須依賴於某些必要的前提業務先執行的場景。

點擊查看代碼

    @Override
    public void batchExportWord(PreDefenceApplyDto preDefenceApplyDto) {
        SystemUserInfo loginUser = AuthorityUtil.getLoginUser();
        if (loginUser == null || StringUtils.isBlank(loginUser.getUserId())) {
            throw new ServiceException(SimpleErrorCode.UserNotLogin);
        }
        if(StringUtils.isBlank(preDefenceApplyDto.getGrade())){
            throw new ServiceException(301,"請選擇年級");
        }
        String grade = preDefenceApplyDto.getGrade();
        List<String> collegeIds = preDefenceApplyDto.getCollegeIds();
        String majorId = preDefenceApplyDto.getMajorId();

        // 查詢學生論文結果
        List<String> studentIds = preDefenceApplyMapper.selectHasResStu(grade,collegeIds,majorId);
        if(CollectionUtils.isEmpty(studentIds)){
            throw new ServiceException(302,"暫無審核通過的學生可導出");
        }
        //學校名稱
        String schoolName = publicMapper.querySchoolName();

        FileOutputStream fileOutputStream = null;
        FileInputStream fileInputStream = null;
        BufferedInputStream bufferedInputStream = null;

        String downloadName = "情況表.zip";
        response.setContentType("application/zip;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + Encodes.urlEncode(downloadName));
        String realPath = request.getSession().getServletContext().getRealPath("");

        try (
                OutputStream outputStream = response.getOutputStream();
                // 壓縮流
                ZipOutputStream zos = new ZipOutputStream(outputStream)){

                ExecutorService cachedThreadPool = Executors.newFixedThreadPool(studentIds.size());
                CountDownLatch latch = new CountDownLatch(studentIds.size());
                for(String stuId : studentIds){
                    cachedThreadPool.submit(() -> {
                        try {
                            zipPreWord(  bufferedInputStream, zos,
                                    stuId, schoolName ,realPath);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        latch.countDown();
                    });
                }
                cachedThreadPool.shutdown();
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedInputStream != null) {
                    bufferedInputStream.close();
                }
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
                if (fileOutputStream != null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public void zipPreWord( BufferedInputStream bufferedInputStream,ZipOutputStream zos,
                           String studentId,String schoolName ,String realPath) throws IOException {


        byte[] buffer = new byte[1024];
        int len = 0;

        PreDefenceApplyVo preDefenceApplyVo = preDefenceApplyMapper.resultQuery(studentId);
        String fileName =studentId+preDefenceApplyVo.getStudentName();
        fileName=fileName.replaceAll("/", "-")+"情況表.doc";
        String filePath = realPath + File.separator + fileName;

        File outFile = new File(filePath );

        Configuration configuration = new Configuration(Configuration.getVersion());
        configuration.setDefaultEncoding("UTF-8");
        configuration.setClassForTemplateLoading(this.getClass(), "/templates");

        Template template = null;
        try {
            template = configuration.getTemplate(schoolName + "情況表2.ftl"); 
        } catch (IOException e) {
            log.error("context", e);
            throw new ServiceException(SimpleErrorCode.ExecFailure);
        }

        Map<String, Object> params = new HashMap<>();
        params.put("preDefenceApplyVo", preDefenceApplyVo);
        params.put("schoolName", schoolName);
        try {
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));

            template.process(params, out);
        } catch (TemplateException e) {
            e.printStackTrace();
        }


        ZipEntry zipEntry = new ZipEntry(fileName);
        bufferedInputStream = new BufferedInputStream( new FileInputStream(outFile));
        zos.putNextEntry(zipEntry);
        while ((len = bufferedInputStream.read(buffer)) != -1) {
            zos.write(buffer, 0, len);
        }

    }
    @Override
    public void exportWord(PreDefenceApplyDto preDefenceApplyDto) {
        SystemUserInfo loginUser = AuthorityUtil.getLoginUser();
        if (loginUser == null) {
            throw new ServiceException(SimpleErrorCode.UserNotLogin);
        }
        String studentId = loginUser.getUserId();
        if (preDefenceApplyDto != null && StringUtils.isNotBlank(preDefenceApplyDto.getStudentId())) {
            studentId = preDefenceApplyDto.getStudentId();
        }
        //學校名稱
        String schoolName = publicMapper.querySchoolName();

        PreDefenceApplyVo preDefenceApplyVo = preDefenceApplyMapper.resultQuery(studentId);

        String fileName = schoolName + "情況表.doc";
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition", "attachment;fileName=" + stringToUnicode(fileName));

        String filePath = request.getSession().getServletContext().getRealPath("/");


        OutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Configuration configuration = new Configuration(Configuration.getVersion());
        configuration.setDefaultEncoding("UTF-8");
        configuration.setClassForTemplateLoading(this.getClass(), "/templates");

        Template template = null;
        try {
            template = configuration.getTemplate(schoolName + "情況表2.ftl"); 
        } catch (IOException e) {
            log.error("context", e);
            throw new ServiceException(SimpleErrorCode.ExecFailure);
        }

        Map<String, Object> params = new HashMap<>();
        params.put("preDefenceApplyVo", preDefenceApplyVo);
        params.put("schoolName", schoolName);

        File outFile = new File(filePath + "/" + fileName);
        byte[] buffer = new byte[1024];
        int len = 0;
        BufferedInputStream bufferedInputStream = null;
        try {

            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));

            try {
                template.process(params, out);
            } catch (TemplateException e) {
                e.printStackTrace();
            }
            FileInputStream fileInputStream = new FileInputStream(outFile);
            bufferedInputStream = new BufferedInputStream(fileInputStream);
            while ((len = bufferedInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, len);
            }

            out.close();
            fileInputStream.close();
            bufferedInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (outFile.exists()) {
                if (!outFile.delete()) {
                    log.info("刪除失敗!");
                }
            }
        }

    }


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 每次啟動SpringBoot項目時,總是能看到控制台列印了一串字元,隱約能辨認出是“Spring”,不知大家是否也好奇過是怎麼實現的,是直接列印固定的字元串,還是根據什麼演算法去生成的?於是閑暇無事,探究一番。 只想修改banner可以跳到文末查看 SpringBoot是怎麼列印的 Banner ...
  • 簡介 在現實世界中,我們常常需要等待其它任務完成,才能繼續執行下一步。Java實現等待子線程完成再繼續執行的方式很多。我們來一一查看一下。 Thread的join方法 該方法是Thread提供的方法,調用join()時,會阻塞主線程,等該Thread完成才會繼續執行,代碼如下: private st ...
  • 說起開源CMS,你會想到哪些呢?WordPress?DoraCMS?joomla? 今天再給大家推薦一個非常好用的開源CMS:Wagtail 如果您正在選型的話,可以瞭解一下Wagtail的特點: 基於Django構建,具有出色的文檔管理功能和友好的用戶界面。 提供了一個靈活且易於使用的頁面編輯器, ...
  • 學習網頁設計和網路編程可能是一種有趣而有意義的體驗,但需要時間,精力和練習.這裡有一些技巧可以幫助您更輕鬆地學習這些技能: 從基礎知識開始:在您深入研究高級主題之前,重要的是要有牢固的理解很重要基礎知識.首先學習HTML,CSS和JavaScript,這是網路的基礎語言. 使用線上資源:線上資源有許 ...
  • 概述 鎖是電腦協調多個進程或線程併發訪問某一資源的機制。在資料庫中,除傳統的計算資源(CPU、RAM、I/O)的爭用以外,數據也是一種供許多用戶共用的資源。如何保證數據併發訪問的一致性、有效性是所有資料庫必須解決的一個問題,鎖衝突也是影響資料庫併發訪問性能的一個重要因素。從這個角度來說,鎖對資料庫 ...
  • Java編程語言是由Sun微系統公司在20世紀90年代早期開發的。儘管Java主要用於基於internet的應用程式,但它是一種簡單、高效、通用的語言。Java最初是為運行在多個平臺上的嵌入式網路應用程式而設計的。它是一種可移植的、面向對象的解釋性語言。 Java是非常可移植的。相同的Java應用程 ...
  • VB.NET語言線上運行編譯,是一款可線上編程編輯器,在編輯器上輸入VB.NET語言代碼,點擊運行,可線上編譯運行VB.NET語言,VB.NET語言代碼線上運行調試,VB.NET語言線上編譯,可快速線上測試您的VB.NET語言代碼,線上編譯VB.NET語言代碼發現是否存在錯誤,如果代碼測試通過,將會 ...
  • 控制語句:程式預設是順序執行,但在實際項目中需要選擇、迴圈。 1 選擇控制語句if 1.1 if語句的形式 1 if(條件表達式) 2 {//複合語句,若幹條語句的集合 3 語句一; 4 語句二; 5 } 註意:如果條件成立執行大括弧里的所有語句,不成立的話大括弧里的語句都不執行。 if(條件表達式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...