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

使用Java編寫導(dǎo)出不確定行數(shù)列數(shù)數(shù)據(jù)的工具類

 更新時(shí)間:2024年03月15日 16:14:17   作者:IT行業(yè)小趴菜  
這篇文章主要為大家詳細(xì)介紹了如何使用Java編寫導(dǎo)出不確定行數(shù)列數(shù)數(shù)據(jù)的工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

這是導(dǎo)出不確定行數(shù)列數(shù)數(shù)據(jù)的導(dǎo)出工具類,導(dǎo)出的文件直接在瀏覽器下載,直接全部復(fù)制使用,下面有導(dǎo)出的數(shù)據(jù)樣式

一、導(dǎo)出的文件樣式

表頭不是固定的,可以根據(jù)需求,增加表頭和與之對(duì)應(yīng)的列數(shù)據(jù),詳情代碼看下面

二、工具類的入?yún)⒃斍?/h2>

這是表頭

這是具體的每一行數(shù)據(jù)

三、具體代碼(直接復(fù)制使用)

這個(gè)是業(yè)務(wù)層 使用可以copy到你的業(yè)務(wù)層方法內(nèi),然后進(jìn)行修修改改。

    public void export(ExportExcelDto dto, HttpServletResponse response) {

        XSSFWorkbook wb = null;
        try {
        	//假設(shè)這一是查詢數(shù)據(jù)庫拿到的數(shù)據(jù)
            List<MonitorDataImportQueryVo> vos = new ArrayList<>();

            if (CollectionUtils.isEmpty(vos)) return;
//          文件名根據(jù)時(shí)間戳生成
            String fileName = DateUtil.currentSeconds() + ".xlsx";
//          表頭
            ArrayList<String> header = Lists.newArrayList(READ_HEAD1, READ_HEAD2, READ_HEAD3, READ_HEAD4);
            //時(shí)間的動(dòng)態(tài)表頭
            List<String> collect = vos.stream()
            	.map(e -> e.getMonitorTime())
            	.distinct()
            	.sorted()
            	.collect(Collectors.toList());
            //放到表頭list后面	
            header.addAll(collect);
//          創(chuàng)建一個(gè)導(dǎo)出的數(shù)據(jù)list
            List<List> dataList = Lists.newArrayList();
            
//			根據(jù)查詢的數(shù)據(jù)進(jìn)行分組戰(zhàn)后(根據(jù)你的業(yè)務(wù)去處理)
            Map<String, List<MonitorDataImportQueryVo>> map = vos.stream()
            	.collect(Collectors.groupingBy(e -> e.getMonitorNumber()));
//			遍歷放入導(dǎo)出數(shù)據(jù)list里面(根據(jù)你的業(yè)務(wù)去處理)
            for (String s : keySet) {
                List<MonitorDataImportQueryVo> singleData = map.get(s);
                List<String> data = new ArrayList<>();
                data.add(singleData.get(0).getMonitorNumber());
                data.add(singleData.get(0).getMileage());
                data.add(singleData.get(0).getLink());
                data.add(singleData.get(0).getInitialValue());
                for (String thisValue : singleData.stream()
                	.map(e -> e.getThisValue())
                	.collect(Collectors.toList())) {
                    data.add(thisValue);
                }
                dataList.add(data);
            }
//			調(diào)用工具類
            wb = ExportExcelUtil.getXSSFWorkbook("監(jiān)測(cè)數(shù)據(jù)", header, dataList);
            ExportExcelUtil.buildExcelDocument(fileName, wb, response);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != wb) {
                try {
                    wb.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    }

具體的工具類,無需修改,也可根據(jù)需求改改

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * @Description: 導(dǎo)出工具類
 * @Param:
 * @return:
 * @Author: 楊永卓
 * @Date: 2021/9/26 15:47
 */
public class ExportExcelUtil {

    /**
     * @Description: [導(dǎo)出不確定行數(shù)列數(shù)監(jiān)測(cè)數(shù)據(jù)]
     * @Param: [sheetName:sheet頁名稱, headers:第一行表頭, data:list里面是每一行數(shù)據(jù)]
     * @return: org.apache.poi.XSSf.usermodel.XSSFWorkbook
     * @Author: 楊永卓
     * @Date: 2021/9/26 16:11
     */
    public static XSSFWorkbook getXSSFWorkbook(String sheetName, List<String> headers, List<List> dataList) {

        XSSFWorkbook workbook = new XSSFWorkbook();
        //新建工作區(qū)并賦名
        XSSFSheet sheet = workbook.createSheet(sheetName);
        XSSFRow row = sheet.createRow(0);

        //設(shè)置樣式
        XSSFCellStyle cellStyle = workbook.createCellStyle();
        //靠左
        cellStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT);
        //垂直居中
        cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
        //設(shè)置邊框
        cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
        //還需要設(shè)置其他樣式可在此添加

        //找出最大列數(shù):對(duì)數(shù)據(jù)進(jìn)行排序,獲取最長(zhǎng)那一行的size
        int max = 0;
        for (List l : dataList) {
            if (l.size() > max) {
                max = l.size();
            }
        }

        XSSFCell cell = null;
        //設(shè)置列名
        for (int i = 0; i < max; i++) {
            cell = row.createCell(i);
            cell.setCellValue(headers.get(i));
            cell.setCellStyle(cellStyle);
        }

        for (int i = 0; i < dataList.size(); i++) {
            row = sheet.createRow(i + 1);
            //以max作判斷-->實(shí)現(xiàn)空的單元格也有邊框
            for (int j = 0; j < max; j++) {
                cell = row.createCell(j);
                cell.setCellStyle(cellStyle);
                //防止下標(biāo)越界
                if (j < dataList.get(i).size()) {
                    //單元格數(shù)據(jù)類型可自行改變,我這里全部字符串化了
                    cell.setCellValue(dataList.get(i).get(j).toString());
                }
            }
        }

        //列寬自適應(yīng)
        for (int columnNum = 0; columnNum <= max; columnNum++) {
            int columnWidth = sheet.getColumnWidth(columnNum) / 256;
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                XSSFRow currentRow;
                if (sheet.getRow(rowNum) == null) {
                    currentRow = sheet.createRow(rowNum);
                } else {
                    currentRow = sheet.getRow(rowNum);
                }
                if (currentRow.getCell(columnNum) != null) {
                    XSSFCell currentCell = currentRow.getCell(columnNum);
                    if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
                        int length = currentCell.getStringCellValue().getBytes().length;
                        if (columnWidth < length) {
                            columnWidth = length;
                        }
                    }
                }
            }
            sheet.setColumnWidth(columnNum, columnWidth * 256);
        }
        return workbook;
    }
    
	/**
    * @Description: [導(dǎo)出到瀏覽器]
    * @Param: [fileName, wb, response]
    * @return: void
    *
    * @Author: 楊永卓
    * @Date: 2021/9/26 15:47
    */
    public static void buildExcelDocument(String fileName, Workbook wb, HttpServletResponse response) {
        try {
//            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            // 定義輸出類型
            response.setContentType("application/octet-stream");
            // 可自行定義編碼格式
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
            //清除jsp編譯html文件的空白,防止excel出現(xiàn)空行
            response.flushBuffer();
            //寫出
            wb.write(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

到此這篇關(guān)于使用Java編寫導(dǎo)出不確定行數(shù)列數(shù)數(shù)據(jù)的工具類的文章就介紹到這了,更多相關(guān)Java導(dǎo)出數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis-flex與springBoot整合的實(shí)現(xiàn)示例

    mybatis-flex與springBoot整合的實(shí)現(xiàn)示例

    Mybatis-flex提供了簡(jiǎn)單易用的API,開發(fā)者只需要簡(jiǎn)單的配置即可使用,本文主要介紹了mybatis-flex與springBoot整合,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問題

    解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問題

    這篇文章主要介紹了解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • IDEA Debug啟動(dòng)tomcat報(bào)60659端口占用錯(cuò)誤的解決

    IDEA Debug啟動(dòng)tomcat報(bào)60659端口占用錯(cuò)誤的解決

    工作中將開發(fā)工具由Eclipse轉(zhuǎn)為IntelliJ IDEA,在使用過程中遇到許多問題,其中60659端口占用錯(cuò)誤對(duì)于不熟悉IDEA的開發(fā)者來說或許會(huì)比較頭痛,本文就來解決一下這個(gè)問題
    2018-11-11
  • Maven生成可直接運(yùn)行的jar包(多種方式)

    Maven生成可直接運(yùn)行的jar包(多種方式)

    文章介紹了三種使用Maven生成可以直接運(yùn)行的jar包的方法:通過maven-jar-plugin和maven-dependency-plugin插件、maven-assembly-plugin插件以及maven-shade-plugin插件,每種方法都有其特點(diǎn)和適用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • SpringBoot進(jìn)行參數(shù)校驗(yàn)的方法詳解

    SpringBoot進(jìn)行參數(shù)校驗(yàn)的方法詳解

    在日常的接口開發(fā)中,為了防止非法參數(shù)對(duì)業(yè)務(wù)造成影響,經(jīng)常需要對(duì)接口的參數(shù)進(jìn)行校驗(yàn)。本文通過示例詳細(xì)講解了SpringBoot如何進(jìn)行參數(shù)校驗(yàn)的,感興趣的可以學(xué)習(xí)一下
    2022-04-04
  • java讀取resources文件詳解及實(shí)現(xiàn)代碼

    java讀取resources文件詳解及實(shí)現(xiàn)代碼

    這篇文章主要介紹了java讀取resources文件詳解及實(shí)現(xiàn)代碼的相關(guān)資料,在開發(fā)項(xiàng)目的時(shí)候經(jīng)常會(huì)遇到讀取文件夾里面的內(nèi)容,需要的朋友可以參考下
    2017-07-07
  • 關(guān)于ApplicationContext的三個(gè)常用實(shí)現(xiàn)類

    關(guān)于ApplicationContext的三個(gè)常用實(shí)現(xiàn)類

    這篇文章主要介紹了關(guān)于ApplicationContext的三個(gè)常用實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Maven工程搭建spring boot+spring mvc+JPA的示例

    Maven工程搭建spring boot+spring mvc+JPA的示例

    本篇文章主要介紹了Maven工程搭建spring boot+spring mvc+JPA的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Struts和servlet不能共存問題解決方法

    Struts和servlet不能共存問題解決方法

    這篇文章主要介紹了Struts和servlet不能共存問題解決方法,共有三種方法,需要的朋友可以參考下。
    2017-09-09
  • 使用@JsonFormat的一個(gè)坑及解決

    使用@JsonFormat的一個(gè)坑及解決

    這篇文章主要介紹了使用@JsonFormat的一個(gè)坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論