一、有時(shí)候?qū)С鰁xcel時(shí)需要按類別導(dǎo)出,一大類下好幾個(gè)小類,小類下又有好幾個(gè)小小類,就像下圖:
要實(shí)現(xiàn)這個(gè)也不難,
思路如下:按照大類來循環(huán),如上就是按照張江校區(qū)、徐匯校區(qū)、臨港校區(qū)三個(gè)大類循環(huán),然后再處理小類,因?yàn)楸纠⌒☆惒簧婕昂喜ⅲ灾簧婕疤幚硇☆悾绻枰幚硇⌒☆悾€需要在處理一下,具體實(shí)現(xiàn)原理同小類;
每次循環(huán)時(shí)記錄下此次循環(huán)的房屋類型和上次循環(huán)的房屋類型,兩者相同時(shí),要合并的結(jié)束行++,否者,說明這個(gè)房屋類型已經(jīng)循環(huán)完畢(前提是各類型都按順序order by 了,保證相同類型相鄰),開始融合。具體實(shí)現(xiàn)如下:
二、實(shí)現(xiàn)代碼,具體思路已經(jīng)在注釋中了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
public void expstatistics(string filepath,string campuscode) { try { writableworkbook wwb = workbook.createworkbook( new file(filepath)); jxlformatutil jfu = new jxlformatutil(); writablesheet ws = wwb.createsheet( "房屋報(bào)表統(tǒng)計(jì)" , 0 ); string[] tablehead = { "校區(qū)名稱:20" , "房屋類型:30" , "房屋用途:30" , "使用面積(㎡):20" }; for ( int i = 0 ; i < tablehead.length; i++) { //每一列的標(biāo)題樣式 ws.addcell( new label(i, 0 , tablehead[i].split( ":" )[ 0 ], jxlformatutil.wchead)); ws.setcolumnview(i, integer.valueof(tablehead[i].split( ":" )[ 1 ])); } int col = 1 ; //從第1行開始 //以下變量用來融合相同內(nèi)容 的行 int percol = col; string perpurpose = "" ; //上一個(gè)用途類型 string purpose = "" ; //當(dāng)前用途類型 int startmergecol = 1 ; //要融合的第一行 int endmergecol = 0 ; //要融合的最后行 boolean flag = true ; //用來記錄是否是第一次循環(huán) //根據(jù)搜索條件導(dǎo)出 list<fcxtcampus> campuslist = new arraylist<fcxtcampus>(); if ( null != campuscode && ! "" .equals(campuscode)){ campuslist = campusdao.findcampusbycode(campuscode); } else { campuslist =campusdao.findcampus(); } for (fcxtcampus campus : campuslist) { list<fcxtbuild> builds = builddao.statisticsbuilds(campus.getcampuscode()); //獲取所有房屋信息 if ( null != builds && builds.size() > 0 ){ for (fcxtbuild build : builds) { int row = 0 ; //從第0列開始 ws.addcell( new label(row++, col, campus.getcampusname(), jxlformatutil.wccenter)); purpose = build.getusefulpurpose(); if (flag){ //如果是第一次循環(huán),將perpurpose初始化,以便后面的第一次判斷 perpurpose = purpose; flag = false ; } ws.addcell( new label(row++, col, fcxtbuild.build_usefulpurpose.get(build.getusefulpurpose()), jxlformatutil.wccenter)); if (purpose.equals(perpurpose)){ endmergecol++; } else { //兩者不相同時(shí),融合之前相同的行 ws.mergecells( 1 , startmergecol, 1 , endmergecol); startmergecol = col; endmergecol = startmergecol; perpurpose = purpose; } ws.addcell( new label(row++, col, fcxtbuild.build_buildingtype.get(build.getbuildingtype()), jxlformatutil.wccenter)); ws.addcell( new label(row++, col, build.getbuildarea().tostring(), jxlformatutil.wccenter)); col++; } ws.mergecells( 0 , percol, 0 , col- 1 ); percol = col; } } wwb.write(); wwb.close(); } catch (exception e) { e.printstacktrace(); } } |
總結(jié)
以上所述是小編給大家介紹的java導(dǎo)出excel時(shí)合并同一列中相同內(nèi)容的行思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!
原文鏈接:https://www.cnblogs.com/hpuiotcl/archive/2018/06/07/9150229.html