Java使用POI導(dǎo)出Excel(二):多個(gè)sheet
相關(guān)文章:
Java使用POI導(dǎo)出Excel(一):?jiǎn)蝧heet
Java使用POI導(dǎo)出Excel(二):多個(gè)sheet
相信在大部分的web項(xiàng)目中都會(huì)有導(dǎo)出導(dǎo)入Excel的需求,但是在我們?nèi)粘5墓ぷ髦校枨笸鶝]這么簡(jiǎn)單,可能需要將數(shù)據(jù)按類型分類導(dǎo)出或者數(shù)據(jù)量過大,需要分多張表導(dǎo)出等等。遇到類似的需求該怎么辦呢,別慌,往下看。
一、pom引用
pom文件中,添加以下依賴
<!--Excel工具-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
<scope>compile</scope>
</dependency>二、工具類util
1.ExportSheetUtil
?package com.***.excel;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.springframework.http.MediaType;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.List;
/**
* @description: excel導(dǎo)出多個(gè)sheet工具類
* @author: ***
* @date: 2022/9/15
*/
public class ExportSheetUtil {
/**
* 拆解并導(dǎo)出多重Excel
*/
public static void exportManySheetExcel(String fileName, List<ExcelSheet> mysheets, HttpServletResponse response) {
//創(chuàng)建工作薄
HSSFWorkbook wb = new HSSFWorkbook();
//表頭樣式
HSSFCellStyle style = wb.createCellStyle();
// 垂直
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 水平
style.setAlignment(HorizontalAlignment.CENTER);
//字體樣式
HSSFFont fontStyle = wb.createFont();
fontStyle.setFontName("微軟雅黑");
fontStyle.setFontHeightInPoints((short) 12);
style.setFont(fontStyle);
for (ExcelSheet excel : mysheets) {
//新建一個(gè)sheet
//獲取該sheet名稱
HSSFSheet sheet = wb.createSheet(excel.getFileName());
//獲取sheet的標(biāo)題名
String[] handers = excel.getHanders();
//第一個(gè)sheet的第一行為標(biāo)題
HSSFRow rowFirst = sheet.createRow(0);
//寫標(biāo)題
for (int i = 0; i < handers.length; i++) {
//獲取第一行的每個(gè)單元格
HSSFCell cell = rowFirst.createCell(i);
//往單元格里寫數(shù)據(jù)
cell.setCellValue(handers[i]);
//加樣式
cell.setCellStyle(style);
//設(shè)置每列的列寬
sheet.setColumnWidth(i, 4000);
}
//寫數(shù)據(jù)集
List<String[]> dataset = excel.getDataset();
for (int i = 0; i < dataset.size(); i++) {
//獲取該對(duì)象
String[] data = dataset.get(i);
//創(chuàng)建數(shù)據(jù)行
HSSFRow row = sheet.createRow(i + 1);
for (int j = 0; j < data.length; j++) {
//設(shè)置對(duì)應(yīng)單元格的值
row.createCell(j).setCellValue(data[j]);
}
}
}
// 下載文件谷歌文件名會(huì)亂碼,用IE
try {
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "utf-8"));
response.setHeader("Cache-Control", "No-cache");
response.flushBuffer();
wb.write(response.getOutputStream());
wb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}2.ExcelSheet
?package com.***.excel;
import lombok.Data;
import java.util.List;
/**
* @description: 導(dǎo)出多個(gè)sheet表
* @author: ***
* @date: 2022/9/15
*/
@Data
public class ExcelSheet {
/*** sheet的名稱*/
private String fileName;
/*** sheet里的標(biāo)題*/
private String[] handers;
/*** sheet里的數(shù)據(jù)集*/
private List<String[]> dataset;
public ExcelSheet(String fileName, String[] handers, List<String[]> dataset) {
this.fileName = fileName;
this.handers = handers;
this.dataset = dataset;
}
}三、相關(guān)業(yè)務(wù)代碼
1.service層
/*** 導(dǎo)出開票及運(yùn)單信息*/
ExportInvoiceAndBillVo exportInvoiceAndBillInfo(InvoiceReviewListDto dto);2.impl實(shí)現(xiàn)類
實(shí)現(xiàn)類里的代碼,需要各位根據(jù)自己的業(yè)務(wù)場(chǎng)景進(jìn)行改動(dòng),無非就是將需要導(dǎo)出的數(shù)據(jù)先查出來,帶入模板中,調(diào)用工具類的方法導(dǎo)出。
?package com.***.vo.invoicereview;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @description: 導(dǎo)出開票和運(yùn)單信息Vo
* @author: ***
* @date: 2022/9/19
*/
@Data
public class ExportInvoiceAndBillVo implements Serializable {
/*** 開票信息*/
private List<String[]> invoiceList;
/*** 運(yùn)單信息*/
private List<String[]> billList;
}
? @Override
public ExportInvoiceAndBillVo exportInvoiceAndBillInfo(InvoiceReviewListDto dto) {
ExportInvoiceAndBillVo invoiceAndBill = new ExportInvoiceAndBillVo();
// 查詢需要導(dǎo)出的開票信息
PageInfo<InvoiceReviewListVo> pageInfo = queryInvoiceReviewList(dto);
List<InvoiceReviewListVo> invoiceList = pageInfo.getList();
if (invoiceList.size() > 10000) {
throw new ServiceException("開票數(shù)據(jù)過多,請(qǐng)分批次導(dǎo)出");
}
// 查詢需要導(dǎo)出的車運(yùn)運(yùn)單信息
List<Long> invoiceIdList = invoiceList.stream().map(InvoiceReviewListVo::getInvoiceId).collect(Collectors.toList());
List<ExportBillVo> billList = getBillInfo(invoiceIdList);
if (billList.size() > 10000) {
throw new ServiceException("運(yùn)單數(shù)據(jù)過多,請(qǐng)分批次導(dǎo)出");
}
// 將表1 表2的數(shù)據(jù) 放入定義的對(duì)象Vo中
invoiceAndBill.setInvoiceList(getInvoiceDataList(invoiceList));
invoiceAndBill.setBillList(getBillDataList(billList));
return invoiceAndBill;
}3.controller層
controller層的代碼需要注意的是:
1.因?yàn)閷?dǎo)出Excel一般都是通過瀏覽器進(jìn)行下載的,所以入?yún)⒅行枰尤?strong>HttpServletResponse
2.調(diào)用封裝的工具類ExportSheetUtil中的exportManySheetExcel方法就可以了
3.表頭和表名需要各位根據(jù)自身的業(yè)務(wù)場(chǎng)景修改哈
? /**
* 導(dǎo)出開票和運(yùn)單信息
*/
@Log
@PostMapping("/exportInvoiceAndBillInfo")
public void exportInvoiceAndBillInfo(@RequestBody InvoiceReviewListDto dto, HttpServletResponse response) {
ExportInvoiceAndBillVo invoiceAndBillVo = invoiceFacadeService.exportInvoiceAndBillInfo(dto);
//設(shè)置sheet的表頭與表名
String[] invoiceSheetHead = {"開票編號(hào)", "票號(hào)", "公司名稱", "收票方名稱", "結(jié)算類型", "納稅識(shí)別碼", "收票聯(lián)系人", "聯(lián)系人電話", "運(yùn)單總金額(元)", "含稅總金額(元)", "開票狀態(tài)", "提交開票時(shí)間", "運(yùn)營(yíng)審核時(shí)間", "運(yùn)營(yíng)審核人", "財(cái)務(wù)審核時(shí)間", "財(cái)務(wù)審核人", "開票完成時(shí)間", "沖銷操作人", "沖銷時(shí)間"};
String[] billSheetHead = {"開票編號(hào)", "運(yùn)單號(hào)", "發(fā)貨地", "收貨地", "司機(jī)", "司機(jī)電話", "貨物名稱", "貨物數(shù)量", "單位", "貨物重量(噸)", "運(yùn)單狀態(tài)", "運(yùn)單金額(元)", "含稅金額(元)"};
ExcelSheet invoiceExcel = new ExcelSheet("開票信息", invoiceSheetHead, invoiceAndBillVo.getInvoiceList());
ExcelSheet billExcel = new ExcelSheet("運(yùn)單信息", billSheetHead, invoiceAndBillVo.getBillList());
List<ExcelSheet> mysheet = new ArrayList<>();
mysheet.add(invoiceExcel);
mysheet.add(billExcel);
ExportSheetUtil.exportManySheetExcel("開票及運(yùn)單信息", mysheet, response);
}最終導(dǎo)出的Excel文件:


以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Springboot使用@RefreshScope注解實(shí)現(xiàn)配置文件的動(dòng)態(tài)加載
本文主要介紹了Springboot使用@RefreshScope注解實(shí)現(xiàn)配置文件的動(dòng)態(tài)加載,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程
這篇文章主要為大家詳細(xì)介紹了win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程,感興趣的小伙伴們可以參考一下2016-06-06
在IDEA中創(chuàng)建Web項(xiàng)目的詳細(xì)過程
這篇文章主要給大家介紹了關(guān)于在IDEA中創(chuàng)建Web項(xiàng)目的詳細(xì)過程,很多朋友可能在學(xué)習(xí)java基礎(chǔ)的時(shí)候已經(jīng)熟練掌握了IDEA創(chuàng)建java項(xiàng)目的基本步驟,但隨著學(xué)習(xí)技術(shù)的不斷深入,不同的IDEA版本可能在項(xiàng)目的創(chuàng)建頁面上出現(xiàn)些許的出入,需要的朋友可以參考下2023-10-10
Redis高并發(fā)場(chǎng)景防止庫存數(shù)量超賣少賣
商品超賣是銷售數(shù)量超過實(shí)際庫存的情況,常因庫存管理不當(dāng)引發(fā),傳統(tǒng)庫存管理在高并發(fā)環(huán)境下易出錯(cuò),可通過線程加鎖或使用Redis同步庫存狀態(tài)解決,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下2024-09-09
Java數(shù)據(jù)結(jié)構(gòu)之散列表(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵字(key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。這篇文章給大家介紹了java數(shù)據(jù)結(jié)構(gòu)之散列表,包括基本概念和散列函數(shù)相關(guān)知識(shí),需要的的朋友參考下吧2017-04-04
java servlet手機(jī)app訪問接口(二)短信驗(yàn)證
這篇文章主要介紹了java servlet手機(jī)app訪問接口(二),短信驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
使用JVMTI實(shí)現(xiàn)SpringBoot的jar加密,防止反編譯
這篇文章主要介紹了使用JVMTI實(shí)現(xiàn)SpringBoot的jar加密,防止反編譯問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的示例
本篇文章主要介紹了Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02

