日常創(chuàng)建后臺(tái)系統(tǒng)時(shí),經(jīng)常會(huì)出現(xiàn)Excel導(dǎo)入導(dǎo)出問(wèn)題。這次,在創(chuàng)建后臺(tái)系統(tǒng)的同時(shí),我想創(chuàng)建Excel導(dǎo)入和導(dǎo)出的公共工具。(莎士比亞,Northern Excel,Northern Exposure)。

通常是導(dǎo)出時(shí)導(dǎo)出的前端表,前端表在背景中也有映射類。

所以在使用這個(gè)工具的時(shí)候,首先整理一下我們要達(dá)到的效果。

導(dǎo)出方法接收列表集合、類類型和HttpServletResponse對(duì)象

導(dǎo)出可能有下拉列表,因此需要map存儲(chǔ)下拉數(shù)據(jù)源。傳遞參數(shù)后,只需一行代碼即可導(dǎo)出

導(dǎo)入方法需要傳入文件和類類型。導(dǎo)入后,將返回file集合。其中,對(duì)象是接收類型的對(duì)象,傳遞參數(shù)后,只要有一行代碼就可以導(dǎo)入

實(shí)施過(guò)程:

首先,必須創(chuàng)建三個(gè)注釋

一個(gè)是EnableExport。導(dǎo)出需要此注釋

/* *

*允許導(dǎo)出設(shè)置

*/

@Targe)

@Retention)

Public @interface EnableExport {

字串檔名;

}然后,可以使用EnableExportField將包含此注釋的字段導(dǎo)出到Excel并設(shè)置列寬

/* *

*啟用此字段可允許導(dǎo)出

*用于設(shè)置寬度

*/

@Targe)

@Retention)

public @ interfaceenableexportfield {

Int colWidth default 100

字符串colName

} ImportIndex在導(dǎo)入時(shí)設(shè)置與Excel中的列相對(duì)應(yīng)的序列號(hào)

/* *

*導(dǎo)入時(shí)建立索引

*/

@Targe)

@Retention)

Public @interface ImportIndex {

Intindex

}使用注釋的示例

創(chuàng)建三個(gè)注釋后,必須開始Excel操作

先把方法拿來(lái)。前端在后臺(tái)接收上傳的Excel文件,然后使用poi讀取Excel文件

根據(jù)接收類型上面的字段注釋順序,為不同的字段分配值,將其保存到集合中,然后返回。

代碼如下:

/* *

將* Excel轉(zhuǎn)換為對(duì)象集合

* @param excel Excel文件

* @param clazz POJO類型

* @return

*/

public static listobject parseexceltolist(file excel、classclazz) {

ListObject RES=new ArrayList

//創(chuàng)建輸入流,讀取Excel

InputStream is=;

圖紙=;

Try {

is=new FileInputStream);

If (is)!=) {

workbook workbook=workbook fac(is);

//默認(rèn)情況下,僅導(dǎo)入第一個(gè)工作表

sheet=workbook . get sheet at(0);

If(床單!=) {

//前兩行是標(biāo)題

int I=2;

字串值;

row row=(I);

while(low!=) {

//獲取單元格數(shù)

intcell num=row . getphysicalnumberofcells;

values=new String[cell num];

for(int j=0;J=儲(chǔ)存格numJ) {

cell cell=row . getcell(j);

If(單元格!=) {

//設(shè)定儲(chǔ)存格內(nèi)容類型

cell . setcelltype);

//獲取單元格值

string value=cell . getstringcellvalue==? cell.getStringCellValue

values[j]=value;

}

}

field fields=clazz . getdeclaredfields;

Object obj=clazz.newInstance

/>for(Field f : fields){
i)){
ImportIndex annotation = f.getDeclaredAnnotation);
int index = anno;
f.setAccessible(true);
//此處使用了阿里巴巴的fastjson包里面的一個(gè)類型轉(zhuǎn)換工具類
Object val =Ty(values[index],f.getType,);
f.set(obj,val);
}
}
res.add(obj);
i++;
row=(i);
}

}
}
} catch (Exception e) {
e.printStackTrace;
}
return res;
}

接下來(lái)就是導(dǎo)出方法。

導(dǎo)出分為幾個(gè)步驟:

  1. 建立一個(gè)工作簿,也就是類型新建一個(gè)Excel文件

  1. 建立一張sheet表

  1. 設(shè)置標(biāo)的行高和列寬

  1. 繪制標(biāo)題和表頭

這兩個(gè)方法是自定義方法,代碼會(huì)貼在后面

  1. 寫入數(shù)據(jù)到Excel

  1. 創(chuàng)建下拉列表

  1. 寫入文件到response

到這里導(dǎo)出工作就完成了

下面是一些自定義方法的代碼

/**
* 獲取一個(gè)基本的帶邊框的單元格
* @param workbook
* @return
*/
private static HSSFCellStyle getBasicCellStyle(HSSFWorkbook workbook){
HSSFCellStyle hssfcellstyle = workbook.createCellStyle;
);
);
);
);
);
);
(true);
return hssfcellstyle;
}

/**
* 獲取帶有背景色的標(biāo)題單元格
* @param workbook
* @return
*/
private static HSSFCellStyle getTitleCellStyle(HSSFWorkbook workbook){
HSSFCellStyle hssfcellstyle = getBasicCellStyle(workbook);
((short) HSSFColor.CORNFLOWER_BLUE.index); // 設(shè)置背景色
);
return hssfcellstyle;
}

/**
* 創(chuàng)建一個(gè)跨列的標(biāo)題行
* @param workbook
* @param hssfRow
* @param hssfcell
* @param hssfsheet
* @param allColNum
* @param title
*/
privatestaticvoidcreateTitle(HSSFWorkbook workbook, HSSFRow hssfRow , HSSFCell hssfcell, HSSFSheet hssfsheet,int allColNum,String title){
//在sheet里增加合并單元格
CellRangeAddress cra = new CellRangeAddress(0, 0, 0, allColNum);
(cra);
// 使用RegionUtil類為合并后的單元格添加邊框
RegionU(1, cra, hssfsheet, workbook); // 下邊框
RegionU(1, cra, hssfsheet, workbook); // 左邊框
RegionU(1, cra, hssfsheet, workbook); // 有邊框
RegionU(1, cra, hssfsheet, workbook); // 上邊框

//設(shè)置表頭
hssfRow = hssf(0);
hssfcell = (0);
( getTitleCellStyle(workbook));
);
(title);
}

/**
* 設(shè)置表頭標(biāo)題欄以及表格高度
* @param workbook
* @param hssfRow
* @param hssfcell
* @param hssfsheet
* @param colNames
*/
privatestaticvoidcreateHeadRow(HSSFWorkbook workbook,HSSFRow hssfRow , HSSFCell hssfcell,HSSFSheet hssfsheet,List<String> colNames){
//插入標(biāo)題行
hssfRow = (1);
for (int i = 0; i < colNames.size; i++) {
hssfcell = (i);
(getTitleCellStyle(workbook));
);
(i));
}
}
/**
* excel添加下拉數(shù)據(jù)校驗(yàn)
* @param sheet 哪個(gè) sheet 頁(yè)添加校驗(yàn)
* @return
*/
publicstaticvoidcreateDataValidation(Sheet sheet,Map<Integer,String[]> selectListMap) {
if(selectListMap!=) {
(
// 第幾列校驗(yàn)(0開始)key 數(shù)據(jù)源數(shù)組value
(key, value) -> {
i;0) {
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(2, 65535, key, key);
DataValidationHelper helper = ;
DataValidationConstraint constraint = (value);
DataValidation dataValidation = (constraint, cellRangeAddressList);
//處理Excel兼容性問(wèn)題
if (dataValidation instanceof XSSFDataValidation) {
da(true);
da(true);
} else {
da(false);
}
da(true);
da(true);
da("提示", "只能選擇下拉框里面的數(shù)據(jù)");
(dataValidation);
}
}
);
}
}

使用實(shí)例

導(dǎo)出數(shù)據(jù)

導(dǎo)入數(shù)據(jù)(返回對(duì)象List)

源碼地址:

來(lái)源:blog.c

1.《【excel導(dǎo)入怎么導(dǎo)】?jī)?yōu)雅的實(shí)現(xiàn)Excel導(dǎo)入和導(dǎo)出》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。

2.《【excel導(dǎo)入怎么導(dǎo)】?jī)?yōu)雅的實(shí)現(xiàn)Excel導(dǎo)入和導(dǎo)出》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/keji/2482025.html