Java使用Poi導(dǎo)出Excel表格方法實(shí)例
一、導(dǎo)出下面的表格

二、流程詳解
1、導(dǎo)出excel需要先將數(shù)據(jù)準(zhǔn)備好
2、創(chuàng)建工作傅對(duì)象SXSSFWorkbook
3、使用工作傅對(duì)象創(chuàng)建sheet對(duì)象(工作頁(yè))
4、使用sheet對(duì)象創(chuàng)建行對(duì)象row(行對(duì)象)
5、使用row對(duì)象創(chuàng)建cell對(duì)象(單元格對(duì)象)
6、將數(shù)據(jù)依次插入對(duì)應(yīng)的單元格
7、創(chuàng)建excel文件,寫入數(shù)據(jù)
三、代碼
3.1、依賴
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>注意:本文使用的是SXSSFSheet對(duì)象,所以使用的是上面的依賴
3.2、主要代碼
3.2.1、實(shí)體類
import lombok.Data;
@Data
public class MyCell {
private int top;
private int below;
private int left;
private int right;
public MyCell(){}
public MyCell(int top,int below,int left,int right){
this.top = top;
this.below = below;
this.left = left;
this.right = right;
}
}3.2.2、工具類
public class ExportUtil
{
public static void main(String[] args)
{
//1、準(zhǔn)備數(shù)據(jù)
List<HashMap<String,List<List<String>>>> list = new ArrayList<>();//存放一個(gè)excel文件所有數(shù)據(jù)(可放多個(gè)sheet頁(yè))
HashMap<String,List<List<String>>> map = new HashMap<>();//存放一個(gè)sheet頁(yè)所有數(shù)據(jù)
List<List<String>> titleList = new ArrayList<>();//存放一個(gè)sheet頁(yè)表頭數(shù)據(jù)
List<List<String>> bodyList = new ArrayList<>();//存放一個(gè)sheet頁(yè)表體數(shù)據(jù)
List<String> title = new ArrayList<>();//存一行表頭數(shù)據(jù)
List<String> body = null;//存一行表體數(shù)據(jù)
int length = 8;//-------------------------每行8個(gè)數(shù)據(jù),即8列表格
title.add("報(bào)表表體");
for (int i = 0; i < 7; i++) {
title.add("");
}
titleList.add(title);//把第一行表頭數(shù)據(jù)放入titleList
title = new ArrayList<>();
title.add("代碼 : 000000");
for (int i = 0; i < 3; i++){
title.add("");
}
title.add("報(bào)告期 : 2023年6月");
for (int i = 0; i < length - 5; i++){
title.add("");
}
titleList.add(title);//把第二行表頭數(shù)據(jù)放入titleList
String str1 = "";
for (int i = 0; i <= 8; i++){//放8行表體數(shù)據(jù)
body = new ArrayList<>();
for (int j = 0; j < length; j++) {
body.add(i + 1 + "行" + (j + 1) + "列");
}
bodyList.add(body);//把第i行表體數(shù)據(jù)放入bodyList
}
map.put("title_key",titleList);//把一個(gè)sheet頁(yè)表頭數(shù)據(jù)放入map
map.put("body_key",bodyList);//把一個(gè)sheet頁(yè)表體數(shù)據(jù)放入map
list.add(map);//把一個(gè)sheet頁(yè)的所有數(shù)據(jù)放list
//--------------------------------------------------------------數(shù)據(jù)已準(zhǔn)備完畢
//2、創(chuàng)建工作傅(即一個(gè)excel對(duì)象,可以包含多個(gè)sheet對(duì)象)
SXSSFWorkbook wb = new SXSSFWorkbook(500);//創(chuàng)建一個(gè)工作副本,保留500條數(shù)據(jù)在內(nèi)存中
for (int i = 0;i < list.size(); i++){
HashMap<String,List<List<String>>> map1 = list.get(i);//獲取一個(gè)sheet頁(yè)的所有數(shù)據(jù)
exportExcelFiles(wb,map1,"第一頁(yè)");//將一個(gè)sheet頁(yè)的所有數(shù)據(jù)插入wb對(duì)象中
}
//--------------------------------------------------------------數(shù)據(jù)已插入完畢
//3、創(chuàng)建excel文件,并寫入數(shù)據(jù)
FileOutputStream fos = null;
File file = new File("D:\\" + "00年的大帥哥" + ".xls");
try {
fos = new FileOutputStream(file);
wb.write(fos);//寫入數(shù)據(jù)
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("------------導(dǎo)出成功-------------");
}
}
//插入數(shù)據(jù)
public static void exportExcelFiles(SXSSFWorkbook wb,HashMap<String,List<List<String>>> map,String name)
{
//1、準(zhǔn)備數(shù)據(jù)
List<List<String>> head = map.get("title_key");//取出表頭數(shù)據(jù)
List<List<String>> body = map.get("body_key");//取出表體數(shù)據(jù)
int rowEleCount = body.get(0).size();//表體一共多少列
//2、創(chuàng)建一個(gè)sheet對(duì)象并插入數(shù)據(jù)
SXSSFSheet sheet = wb.createSheet(name);//創(chuàng)建一個(gè)工作頁(yè),并設(shè)置sheet的name
//wb.setSheetName(0,name);//設(shè)置sheet名字,可以根據(jù)下標(biāo)設(shè)置sheet的name
sheet.setDefaultColumnWidth(20);//設(shè)置默認(rèn)列寬
mergeCell(sheet,rowEleCount);//---------------------------------------------------------先合并表頭的單元格
List<CellStyle> headStyleList = getHeadCellStyleList(wb);// 獲取一個(gè)表頭樣式集合
List<CellStyle> bodyStyleList = getBodyCellStyleList(wb);// 獲取一個(gè)表體樣式集合
setExcelHead(sheet,head,headStyleList);// 插入表頭數(shù)據(jù)
setExcelBody(sheet,body,bodyStyleList);// 插入表體數(shù)據(jù)
}
// 合并表頭
public static void mergeCell(SXSSFSheet sheet,int rowEleCount)
{
List<MyCell> listMerge = new ArrayList<>();//存儲(chǔ)前3行合并單元格的信息
MyCell myCell1 = new MyCell(0,0,0,rowEleCount);
listMerge.add(myCell1);
MyCell myCell2 = new MyCell(1,2,0,3);
listMerge.add(myCell2);
MyCell myCell3 = new MyCell(1,2,4,rowEleCount);
listMerge.add(myCell3);
for (int i = 0; i < listMerge.size() ; i++){
sheet.addMergedRegion(new CellRangeAddress(listMerge.get(i).getTop(),//開始行
listMerge.get(i).getBelow(),//結(jié)束行
listMerge.get(i).getLeft(),//開始列
listMerge.get(i).getRight()));//結(jié)束列
}
}
//插入表頭數(shù)據(jù)
public static void setExcelHead(SXSSFSheet sheet, List<List<String>> head,List<CellStyle> cellStyleList)
{
int rowNum = head.size();//表頭有幾行
int rowElementNum = head.get(0).size();//每行有幾列
SXSSFRow row = null;//聲明一個(gè)行對(duì)象
SXSSFCell cell = null;//聲明一個(gè)列對(duì)象(即一個(gè)單元格對(duì)象)
for (int i = 0; i < rowNum; i++){
row = sheet.createRow(i);//創(chuàng)建第 i + 1 行的行對(duì)象
//設(shè)置行高
if(i == 1 || i == 2){//將第二行和第三行的行高設(shè)置為400
row.setHeight((short) 400);
}
for(int j = 0; j < rowElementNum; j++) {
cell = row.createCell(j);//創(chuàng)建第 i + 1 行,第 j + 1 列的單元格
cell.setCellValue(head.get(i).get(j));//設(shè)置單元格內(nèi)容(插入數(shù)據(jù))
//設(shè)置表頭樣式
switch (i){
case 0:
cell.setCellStyle(cellStyleList.get(0));//將第一行設(shè)置為上下左右居中,單元格無(wú)邊框,字體:等線,字號(hào):12
break;
default:
switch (j){
case 0:
cell.setCellStyle(cellStyleList.get(1));//將第二行第1個(gè)單元格設(shè)置為靠左,單元格無(wú)邊框,上下居中,字體:等線,字號(hào):10
break;
case 4:
cell.setCellStyle(cellStyleList.get(2));//將第二行第5個(gè)單元格設(shè)置上下左右居中,單元格無(wú)邊框,字體:等線,字號(hào):10
break;
default:
cell.setCellStyle(cellStyleList.get(3));//其他單元格
}
}
}
}
}
//插入表體數(shù)據(jù)
public static void setExcelBody(SXSSFSheet sheet, List<List<String>> body,List<CellStyle> bodyStyleList)
{
int rowNum = body.size();//表體有幾行
int rowElementNum = body.get(0).size();//每行有幾列
List<String> rowList = null;//聲明一個(gè)行數(shù)據(jù)集合
SXSSFRow row = null;//聲明一個(gè)行對(duì)象
SXSSFCell cell = null;//聲明一個(gè)單元格對(duì)象
for (int i = 3; i < rowNum + 3; i++) {//前3行是表頭,從第4行開始創(chuàng)建行對(duì)象
row = sheet.createRow(i);//創(chuàng)建行對(duì)象
//將第4行行高設(shè)為600
if(i == 3){
row.setHeight((short)600);
}
rowList = body.get(i - 3);//取出表體的一行數(shù)據(jù)
for (int j = 0; j < rowList.size() ; j++){
cell = row.createCell(j);//創(chuàng)建第 i + 1 行,第 j + 1 列的單元格
cell.setCellValue(rowList.get(j));//設(shè)置單元格內(nèi)容(插入數(shù)據(jù))
//設(shè)置單元格數(shù)據(jù)樣式
switch (i){
case 3:
cell.setCellStyle(bodyStyleList.get(3));//第4行設(shè)置為上下左右居中,單元格有邊框,字體:等線,字號(hào):10
break;
case 4:
cell.setCellStyle(bodyStyleList.get(3));//第5行設(shè)置為上下左右居中,單元格有邊框,字體:等線,字號(hào):10
break;
default:
switch (j){
case 0:
cell.setCellStyle(bodyStyleList.get(0));//其他行第一列設(shè)置為靠左,上下居中,單元格有左右邊框,無(wú)上下邊框,字體:等線,字號(hào):10
break;
case 1:
cell.setCellStyle(bodyStyleList.get(1));//其他行第二列設(shè)置為靠左,上下居中,單元格有左右邊框,無(wú)上下邊框,字體:等線,字號(hào):10
break;
default:
cell.setCellStyle(bodyStyleList.get(2));//其他行其他列設(shè)置為上下左右居中,單元格有左右邊框,無(wú)上下邊框,字體:等線,字號(hào):10
}
}
}
}
}
//獲取表頭樣式集合
private static List<CellStyle> getHeadCellStyleList(SXSSFWorkbook wb) {
List<CellStyle> cellStyleList = new ArrayList<>();
CellStyle bodyStyle1 = headStyle1(wb);
CellStyle bodyStyle2 = headStyle2(wb);
CellStyle bodyStyle3 = headStyle3(wb);
CellStyle bodyStyle4 = headStyle3(wb);
cellStyleList.add(bodyStyle1);
cellStyleList.add(bodyStyle2);
cellStyleList.add(bodyStyle3);
cellStyleList.add(bodyStyle4);
return cellStyleList;
}
//獲取表體樣式集合
private static List<CellStyle> getBodyCellStyleList(SXSSFWorkbook wb)
{
List<CellStyle> list = new ArrayList<>();
CellStyle cellStyle1 = bodyStyle1(wb);
CellStyle cellStyle2 = bodyStyle2(wb);
CellStyle cellStyle3 = bodyStyle3(wb);
CellStyle cellStyle4 = bodyStyle4(wb);
list.add(cellStyle1);
list.add(cellStyle2);
list.add(cellStyle3);
list.add(cellStyle4);
return list;
}
//字體
public static Font getFont(SXSSFWorkbook wb,String fontName,int height){
Font font = wb.createFont();
//font.setBoldweight((short) 10);// 設(shè)置字體的寬度
//font.setFontHeightInPoints((short) height);// 設(shè)置字體的高度
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗體顯示
font.setFontHeightInPoints((short)height);//設(shè)置字號(hào)
font.setFontName(fontName);//設(shè)置字體(輸入字體名)
return font;
}
//表頭樣式1
public static CellStyle headStyle1(SXSSFWorkbook wb)
{
CellStyle style1 = wb.createCellStyle();// 樣式對(duì)象
// 設(shè)置單元格上、下、左、右的邊框線
style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE為不顯示邊框,THIN為顯示邊框
style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);
style1.setBorderLeft(HSSFCellStyle.BORDER_NONE);
style1.setBorderRight(HSSFCellStyle.BORDER_NONE);
Font font = getFont(wb,"等線",12);// 創(chuàng)建一個(gè)字體對(duì)象
style1.setFont(font);// 設(shè)置style1的字體
//style1.setWrapText(true);// 設(shè)置自動(dòng)換行
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 設(shè)置單元格字體顯示居中(左右方向)
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 設(shè)置單元格字體顯示居中(上下方向)
return style1;
}
//表頭樣式2
public static CellStyle headStyle2(SXSSFWorkbook wb)
{
CellStyle style1 = wb.createCellStyle();// 樣式對(duì)象
// 設(shè)置單元格上、下、左、右的邊框線
style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);//NONE為不顯示邊框,THIN為顯示邊框
style1.setBorderLeft(HSSFCellStyle.BORDER_NONE);
style1.setBorderRight(HSSFCellStyle.BORDER_NONE);
style1.setBorderTop(HSSFCellStyle.BORDER_NONE);
Font font = getFont(wb,"等線",10);// 創(chuàng)建一個(gè)字體對(duì)象
style1.setFont(font);// 設(shè)置style1的字體
//style1.setWrapText(true);// 設(shè)置自動(dòng)換行
style1.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 設(shè)置單元格字體顯示居中(左右方向)
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_BOTTOM);// 設(shè)置單元格字體顯示居中(上下方向)
return style1;
}
//表頭樣式3
public static CellStyle headStyle3(SXSSFWorkbook wb)
{
CellStyle style1 = wb.createCellStyle();// 樣式對(duì)象
// 設(shè)置單元格上、下、左、右的邊框線
style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);//NONE為不顯示邊框,THIN為顯示邊框
style1.setBorderLeft(HSSFCellStyle.BORDER_NONE);
style1.setBorderRight(HSSFCellStyle.BORDER_NONE);
style1.setBorderTop(HSSFCellStyle.BORDER_NONE);
Font font = getFont(wb,"等線",10);// 創(chuàng)建一個(gè)字體對(duì)象
style1.setFont(font);// 設(shè)置style1的字體
//style1.setWrapText(true);// 設(shè)置自動(dòng)換行
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 設(shè)置單元格字體顯示居中(左右方向)
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 設(shè)置單元格字體顯示居中(上下方向)
return style1;
}
//表體樣式1
public static CellStyle bodyStyle1(SXSSFWorkbook wb)
{
// 設(shè)置style1的樣式,此樣式運(yùn)用在第二行
CellStyle style = wb.createCellStyle();//樣式對(duì)象
// 設(shè)置單元格上、下、左、右的邊框線
style.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE為不顯示邊框,THIN為顯示邊框
style.setBorderBottom(HSSFCellStyle.BORDER_NONE);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
Font font = getFont(wb,"等線",10);// 創(chuàng)建一個(gè)字體對(duì)象
style.setFont(font);// 設(shè)置style1的字體
//style1.setWrapText(true);// 設(shè)置自動(dòng)換行
style.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 設(shè)置單元格字體顯示靠左(左右方向)
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 設(shè)置單元格字體顯示居中(上下方向)
return style;
}
//表體樣式2
public static CellStyle bodyStyle2(SXSSFWorkbook wb)
{
// 設(shè)置style1的樣式,此樣式運(yùn)用在第二行
CellStyle style1 = wb.createCellStyle();// 樣式對(duì)象
// 設(shè)置單元格上、下、左、右的邊框線
style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE為不顯示邊框,THIN為顯示邊框
style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);
style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
Font font = getFont(wb,"等線",10);// 創(chuàng)建一個(gè)字體對(duì)象
style1.setFont(font);// 設(shè)置style1的字體
//style1.setWrapText(true);// 設(shè)置自動(dòng)換行
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 設(shè)置單元格字體顯示居中(左右方向)
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 設(shè)置單元格字體顯示居中(上下方向)
return style1;
}
//表體樣式3
public static CellStyle bodyStyle3(SXSSFWorkbook wb)
{
// 設(shè)置style1的樣式,此樣式運(yùn)用在第二行
CellStyle style1 = wb.createCellStyle();//樣式對(duì)象
// 設(shè)置單元格上、下、左、右的邊框線
style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE為不顯示邊框,THIN為顯示邊框
style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);
style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
Font font = getFont(wb,"等線",10);// 創(chuàng)建一個(gè)字體對(duì)象
style1.setFont(font);// 設(shè)置style1的字體
//style1.setWrapText(true);// 設(shè)置自動(dòng)換行
style1.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 設(shè)置單元格字體顯示靠右(左右方向)
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 設(shè)置單元格字體顯示居中(上下方向)
return style1;
}
//表體樣式4
public static CellStyle bodyStyle4(SXSSFWorkbook wb)
{
// 設(shè)置style1的樣式
CellStyle style1 = wb.createCellStyle();//樣式對(duì)象
// 設(shè)置單元格上、下、左、右的邊框線
style1.setBorderTop(HSSFCellStyle.BORDER_THIN);//NONE為不顯示邊框,THIN為顯示邊框
style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
Font font = getFont(wb,"等線",10);// 創(chuàng)建一個(gè)字體對(duì)象
style1.setFont(font);// 設(shè)置style1的字體
//style1.setWrapText(true);// 設(shè)置自動(dòng)換行
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 設(shè)置單元格字體顯示居中(左右方向)
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 設(shè)置單元格字體顯示居中(上下方向)
return style1;
}
}設(shè)置樣式,如字體、單元格等(詳細(xì)的可以去看官方文檔)
// 設(shè)置單元格的橫向和縱向?qū)R方式, cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY); cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //設(shè)置背景顏色 cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
四、總結(jié)
單元格合并,單元格樣式、字體樣式,在代碼中都有注釋,上述代碼,講述了復(fù)雜excel的導(dǎo)出,可以導(dǎo)出多個(gè)sheet頁(yè),可自己準(zhǔn)備數(shù)據(jù)測(cè)試
到此這篇關(guān)于Java使用Poi導(dǎo)出Excel表格的文章就介紹到這了,更多相關(guān)Java Poi導(dǎo)出Excel表格內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot如何獲取src/main/resource路徑下的文件
這篇文章主要介紹了SpringBoot如何獲取src/main/resource路徑下的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Windows7下的Java運(yùn)行環(huán)境搭建過程圖解
這篇文章主要介紹了Windows7下的Java運(yùn)行環(huán)境搭建過程圖解,需要的朋友可以參考下2014-04-04
springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢
這篇文章主要介紹了springboot?jpa?實(shí)現(xiàn)返回結(jié)果自定義查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
使用eclipse打包Maven項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了使用eclipse打包Maven項(xiàng)目的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
SpringKafka錯(cuò)誤處理(重試機(jī)制與死信隊(duì)列)
Spring Kafka提供了全面的錯(cuò)誤處理機(jī)制,通過靈活的重試策略和死信隊(duì)列處理,下面就來(lái)介紹一下,具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04
Spring AOP在web應(yīng)用中的使用方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Spring AOP在web應(yīng)用中的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring AOP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

