Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
sts网站
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liyang
sts网站
Commits
31590104
Commit
31590104
authored
Dec 02, 2025
by
RuoYi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
支持Excel导出对象的多个子列表
parent
91263711
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
39 additions
and
27 deletions
+39
-27
ExcelUtil.java
...n/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
+39
-27
No files found.
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
View file @
31590104
...
...
@@ -174,12 +174,12 @@ public class ExcelUtil<T>
/**
* 对象的子列表方法
*/
private
M
ethod
subMethod
;
private
M
ap
<
String
,
Method
>
subMethods
=
new
HashMap
<>()
;
/**
* 对象的子列表属性
*/
private
List
<
Field
>
subFields
;
private
Map
<
String
,
List
<
Field
>>
subFieldsMap
=
new
HashMap
<>()
;
/**
* 统计列表
...
...
@@ -252,7 +252,7 @@ public class ExcelUtil<T>
int
titleLastCol
=
this
.
fields
.
size
()
-
1
;
if
(
isSubList
())
{
titleLastCol
=
titleLastCol
+
subFields
.
size
()
-
1
;
titleLastCol
=
titleLastCol
+
subFields
Map
.
values
()
.
size
()
-
1
;
}
Row
titleRow
=
sheet
.
createRow
(
rownum
==
0
?
rownum
++
:
0
);
titleRow
.
setHeightInPoints
(
30
);
...
...
@@ -272,16 +272,17 @@ public class ExcelUtil<T>
{
Row
subRow
=
sheet
.
createRow
(
rownum
);
int
column
=
0
;
int
subFieldSize
=
subFields
!=
null
?
subFields
.
size
()
:
0
;
for
(
Object
[]
objects
:
fields
)
{
Field
field
=
(
Field
)
objects
[
0
];
Excel
attr
=
(
Excel
)
objects
[
1
];
CellStyle
cellStyle
=
styles
.
get
(
StringUtils
.
format
(
"header_{}_{}"
,
attr
.
headerColor
(),
attr
.
headerBackgroundColor
()));
if
(
Collection
.
class
.
isAssignableFrom
(
field
.
getType
()))
{
Cell
cell
=
subRow
.
createCell
(
column
);
cell
.
setCellValue
(
attr
.
name
());
cell
.
setCellStyle
(
styles
.
get
(
StringUtils
.
format
(
"header_{}_{}"
,
attr
.
headerColor
(),
attr
.
headerBackgroundColor
())));
cell
.
setCellStyle
(
cellStyle
);
int
subFieldSize
=
subFieldsMap
!=
null
?
subFieldsMap
.
get
(
field
.
getName
()).
size
()
:
0
;
if
(
subFieldSize
>
1
)
{
CellRangeAddress
cellAddress
=
new
CellRangeAddress
(
rownum
,
rownum
,
column
,
column
+
subFieldSize
-
1
);
...
...
@@ -293,7 +294,7 @@ public class ExcelUtil<T>
{
Cell
cell
=
subRow
.
createCell
(
column
++);
cell
.
setCellValue
(
attr
.
name
());
cell
.
setCellStyle
(
styles
.
get
(
StringUtils
.
format
(
"header_{}_{}"
,
attr
.
headerColor
(),
attr
.
headerBackgroundColor
()))
);
cell
.
setCellStyle
(
cellStyle
);
}
}
rownum
++;
...
...
@@ -374,7 +375,11 @@ public class ExcelUtil<T>
Map
<
String
,
Integer
>
cellMap
=
new
HashMap
<
String
,
Integer
>();
// 获取表头
Row
heard
=
sheet
.
getRow
(
titleNum
);
for
(
int
i
=
0
;
i
<
heard
.
getPhysicalNumberOfCells
();
i
++)
if
(
heard
==
null
)
{
throw
new
UtilException
(
"文件标题行为空,请检查Excel文件格式"
);
}
for
(
int
i
=
0
;
i
<
heard
.
getLastCellNum
();
i
++)
{
Cell
cell
=
heard
.
getCell
(
i
);
if
(
StringUtils
.
isNotNull
(
cell
))
...
...
@@ -382,10 +387,6 @@ public class ExcelUtil<T>
String
value
=
this
.
getCellValue
(
heard
,
i
).
toString
();
cellMap
.
put
(
value
,
i
);
}
else
{
cellMap
.
put
(
null
,
i
);
}
}
// 有数据时才处理 得到类的所有field.
List
<
Object
[]>
fields
=
this
.
getFields
();
...
...
@@ -697,7 +698,8 @@ public class ExcelUtil<T>
Excel
excel
=
(
Excel
)
os
[
1
];
if
(
Collection
.
class
.
isAssignableFrom
(
field
.
getType
()))
{
for
(
Field
subField
:
subFields
)
List
<
Field
>
currentSubFields
=
subFieldsMap
.
get
(
field
.
getName
());
for
(
Field
subField
:
currentSubFields
)
{
Excel
subExcel
=
subField
.
getAnnotation
(
Excel
.
class
);
this
.
createHeadCell
(
subExcel
,
row
,
column
++);
...
...
@@ -710,7 +712,7 @@ public class ExcelUtil<T>
}
if
(
Type
.
EXPORT
.
equals
(
type
))
{
fillExcelData
(
index
,
row
);
fillExcelData
(
index
);
addStatisticsRow
();
}
}
...
...
@@ -723,7 +725,7 @@ public class ExcelUtil<T>
* @param row 单元格行
*/
@SuppressWarnings
(
"unchecked"
)
public
void
fillExcelData
(
int
index
,
Row
row
)
public
void
fillExcelData
(
int
index
)
{
int
startNo
=
index
*
sheetSize
;
int
endNo
=
Math
.
min
(
startNo
+
sheetSize
,
list
.
size
());
...
...
@@ -731,7 +733,7 @@ public class ExcelUtil<T>
for
(
int
i
=
startNo
;
i
<
endNo
;
i
++)
{
row
=
sheet
.
createRow
(
currentRowNum
);
Row
row
=
sheet
.
createRow
(
currentRowNum
);
T
vo
=
(
T
)
list
.
get
(
i
);
int
column
=
0
;
int
maxSubListSize
=
getCurrentMaxSubListSize
(
vo
);
...
...
@@ -747,6 +749,7 @@ public class ExcelUtil<T>
if
(
subList
!=
null
&&
!
subList
.
isEmpty
())
{
int
subIndex
=
0
;
List
<
Field
>
currentSubFields
=
subFieldsMap
.
get
(
field
.
getName
());
for
(
Object
subVo
:
subList
)
{
Row
subRow
=
sheet
.
getRow
(
currentRowNum
+
subIndex
);
...
...
@@ -756,14 +759,14 @@ public class ExcelUtil<T>
}
int
subColumn
=
column
;
for
(
Field
subField
:
s
ubFields
)
for
(
Field
subField
:
currentS
ubFields
)
{
Excel
subExcel
=
subField
.
getAnnotation
(
Excel
.
class
);
addCell
(
subExcel
,
subRow
,
(
T
)
subVo
,
subField
,
subColumn
++);
}
subIndex
++;
}
column
+=
s
ubFields
.
size
();
column
+=
currentS
ubFields
.
size
();
}
}
catch
(
Exception
e
)
...
...
@@ -1131,7 +1134,7 @@ public class ExcelUtil<T>
{
// 创建cell
cell
=
row
.
createCell
(
column
);
if
(
isSubListValue
(
vo
)
&&
getListCellValue
(
vo
)
.
size
()
>
1
&&
attr
.
needMerge
())
if
(
isSubListValue
(
vo
)
&&
getListCellValue
(
vo
)
>
1
&&
attr
.
needMerge
())
{
if
(
subMergedLastRowNum
>=
subMergedFirstRowNum
)
{
...
...
@@ -1602,10 +1605,11 @@ public class ExcelUtil<T>
}
if
(
Collection
.
class
.
isAssignableFrom
(
field
.
getType
()))
{
subMethod
=
getSubMethod
(
field
.
getName
(),
clazz
);
String
fieldName
=
field
.
getName
();
subMethods
.
put
(
fieldName
,
getSubMethod
(
fieldName
,
clazz
));
ParameterizedType
pt
=
(
ParameterizedType
)
field
.
getGenericType
();
Class
<?>
subClass
=
(
Class
<?>)
pt
.
getActualTypeArguments
()[
0
];
this
.
subFields
=
FieldUtils
.
getFieldsListWithAnnotation
(
subClass
,
Excel
.
class
);
subFieldsMap
.
put
(
fieldName
,
FieldUtils
.
getFieldsListWithAnnotation
(
subClass
,
Excel
.
class
)
);
}
}
...
...
@@ -1858,7 +1862,7 @@ public class ExcelUtil<T>
*/
public
boolean
isSubList
()
{
return
StringUtils
.
isNotNull
(
subFields
)
&&
subFields
.
size
()
>
0
;
return
!
StringUtils
.
isEmpty
(
subFieldsMap
)
;
}
/**
...
...
@@ -1866,24 +1870,32 @@ public class ExcelUtil<T>
*/
public
boolean
isSubListValue
(
T
vo
)
{
return
StringUtils
.
isNotNull
(
subFields
)
&&
subFields
.
size
()
>
0
&&
StringUtils
.
isNotNull
(
getListCellValue
(
vo
))
&&
getListCellValue
(
vo
).
size
(
)
>
0
;
return
!
StringUtils
.
isEmpty
(
subFieldsMap
)
&&
getListCellValue
(
vo
)
>
0
;
}
/**
* 获取集合的值
*/
public
Collection
<?>
getListCellValue
(
Object
obj
)
public
int
getListCellValue
(
Object
obj
)
{
Object
value
;
Collection
<?>
value
;
int
max
=
0
;
try
{
value
=
subMethod
.
invoke
(
obj
,
new
Object
[]
{});
for
(
String
s
:
subMethods
.
keySet
())
{
value
=
(
Collection
<?>)
subMethods
.
get
(
s
).
invoke
(
obj
);
if
(
value
.
size
()
>
max
)
{
max
=
value
.
size
();
}
}
}
catch
(
Exception
e
)
{
return
new
ArrayList
<
Object
>()
;
return
0
;
}
return
(
Collection
<?>)
value
;
return
max
;
}
/**
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment