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
27a037ed
Commit
27a037ed
authored
Apr 25, 2025
by
RuoYi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Excel导入导出支持多图片
parent
87173cbe
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
42 additions
and
33 deletions
+42
-33
StringUtils.java
...mon/src/main/java/com/ruoyi/common/utils/StringUtils.java
+12
-0
ExcelUtil.java
...n/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
+30
-33
No files found.
ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java
View file @
27a037ed
...
@@ -381,6 +381,18 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
...
@@ -381,6 +381,18 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
return
new
HashSet
<
String
>(
str2List
(
str
,
sep
,
true
,
false
));
return
new
HashSet
<
String
>(
str2List
(
str
,
sep
,
true
,
false
));
}
}
/**
* 字符串转list
*
* @param str 字符串
* @param sep 分隔符
* @return list集合
*/
public
static
final
List
<
String
>
str2List
(
String
str
,
String
sep
)
{
return
str2List
(
str
,
sep
,
true
,
false
);
}
/**
/**
* 字符串转list
* 字符串转list
*
*
...
...
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
View file @
27a037ed
...
@@ -95,6 +95,8 @@ public class ExcelUtil<T>
...
@@ -95,6 +95,8 @@ public class ExcelUtil<T>
{
{
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
ExcelUtil
.
class
);
private
static
final
Logger
log
=
LoggerFactory
.
getLogger
(
ExcelUtil
.
class
);
public
static
final
String
SEPARATOR
=
","
;
public
static
final
String
FORMULA_REGEX_STR
=
"=|-|\\+|@"
;
public
static
final
String
FORMULA_REGEX_STR
=
"=|-|\\+|@"
;
public
static
final
String
[]
FORMULA_STR
=
{
"="
,
"-"
,
"+"
,
"@"
};
public
static
final
String
[]
FORMULA_STR
=
{
"="
,
"-"
,
"+"
,
"@"
};
...
@@ -360,7 +362,7 @@ public class ExcelUtil<T>
...
@@ -360,7 +362,7 @@ public class ExcelUtil<T>
throw
new
IOException
(
"文件sheet不存在"
);
throw
new
IOException
(
"文件sheet不存在"
);
}
}
boolean
isXSSFWorkbook
=
!(
wb
instanceof
HSSFWorkbook
);
boolean
isXSSFWorkbook
=
!(
wb
instanceof
HSSFWorkbook
);
Map
<
String
,
PictureData
>
pictures
;
Map
<
String
,
List
<
PictureData
>>
pictures
=
null
;
if
(
isXSSFWorkbook
)
if
(
isXSSFWorkbook
)
{
{
pictures
=
getSheetPictures07
((
XSSFSheet
)
sheet
,
(
XSSFWorkbook
)
wb
);
pictures
=
getSheetPictures07
((
XSSFSheet
)
sheet
,
(
XSSFWorkbook
)
wb
);
...
@@ -504,16 +506,15 @@ public class ExcelUtil<T>
...
@@ -504,16 +506,15 @@ public class ExcelUtil<T>
}
}
else
if
(
ColumnType
.
IMAGE
==
attr
.
cellType
()
&&
StringUtils
.
isNotEmpty
(
pictures
))
else
if
(
ColumnType
.
IMAGE
==
attr
.
cellType
()
&&
StringUtils
.
isNotEmpty
(
pictures
))
{
{
PictureData
image
=
pictures
.
get
(
row
.
getRowNum
()
+
"_"
+
entry
.
getKey
());
StringBuilder
propertyString
=
new
StringBuilder
();
if
(
image
==
null
)
List
<
PictureData
>
images
=
pictures
.
get
(
row
.
getRowNum
()
+
"_"
+
entry
.
getKey
());
for
(
PictureData
picture
:
images
)
{
{
val
=
""
;
byte
[]
data
=
picture
.
getData
();
}
String
fileName
=
FileUtils
.
writeImportBytes
(
data
);
else
propertyString
.
append
(
fileName
).
append
(
SEPARATOR
);
{
byte
[]
data
=
image
.
getData
();
val
=
FileUtils
.
writeImportBytes
(
data
);
}
}
val
=
StringUtils
.
stripEnd
(
propertyString
.
toString
(),
SEPARATOR
);
}
}
ReflectUtils
.
invokeSetter
(
entity
,
propertyName
,
val
);
ReflectUtils
.
invokeSetter
(
entity
,
propertyName
,
val
);
}
}
...
@@ -1037,12 +1038,15 @@ public class ExcelUtil<T>
...
@@ -1037,12 +1038,15 @@ public class ExcelUtil<T>
else
if
(
ColumnType
.
IMAGE
==
attr
.
cellType
())
else
if
(
ColumnType
.
IMAGE
==
attr
.
cellType
())
{
{
ClientAnchor
anchor
=
new
XSSFClientAnchor
(
0
,
0
,
0
,
0
,
(
short
)
cell
.
getColumnIndex
(),
cell
.
getRow
().
getRowNum
(),
(
short
)
(
cell
.
getColumnIndex
()
+
1
),
cell
.
getRow
().
getRowNum
()
+
1
);
ClientAnchor
anchor
=
new
XSSFClientAnchor
(
0
,
0
,
0
,
0
,
(
short
)
cell
.
getColumnIndex
(),
cell
.
getRow
().
getRowNum
(),
(
short
)
(
cell
.
getColumnIndex
()
+
1
),
cell
.
getRow
().
getRowNum
()
+
1
);
String
imagePath
=
Convert
.
toStr
(
value
);
String
propertyValue
=
Convert
.
toStr
(
value
);
if
(
StringUtils
.
isNotEmpty
(
imagePath
))
if
(
StringUtils
.
isNotEmpty
(
propertyValue
))
{
{
byte
[]
data
=
ImageUtils
.
getImage
(
imagePath
);
List
<
String
>
imagePaths
=
StringUtils
.
str2List
(
propertyValue
,
SEPARATOR
);
getDrawingPatriarch
(
cell
.
getSheet
()).
createPicture
(
anchor
,
for
(
String
imagePath
:
imagePaths
)
cell
.
getSheet
().
getWorkbook
().
addPicture
(
data
,
getImageType
(
data
)));
{
byte
[]
data
=
ImageUtils
.
getImage
(
imagePath
);
getDrawingPatriarch
(
cell
.
getSheet
()).
createPicture
(
anchor
,
cell
.
getSheet
().
getWorkbook
().
addPicture
(
data
,
getImageType
(
data
)));
}
}
}
}
}
}
}
...
@@ -1287,7 +1291,7 @@ public class ExcelUtil<T>
...
@@ -1287,7 +1291,7 @@ public class ExcelUtil<T>
public
static
String
convertByExp
(
String
propertyValue
,
String
converterExp
,
String
separator
)
public
static
String
convertByExp
(
String
propertyValue
,
String
converterExp
,
String
separator
)
{
{
StringBuilder
propertyString
=
new
StringBuilder
();
StringBuilder
propertyString
=
new
StringBuilder
();
String
[]
convertSource
=
converterExp
.
split
(
","
);
String
[]
convertSource
=
converterExp
.
split
(
SEPARATOR
);
for
(
String
item
:
convertSource
)
for
(
String
item
:
convertSource
)
{
{
String
[]
itemArray
=
item
.
split
(
"="
);
String
[]
itemArray
=
item
.
split
(
"="
);
...
@@ -1324,7 +1328,7 @@ public class ExcelUtil<T>
...
@@ -1324,7 +1328,7 @@ public class ExcelUtil<T>
public
static
String
reverseByExp
(
String
propertyValue
,
String
converterExp
,
String
separator
)
public
static
String
reverseByExp
(
String
propertyValue
,
String
converterExp
,
String
separator
)
{
{
StringBuilder
propertyString
=
new
StringBuilder
();
StringBuilder
propertyString
=
new
StringBuilder
();
String
[]
convertSource
=
converterExp
.
split
(
","
);
String
[]
convertSource
=
converterExp
.
split
(
SEPARATOR
);
for
(
String
item
:
convertSource
)
for
(
String
item
:
convertSource
)
{
{
String
[]
itemArray
=
item
.
split
(
"="
);
String
[]
itemArray
=
item
.
split
(
"="
);
...
@@ -1750,30 +1754,24 @@ public class ExcelUtil<T>
...
@@ -1750,30 +1754,24 @@ public class ExcelUtil<T>
* @param workbook 工作簿对象
* @param workbook 工作簿对象
* @return Map key:图片单元格索引(1_1)String,value:图片流PictureData
* @return Map key:图片单元格索引(1_1)String,value:图片流PictureData
*/
*/
public
static
Map
<
String
,
PictureData
>
getSheetPictures03
(
HSSFSheet
sheet
,
HSSFWorkbook
workbook
)
public
static
Map
<
String
,
List
<
PictureData
>
>
getSheetPictures03
(
HSSFSheet
sheet
,
HSSFWorkbook
workbook
)
{
{
Map
<
String
,
PictureData
>
sheetIndexPicMap
=
new
HashMap
<
String
,
PictureData
>();
Map
<
String
,
List
<
PictureData
>>
sheetIndexPicMap
=
new
HashMap
<
>();
List
<
HSSFPictureData
>
pictures
=
workbook
.
getAllPictures
();
List
<
HSSFPictureData
>
pictures
=
workbook
.
getAllPictures
();
if
(!
pictures
.
isEmpty
())
if
(!
pictures
.
isEmpty
()
&&
sheet
.
getDrawingPatriarch
()
!=
null
)
{
{
for
(
HSSFShape
shape
:
sheet
.
getDrawingPatriarch
().
getChildren
())
for
(
HSSFShape
shape
:
sheet
.
getDrawingPatriarch
().
getChildren
())
{
{
HSSFClientAnchor
anchor
=
(
HSSFClientAnchor
)
shape
.
getAnchor
();
if
(
shape
instanceof
HSSFPicture
)
if
(
shape
instanceof
HSSFPicture
)
{
{
HSSFPicture
pic
=
(
HSSFPicture
)
shape
;
HSSFPicture
pic
=
(
HSSFPicture
)
shape
;
int
pictureIndex
=
pic
.
getPictureIndex
()
-
1
;
HSSFClientAnchor
anchor
=
(
HSSFClientAnchor
)
pic
.
getAnchor
();
HSSFPictureData
picData
=
pictures
.
get
(
pictureIndex
);
String
picIndex
=
anchor
.
getRow1
()
+
"_"
+
anchor
.
getCol1
();
String
picIndex
=
anchor
.
getRow1
()
+
"_"
+
anchor
.
getCol1
();
sheetIndexPicMap
.
put
(
picIndex
,
picData
);
sheetIndexPicMap
.
computeIfAbsent
(
picIndex
,
k
->
new
ArrayList
<>()).
add
(
pic
.
getPictureData
()
);
}
}
}
}
return
sheetIndexPicMap
;
}
else
{
return
sheetIndexPicMap
;
}
}
return
sheetIndexPicMap
;
}
}
/**
/**
...
@@ -1783,16 +1781,15 @@ public class ExcelUtil<T>
...
@@ -1783,16 +1781,15 @@ public class ExcelUtil<T>
* @param workbook 工作簿对象
* @param workbook 工作簿对象
* @return Map key:图片单元格索引(1_1)String,value:图片流PictureData
* @return Map key:图片单元格索引(1_1)String,value:图片流PictureData
*/
*/
public
static
Map
<
String
,
PictureData
>
getSheetPictures07
(
XSSFSheet
sheet
,
XSSFWorkbook
workbook
)
public
static
Map
<
String
,
List
<
PictureData
>
>
getSheetPictures07
(
XSSFSheet
sheet
,
XSSFWorkbook
workbook
)
{
{
Map
<
String
,
PictureData
>
sheetIndexPicMap
=
new
HashMap
<
String
,
PictureData
>();
Map
<
String
,
List
<
PictureData
>>
sheetIndexPicMap
=
new
HashMap
<
>();
for
(
POIXMLDocumentPart
dr
:
sheet
.
getRelations
())
for
(
POIXMLDocumentPart
dr
:
sheet
.
getRelations
())
{
{
if
(
dr
instanceof
XSSFDrawing
)
if
(
dr
instanceof
XSSFDrawing
)
{
{
XSSFDrawing
drawing
=
(
XSSFDrawing
)
dr
;
XSSFDrawing
drawing
=
(
XSSFDrawing
)
dr
;
List
<
XSSFShape
>
shapes
=
drawing
.
getShapes
();
for
(
XSSFShape
shape
:
drawing
.
getShapes
())
for
(
XSSFShape
shape
:
shapes
)
{
{
if
(
shape
instanceof
XSSFPicture
)
if
(
shape
instanceof
XSSFPicture
)
{
{
...
@@ -1800,7 +1797,7 @@ public class ExcelUtil<T>
...
@@ -1800,7 +1797,7 @@ public class ExcelUtil<T>
XSSFClientAnchor
anchor
=
pic
.
getPreferredSize
();
XSSFClientAnchor
anchor
=
pic
.
getPreferredSize
();
CTMarker
ctMarker
=
anchor
.
getFrom
();
CTMarker
ctMarker
=
anchor
.
getFrom
();
String
picIndex
=
ctMarker
.
getRow
()
+
"_"
+
ctMarker
.
getCol
();
String
picIndex
=
ctMarker
.
getRow
()
+
"_"
+
ctMarker
.
getCol
();
sheetIndexPicMap
.
put
(
picIndex
,
pic
.
getPictureData
());
sheetIndexPicMap
.
computeIfAbsent
(
picIndex
,
k
->
new
ArrayList
<>()).
add
(
pic
.
getPictureData
());
}
}
}
}
}
}
...
...
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