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

Springboot使用POI進(jìn)行excel文件的導(dǎo)出與下載方式

 更新時(shí)間:2024年08月15日 14:16:38   作者:專注寫bug  
這篇文章主要介紹了Springboot使用POI進(jìn)行excel文件的導(dǎo)出與下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

之前寫了一篇使用poi進(jìn)行docx模板導(dǎo)出的文章,最近呢也使用POI實(shí)現(xiàn)excel文件的導(dǎo)出與下載,特此記錄。

Springboot —— 根據(jù)docx填充生成word文件,并導(dǎo)出pdf

環(huán)境

  • springboot 2.1.4
  • poi-tl 1.5.0

依賴引入

再新建的springboot工程項(xiàng)目中,引入下列的依賴即可

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.5.0</version>
</dependency>

導(dǎo)出excel工具類編寫

編寫工具類,主要用于表頭的創(chuàng)建、單元格樣式的定義、以及數(shù)據(jù)格式的轉(zhuǎn)換等。

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Optional;

@Slf4j
public final class ExcelExport {


	/**
	 * description: 依據(jù)excel模板,導(dǎo)出數(shù)據(jù)excel
	 * @param sheetName sheet 頁(yè)名稱
	 * @param headers 數(shù)據(jù)header部分
	 * @param dataList table 數(shù)據(jù)集合
	 * @param destFile	excel模板文件路徑
	 */
	public static void export(String sheetName, String[] headers, List<List<Object>> dataList, File destFile) throws Exception {
		SXSSFWorkbook workbook = new SXSSFWorkbook();
		createSheet(sheetName, headers, dataList, workbook);
		workbook.write(new FileOutputStream(destFile));
	}


	/**
	 * 根據(jù)header與data的集合,動(dòng)態(tài)地創(chuàng)建并生成excel數(shù)據(jù)流進(jìn)行下載操作
	 * description: 導(dǎo)出excel --- 支持web
	 * @param sheetName  sheet表名字
	 * @param headers 表頭
	 * @param dataList 表數(shù)據(jù)
	 * @param fileName  導(dǎo)出文件名
	 * @param response
	 */
	public static void export(String sheetName , String[] headers , List<List<Object>> dataList ,String fileName
			 								   , HttpServletResponse response) throws Exception {
		SXSSFWorkbook workbook = new SXSSFWorkbook();
		createSheet(sheetName, headers, dataList, workbook);
		response.reset();
		//response.setContentType("application/vnd.ms-excel; charset=utf-8");
        response.setContentType("application/octet-stream; charset=utf-8");
		response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
		workbook.write(response.getOutputStream());
        // 刪除臨時(shí)文件
        workbook.dispose();
	}

	/**
	 * description: 創(chuàng)建sheet表格
	 * @param sheetName  表sheet 名字
	 * @param headers  表頭
	 * @param dataList 表數(shù)據(jù)
	 * @param wb
	 */
	public static void createSheet(String sheetName , String[] headers , List<List<Object>> dataList , SXSSFWorkbook wb) {
		SXSSFSheet sheet = wb.createSheet(sheetName);
		// 設(shè)置表頭和單元格格式
		CellStyle headStyle = setHeaderStyle(wb);
		CellStyle bodyStyle = setBodyStyle(wb);
		// 創(chuàng)建表頭和單元格數(shù)據(jù)
        createHeader(headers, sheet, headStyle);
        createBody(dataList, sheet, bodyStyle,wb);
	}

	/**
	 * description: 創(chuàng)建表頭
	 * @param headers
	 * @param sheet
	 * @param headStyle
	 */
	private static void createHeader(String[] headers, SXSSFSheet sheet, CellStyle headStyle) {
		SXSSFRow row = sheet.createRow(0);
		row.setHeightInPoints(16F);
		for (int i = 0; i < headers.length; i++) {
			// 創(chuàng)建單元格
			SXSSFCell cell = row.createCell(i);
			cell.setCellStyle(headStyle);
			XSSFRichTextString text = new XSSFRichTextString(headers[i]);
            cell.setCellValue(text);
            sheet.trackAllColumnsForAutoSizing();
            sheet.autoSizeColumn(i);
		}
	}

	/**
	 * description: 表格中填充數(shù)據(jù)
	 * @param dataList
	 * @param sheet
	 * @param bodyStyle
	 * @param wb 主要是更改文本格式
	 */
	private static void createBody(List<List<Object>> dataList, SXSSFSheet sheet, CellStyle bodyStyle,SXSSFWorkbook wb) {
		if (dataList == null) {
			return;
		}
		for (int i = 0; i < dataList.size(); i++) {
			// 從第二行開始,第一行做表頭
			SXSSFRow row = sheet.createRow(i+1);
			List<Object> rowList = dataList.get(i);
			if (rowList == null) {
				continue;
			}
			for (int j = 0; j < rowList.size(); j++) {
				SXSSFCell cell = row.createCell(j);
				Object data = rowList.get(j);
				// 如果數(shù)據(jù)是  Double 類型,則需要保證金額數(shù)轉(zhuǎn)換,否則導(dǎo)出數(shù)據(jù)顯示為科學(xué)計(jì)數(shù)法  如: 8E7
				if(data instanceof Double){
					DataFormat format= wb.createDataFormat();
					bodyStyle.setDataFormat(format.getFormat("#,##0.00")); // 千位符
					// bodyStyle.setDataFormat(format.getFormat("#0.00")); // 小數(shù)
					// bodyStyle.setDataFormat(format.getFormat("0.00%")); // 百分比  數(shù)據(jù)必須是小數(shù),如:0.59 -> 59%
					cell.setCellStyle(bodyStyle);
					cell.setCellValue(Double.parseDouble(String.valueOf(data)));
				}else{
					String textStr = Optional.ofNullable(rowList.get(j)).orElse("").toString();
					XSSFRichTextString text = new XSSFRichTextString(textStr);
					cell.setCellValue(text);
				}

				sheet.trackAllColumnsForAutoSizing();
				//設(shè)置內(nèi)容列為列的最大值
				sheet.autoSizeColumn(j);
			}
		}
	}

	/**
	 * description: 設(shè)置單元格內(nèi)容樣式
	 * @param wb
	 * @return HSSFCellStyle
	 */
	private static CellStyle setBodyStyle(SXSSFWorkbook wb) {
		// 設(shè)置表格單元格格式
		CellStyle style = wb.createCellStyle();
        style.setFillForegroundColor(HSSFColor.WHITE.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_LEFT);

        // 設(shè)置字體格式
        Font font = wb.createFont();
        font.setFontName("宋體");
        font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
        style.setFont(font);
        return style;
	}

	/**
	 * description: 設(shè)置表頭樣式
	 * @param wb
	 * @return
	 * @return HSSFCellStyle
	 */
	private static CellStyle setHeaderStyle(SXSSFWorkbook wb) {
		// 設(shè)置表格單元格格式
		CellStyle style = wb.createCellStyle();
		style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		style.setBorderRight(BorderStyle.THIN);
		style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
		style.setBorderLeft(BorderStyle.THIN);
		style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
		style.setBorderTop(BorderStyle.THIN);
		style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
		style.setBorderBottom(BorderStyle.THIN);
		style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
//		style.setFillBackgroundColor(IndexedColors.LIGHT_YELLOW.getIndex());
		style.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex());
		style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
	    // 設(shè)置字體格式
	    Font font = wb.createFont();
	    font.setFontName("宋體");
	    font.setFontHeightInPoints((short) 10);
	    style.setFont(font);
	    return style;
	}
}

測(cè)試案例

@GetMapping("/test-xls")
public void contractIntrQryPayxls(HttpServletResponse response) throws Exception {
    String[] headers = new String[]{"編號(hào)","名稱","金額"};
    List<List<Object>> dataLists = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        List<Object> data = new ArrayList<>();
        data.add("xj_"+i);
        data.add("xiangjiao "+i);
        data.add(10000.00*i);
        dataLists.add(data);
    }
    ExcelExport.export("sheetName",headers,dataLists,"xiangjiao測(cè)試.xls",response);
}

總結(jié)

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

相關(guān)文章

  • Struts2 漏洞分析及如何提前預(yù)防

    Struts2 漏洞分析及如何提前預(yù)防

    2016年4月26日,Struts2發(fā)布一份安全公告,CVE編號(hào) CVE-2016-3081。這是自2012年Struts2命令執(zhí)行漏洞大規(guī)模爆發(fā)之后,該服務(wù)時(shí)隔四年再次爆發(fā)大規(guī)模漏洞。該漏洞也是今年目前爆出的最嚴(yán)重安全漏洞。本文分析了漏洞的原理危害影響防護(hù)等內(nèi)容。
    2016-05-05
  • Spring Cloud LoadBalancer 負(fù)載均衡詳解

    Spring Cloud LoadBalancer 負(fù)載均衡詳解

    本文介紹了如何在Spring Cloud中使用SpringCloudLoadBalancer實(shí)現(xiàn)客戶端負(fù)載均衡,并詳細(xì)講解了輪詢策略和隨機(jī)策略的配置方法,此外,還提供了部署到云服務(wù)器并在多個(gè)實(shí)例之間進(jìn)行負(fù)載均衡的步驟,感興趣的朋友一起看看吧
    2025-02-02
  • java 中file.encoding的設(shè)置詳解

    java 中file.encoding的設(shè)置詳解

    這篇文章主要介紹了java 中file.encoding的設(shè)置詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • SpringBoot 如何從配置文件讀取值到對(duì)象中

    SpringBoot 如何從配置文件讀取值到對(duì)象中

    這篇文章主要介紹了SpringBoot 如何從配置文件讀取值到對(duì)象中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java源碼解析之詳解ReentrantLock

    Java源碼解析之詳解ReentrantLock

    今天給大家?guī)?lái)的是關(guān)于Java并發(fā)的相關(guān)知識(shí),文章圍繞著ReentrantLock源碼展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 詳解Java如何向http/https接口發(fā)出請(qǐng)求

    詳解Java如何向http/https接口發(fā)出請(qǐng)求

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)向http/https接口發(fā)出請(qǐng)求,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • springboot中引入日志文件生成的配置詳解

    springboot中引入日志文件生成的配置詳解

    本文主要介紹了springboot中引入日志文件生成的配置詳解,包括日志級(jí)別的設(shè)置、日志格式的配置以及日志輸出的位置等,從而幫助開發(fā)者更好地進(jìn)行開發(fā)與調(diào)試
    2023-10-10
  • 使用@SpringBootTest注解進(jìn)行單元測(cè)試

    使用@SpringBootTest注解進(jìn)行單元測(cè)試

    這篇文章主要介紹了使用@SpringBootTest注解進(jìn)行單元測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java中byte輸出write到文件的實(shí)現(xiàn)方法講解

    Java中byte輸出write到文件的實(shí)現(xiàn)方法講解

    今天小編就為大家分享一篇關(guān)于Java中byte輸出write到文件的實(shí)現(xiàn)方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • MyBatis攔截器動(dòng)態(tài)替換表名的方法詳解

    MyBatis攔截器動(dòng)態(tài)替換表名的方法詳解

    因?yàn)槲覀兂志脤涌蚣芨嗟厥褂肕yBatis,那我們就借助于MyBatis的攔截器來(lái)完成我們的功能,這篇文章主要給大家介紹了關(guān)于MyBatis攔截器動(dòng)態(tài)替換表名的相關(guān)資料,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

嵩明县| 海安县| 张家口市| 新晃| 邓州市| 乌兰县| 齐齐哈尔市| 新郑市| 鸡泽县| 武汉市| 达日县| 化州市| 杨浦区| 年辖:市辖区| 余姚市| 滦南县| 法库县| 延庆县| 博兴县| 康保县| 丹阳市| 新民市| 莎车县| 吉首市| 左贡县| 海城市| 河曲县| 广元市| 崇仁县| 和龙市| 汉寿县| 大石桥市| 临安市| 宽城| 昌乐县| 金湖县| 河北省| 东丰县| 新闻| 乡宁县| 辽宁省|