欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java、springboot?接口導(dǎo)出txt方式

 更新時(shí)間:2022年01月26日 15:07:08   作者:通尼渣渣  
這篇文章主要介紹了java、springboot?接口導(dǎo)出txt方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java、springboot 接口導(dǎo)出txt

就寫兩個(gè)方法

@Log
    @ApiOperation(value = "導(dǎo)出單碼/箱碼",produces = "application/octet-stream")
    @GetMapping(value = "/export")
    public void exportExcel(TraceBatchPageQuery page HttpServletResponse response){
        Page<TraceBatchDto> pages = traceBatchService.pageByParam(page);
        if (page.getRecords().size()==0)
            throw new BusinessException("數(shù)據(jù)為空");
      
        for(TraceBatchDto dto:pages.getRecords()){
            if (type==0)
                text.append(dto.getQuantity());
            else
                text.append(dto.getPackQuantity());
            text.append("\r\n");//換行字符
        }
        //導(dǎo)出的文件存儲(chǔ)目錄
        ExportUtil.exportTxt(response,text.toString());
    }
  /* 導(dǎo)出txt文件
     * @author
     * @param	response
     * @param	text 導(dǎo)出的字符串
     * @return
     */
    public static void exportTxt(HttpServletResponse response, String text,String name){
        response.setCharacterEncoding("utf-8");
        //設(shè)置響應(yīng)的內(nèi)容類型
        response.setContentType("text/plain");
        //設(shè)置文件的名稱和格式
        response.addHeader("Content-Disposition","attachment;filename="
                + "data.txt");
        BufferedOutputStream buff = null;
        ServletOutputStream outStr = null;
        try {
            outStr = response.getOutputStream();
            buff = new BufferedOutputStream(outStr);
            buff.write(text.getBytes("UTF-8"));
            buff.flush();
            buff.close();
        } catch (Exception e) {
            //LOGGER.error("導(dǎo)出文件文件出錯(cuò):{}",e);
        } finally {try {
            buff.close();
            outStr.close();
        } catch (Exception e) {
            //LOGGER.error("關(guān)閉流對(duì)象出錯(cuò) e:{}",e);
        }
        }
    }

Springboot 文件處理導(dǎo)入導(dǎo)出

簡(jiǎn)單記錄下使用Springboot進(jìn)行文件與后端交互、excel前臺(tái)導(dǎo)出等內(nèi)容

這里用到了:elelemt-ui\HTML\vue\Springboot框架

后臺(tái)導(dǎo)入

HTML:

? ? ? ? <el-button-group>
? ? ? ? ? ? <el-button @click="importExcel()" size="small" type = "primary">導(dǎo)入</el-button>
? ? ? ? ? ? <el-button @click="exportExcel()" size="small">導(dǎo)出</el-button>
? ? ? ? </el-button-group>

Javascript:響應(yīng)importExcel彈窗,文件選擇,遍歷發(fā)送給后端

            importExcel: function () {
                this.upload();
                this.handleFile();
            },
            upload: function () {
                var inputObj = document.createElement('input');
                inputObj.setAttribute('id', 'file');
                inputObj.setAttribute('type', 'file');
                inputObj.setAttribute('name', 'file');
                inputObj.setAttribute("style", 'visibility:hidden');
                document.body.appendChild(inputObj);
                inputObj.value;
                inputObj.click();
                console.log(inputObj);
            },
            //處理文件
            handleFile: function () {
                document.querySelector('#file').addEventListener('change', function (e) {
                    for (let entry of e.target.files) {
                        //處理files
                        var fd = new FormData();
                        fd.append('file', entry);
                        fd.append('type', dotType+'dot_Detail');
                        fd.append('params', JSON.stringify({master_id:dotId,type:dotType}));
                        $.ajax({
                            url: "url", //請(qǐng)求的url地址
                            dataType: "json", //返回格式為json
                            async: false,//請(qǐng)求是否異步,默認(rèn)為異步,這也是ajax重要特性
                            data: fd, //參數(shù)值
                            type: "POST", //請(qǐng)求方式
                            contentType: false,// 不設(shè)置Content-Type請(qǐng)求頭
                            processData: false,// 不處理發(fā)送的數(shù)據(jù)
                            success: function (res) { 
                            },
                            error: function (XMLHttpRequest, textStatus, errorThrown) { 
                            }
                        });
                    }
                })
            },

Java:接收前端FormData()中包含的file\type\params字段,利用file在業(yè)務(wù)中使用POI或者Easy這樣的做導(dǎo)入功能開(kāi)發(fā)

    @Autowired
    ExcelServiceImpl excelService;
 
    @RequestMapping("/read")
    @ResponseBody
    public ResposeObject read(@RequestParam MultipartFile file, String type, String params) {
        Map<String,Object> paramMap = JSONObject.parseObject(params,Map.class);
        try {
            if (file != null) {
                InputStream ins = file.getInputStream();
                excelService.read(ins,type,paramMap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResposeHelper.ok("ok");
    }

前臺(tái)導(dǎo)入

HTML:

? ? ? ? ? ? <a v-on:click="importExcel()" href="javascript:void(0);" rel="external nofollow"  rel="external nofollow"  >
? ? ? ? ? ? ? ? 從excel導(dǎo)入...
? ? ? ? ? ? </a>

Javascript:

data: function () {
            return {
                dataList: [
                    {
                        addr: '',
                        code: '',
                        start: '',
                        length: '',
                        crc: '',
                        rate: '',
                        state: ''
                    }
                ],
    }
}
mothods:{ 
            importExcel: function () {
                this.upload();
                this.handleFile();
            },
 
            upload: function () {
                var inputObj = document.createElement('input');
                inputObj.setAttribute('id', 'file');
                inputObj.setAttribute('type', 'file');
                inputObj.setAttribute('name', 'file');
                inputObj.setAttribute("style", 'visibility:hidden');
                document.body.appendChild(inputObj);
                inputObj.value;
                inputObj.click();
                console.log(inputObj);
                inputObj.value = '';
            },
            //處理文件
            handleFile: function () {
                document.querySelector('#file').addEventListener('change', function (e) {
                    for(let entry of e.target.files){
                        readFile(entry);
                    }
                })
            },
}
 
<script type="text/javascript">
   //循環(huán)讀取文件觸發(fā)parseXlsxObject方法操作業(yè)務(wù)
   function readFile(file) {
        var name = file.name;
        var reader = new FileReader();
        reader.onload = function (e) {
            var data = e.target.result;
            var wb = XLSX.read(data, {type: "binary"});
            parseXlsxObject(wb);
        };
        reader.readAsBinaryString(file);
    }
//實(shí)現(xiàn)導(dǎo)入到前端的List變量
function parseXlsxObject(wb) {
        var sheet = wb.Sheets.Sheet1;
        var json = XLSX.utils.sheet_to_json(sheet);
        json.forEach(function (value) {
            var item = {
                addr: value['地址位'],
                code: value['模式'],
                start: value['起始地址'],
                length: value['長(zhǎng)度'],
                crc: value['crc校檢'],
                rate: value['頻率'],
                state: value['啟用狀態(tài)']
            }
            this.dataList.push(item);
        });
 
        /* 讀取方式有很多種,這里推薦用xls.js上面官方的sheet_to_json方法
        console.log(json)
        var obj = {
            addr: '',
            code: '',
            start: '',
            length: '',
            crc: '',
            rate: '',
            state: ''
        };
        for (var i = 2; ; i < i++) {
            var row = "";
            eval("row = sheet.A" + i);
            if (row == null || row == undefined) {
                break;
            }
            var command = JSON.parse(JSON.stringify(obj));
            eval("command.addr=sheet.A" + i + ".w");
            eval("command.code=sheet.B" + i + ".w");
            eval("command.start=sheet.C" + i + ".w");
            eval("command.length=sheet.D" + i + ".w");
            eval("command.crc=sheet.E" + i + ".w");
            eval("command.rate=sheet.F" + i + ".w");
            eval("command.state=sheet.G" + i + ".w");
        }
        console.log(this.dataList);
        */
    }
</script>

前臺(tái)導(dǎo)出

HTML: 

? ? ? ? ? ? <a v-on:click="exportExcel()" href="javascript:void(0);" rel="external nofollow"  rel="external nofollow"  >
? ? ? ? ? ? ? ? 導(dǎo)出到excel...
? ? ? ? ? ? </a>

Javascript:響應(yīng)導(dǎo)出按鈕,將list通過(guò)xls的方法aoa_to_sheet導(dǎo)出為excel文檔

exportExcel: function () {
    var settingsArray = [['地址位','模式','起始地址','長(zhǎng)度','crc校檢','頻率','啟用狀態(tài)']];
    this.dataList.forEach(function (row) {
    var settingArr = [row.addr,row.code,row.start,row.length,row.crc,row.rate,row.state];
            settingsArray.push(settingArr);
        });
        var sheet = XLSX.utils.aoa_to_sheet(settingsArray);
        openDownloadDialog(sheet2blob(sheet), '導(dǎo)出.xlsx');
},
 
<script>
    /**
     * 通用的打開(kāi)下載對(duì)話框方法,沒(méi)有測(cè)試過(guò)具體兼容性
     * @param url 下載地址,也可以是一個(gè)blob對(duì)象,必選
     * @param saveName 保存文件名,可選
     */
    function openDownloadDialog(url, saveName)
    {
        if(typeof url == 'object' && url instanceof Blob)
        {
            url = URL.createObjectURL(url); // 創(chuàng)建blob地址
        }
        var aLink = document.createElement('a');
        aLink.href = url;
        aLink.download = saveName || ''; // HTML5新增的屬性,指定保存文件名,可以不要后綴,注意,file:///模式下不會(huì)生效
        var event;
        if(window.MouseEvent) event = new MouseEvent('click');
        else
        {
            event = document.createEvent('MouseEvents');
            event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        }
        aLink.dispatchEvent(event);
    }
 
    // 將一個(gè)sheet轉(zhuǎn)成最終的excel文件的blob對(duì)象,然后利用URL.createObjectURL下載
    function sheet2blob(sheet, sheetName) {
        sheetName = sheetName || 'Sheet1';
        var workbook = {
            SheetNames: [sheetName],
            Sheets: {}
        };
        workbook.Sheets[sheetName] = sheet;
        // 生成excel的配置項(xiàng)
        var wopts = {
            bookType: 'xlsx', // 要生成的文件類型
            bookSST: false, // 是否生成Shared String Table,官方解釋是,如果開(kāi)啟生成速度會(huì)下降,但在低版本IOS設(shè)備上有更好的兼容性
            type: 'binary'
        };
        var wbout = XLSX.write(workbook, wopts);
        var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});
        // 字符串轉(zhuǎn)ArrayBuffer
        function s2ab(s) {
            var buf = new ArrayBuffer(s.length);
            var view = new Uint8Array(buf);
            for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
            return buf;
        }
        return blob;
    }
</script>

總結(jié):本篇主要記錄了

(1)前端上傳文件給后端multipart格式的方法 

(2)前端利用xls.js從excel文檔導(dǎo)入數(shù)據(jù)到j(luò)son數(shù)組變量的方法

(3)前端利用xls.js將json數(shù)組導(dǎo)出到excel文檔下載的方法

上述代碼可以優(yōu)化,暫時(shí)貼成這樣,以后有這樣的需求可以快速cv使用。

后續(xù)有時(shí)間可以多熟悉xls.js,Apache的POI和阿里巴巴的EasyExcel,都是相關(guān)的內(nèi)容

最后再貼一個(gè)用EasyExcel后臺(tái)將后臺(tái)生成的List數(shù)據(jù)導(dǎo)出的方法,可以用

window.location.href= [后臺(tái)導(dǎo)出的地址]  這種方式進(jìn)行后端導(dǎo)出,注意設(shè)置response的格式

        try (ServletOutputStream out = response.getOutputStream()) {
            //這三行不可缺,否則會(huì)被前端解析成亂碼數(shù)據(jù),而不是文件
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(sheetName, "UTF-8")
                    + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + ".xlsx");
 
            RowModel rowModel = excelService.getExcelModel(type);
            List<Map<String,Object>> list = rowModel.exportData(paramsMap);
            List rowModelList = JSONObject.parseArray(JSONObject.toJSONString(list),rowModel.getClass())
            ExcelWriter writer = EasyExcelFactory.getWriter(out);
            WriteSheet ws = new WriteSheet();
            ws.setSheetName(sheetName);
            ws.setClazz(rowModel.getClass());
            writer.write(rowModelList, ws);
            writer.finish();
            out.flush();
        } catch (IOException e) {
            throw new RuntimeException();
        }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SPRINGMVC JSON數(shù)據(jù)交互如何實(shí)現(xiàn)

    SPRINGMVC JSON數(shù)據(jù)交互如何實(shí)現(xiàn)

    這篇文章主要介紹了SPRINGMVC JSON數(shù)據(jù)交互如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java?延時(shí)隊(duì)列及簡(jiǎn)單使用方式詳解

    Java?延時(shí)隊(duì)列及簡(jiǎn)單使用方式詳解

    這篇文章主要介紹了Java延時(shí)隊(duì)列簡(jiǎn)單使用方式,通過(guò)本文學(xué)習(xí)知道延時(shí)隊(duì)列是什么可以用來(lái)干什么,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • idea ssm項(xiàng)目java程序使用十六進(jìn)制rxtx包向串口發(fā)送指令的方法

    idea ssm項(xiàng)目java程序使用十六進(jìn)制rxtx包向串口發(fā)送指令的方法

    這篇文章主要介紹了idea ssm項(xiàng)目java程序向串口發(fā)送指令并且使用十六進(jìn)制 rxtx包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 解析Orika的MapperFacade 屬性賦值的使用問(wèn)題

    解析Orika的MapperFacade 屬性賦值的使用問(wèn)題

    在我們實(shí)際開(kāi)發(fā)中,常常會(huì)有對(duì)象與對(duì)象之間的轉(zhuǎn)化,或者把一個(gè)對(duì)象的數(shù)據(jù)轉(zhuǎn)化到另一個(gè)數(shù)據(jù)之中,如果我們手動(dòng)的一個(gè)一個(gè)的set就會(huì)比較麻煩,代碼段看起來(lái)也會(huì)比較長(zhǎng)。而Orika的MapperFacade就是解決這個(gè)問(wèn)題的,實(shí)現(xiàn)對(duì)象屬性的復(fù)制
    2021-12-12
  • 淺談Spring Boot中如何干掉if else的方法

    淺談Spring Boot中如何干掉if else的方法

    這篇文章主要介紹了Spring Boot中如何干掉if else的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面

    詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面

    這篇文章主要介紹了詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • springmvc分層領(lǐng)域模型概念詳解

    springmvc分層領(lǐng)域模型概念詳解

    本文核心為分層領(lǐng)域模型(VO , PO , BO, DAO ,POJO等)概念的個(gè)人理解,結(jié)合springmvc淺談分層領(lǐng)域模型的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-08-08
  • Cookie的工作原理和應(yīng)用詳解

    Cookie的工作原理和應(yīng)用詳解

    Cookies是 web站點(diǎn)放置到你的硬盤上的程序。它們駐留在你的計(jì)算機(jī)上收集關(guān)于你在因特網(wǎng)上所做的一切事情的信息,并且 web站點(diǎn)可以在任何時(shí)候讀取到Cookies收集到的所有信息
    2021-06-06
  • Java中instanceof關(guān)鍵字實(shí)例講解

    Java中instanceof關(guān)鍵字實(shí)例講解

    大家好,本篇文章主要講的是Java中instanceof關(guān)鍵字實(shí)例講解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題

    解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題

    這篇文章主要介紹了解決Spring Data Jpa 實(shí)體類自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論