日常創(chuàng)建后臺(tái)系統(tǒng)時(shí),經(jīng)常會(huì)出現(xiàn)Excel導(dǎo)入導(dǎo)出問題。這次,在創(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í)施過程:
首先,必須創(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操作
先把方法拿來。前端在后臺(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;
}
接下來就是導(dǎo)出方法。
導(dǎo)出分為幾個(gè)步驟:
建立一個(gè)工作簿,也就是類型新建一個(gè)Excel文件
建立一張sheet表
設(shè)置標(biāo)的行高和列寬
繪制標(biāo)題和表頭
這兩個(gè)方法是自定義方法,代碼會(huì)貼在后面
寫入數(shù)據(jù)到Excel
創(chuàng)建下拉列表
寫入文件到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à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兼容性問題
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)
源碼地址:
來源:blog.c
1.《【weka怎么導(dǎo)出excel】?jī)?yōu)雅的實(shí)現(xiàn)Excel導(dǎo)入和導(dǎo)出》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《【weka怎么導(dǎo)出excel】?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)容來源地址,http://f99ss.com/keji/2530340.html