Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gic-enterprise-base
Overview
Overview
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
base_platform_enterprise
gic-enterprise-base
Commits
b0c1bc3f
Commit
b0c1bc3f
authored
May 08, 2020
by
陶光胜
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'developer' into 'master'
Developer See merge request
!3
parents
11ce7a31
306043ad
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
278 additions
and
7 deletions
+278
-7
ExcelExtensionEnum.java
...n/java/com/gic/download/constants/ExcelExtensionEnum.java
+20
-0
DownloadExcelQO.java
...ad/src/main/java/com/gic/download/qo/DownloadExcelQO.java
+44
-0
DownloadUtils.java
...d/src/main/java/com/gic/download/utils/DownloadUtils.java
+162
-7
ExcelUtils.java
...load/src/main/java/com/gic/download/utils/ExcelUtils.java
+52
-0
No files found.
gic-enterprise-download/src/main/java/com/gic/download/constants/ExcelExtensionEnum.java
View file @
b0c1bc3f
...
...
@@ -21,6 +21,26 @@ public enum ExcelExtensionEnum {
this
.
extension
=
extension
;
}
/**
* 根据code获取枚举对象,默认返回CSV
* @Title: getByCode
* @Description:
* @author guojuxing
* @param code
* @return com.gic.download.constants.ExcelExtensionEnum
*/
public
static
ExcelExtensionEnum
getByCode
(
Integer
code
)
{
if
(
code
==
null
)
{
return
ExcelExtensionEnum
.
CSV
;
}
for
(
ExcelExtensionEnum
extensionEnum
:
values
())
{
if
(
code
.
intValue
()
==
extensionEnum
.
getCode
())
{
return
extensionEnum
;
}
}
return
ExcelExtensionEnum
.
CSV
;
}
public
static
String
getExtensionByCode
(
Integer
code
)
{
if
(
code
==
null
)
{
return
".csv"
;
...
...
gic-enterprise-download/src/main/java/com/gic/download/qo/DownloadExcelQO.java
View file @
b0c1bc3f
package
com
.
gic
.
download
.
qo
;
import
java.io.Serializable
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 下载导出文件参数列表类
...
...
@@ -50,6 +52,21 @@ public class DownloadExcelQO implements Serializable{
*/
private
List
<
Integer
>
columnWidth
=
null
;
/**
* 二级表头标题中文,父子关联
*/
private
LinkedHashMap
<
String
,
List
<
String
>>
headerMap
;
/**
* 二级表头属性名称
*/
private
LinkedHashMap
<
String
,
List
<
String
>>
propertyNameMap
;
/**
* 二级表头需要加密的属性名称
*/
private
Map
<
String
,
List
<
String
>>
needEncryptFieldMap
;
public
String
getTempPath
()
{
return
tempPath
;
}
...
...
@@ -130,4 +147,31 @@ public class DownloadExcelQO implements Serializable{
this
.
columnWidth
=
columnWidth
;
return
this
;
}
public
LinkedHashMap
<
String
,
List
<
String
>>
getHeaderMap
()
{
return
headerMap
;
}
public
DownloadExcelQO
setHeaderMap
(
LinkedHashMap
<
String
,
List
<
String
>>
headerMap
)
{
this
.
headerMap
=
headerMap
;
return
this
;
}
public
LinkedHashMap
<
String
,
List
<
String
>>
getPropertyNameMap
()
{
return
propertyNameMap
;
}
public
DownloadExcelQO
setPropertyNameMap
(
LinkedHashMap
<
String
,
List
<
String
>>
propertyNameMap
)
{
this
.
propertyNameMap
=
propertyNameMap
;
return
this
;
}
public
Map
<
String
,
List
<
String
>>
getNeedEncryptFieldMap
()
{
return
needEncryptFieldMap
;
}
public
DownloadExcelQO
setNeedEncryptFieldMap
(
Map
<
String
,
List
<
String
>>
needEncryptFieldMap
)
{
this
.
needEncryptFieldMap
=
needEncryptFieldMap
;
return
this
;
}
}
gic-enterprise-download/src/main/java/com/gic/download/utils/DownloadUtils.java
View file @
b0c1bc3f
...
...
@@ -6,6 +6,7 @@ import java.util.*;
import
javax.servlet.http.HttpServletResponse
;
import
com.alibaba.fastjson.JSON
;
import
com.gic.download.constants.ExcelExtensionEnum
;
import
com.gic.download.dto.DownloadReportTempDTO
;
import
com.gic.download.qo.DownloadExcelQO
;
...
...
@@ -53,6 +54,9 @@ public class DownloadUtils {
* @date 2017年3月16日 上午11:45:45
*/
protected
String
convertProperty
(
T
bean
,
String
propertyName
,
Object
property
)
{
if
(
property
==
null
)
{
return
""
;
}
try
{
Class
clazz
=
getPropertyType
(
bean
,
propertyName
);
if
(
Date
.
class
.
equals
(
clazz
))
{
...
...
@@ -66,7 +70,7 @@ public class DownloadUtils {
LOGGER
.
info
(
"bean:"
+
bean
+
",Property:"
+
propertyName
+
e
.
getMessage
(),
e
);
return
null
;
}
return
property
==
null
?
""
:
property
.
toString
();
return
property
.
toString
();
}
protected
Class
getPropertyType
(
T
bean
,
String
propertyName
)
{
...
...
@@ -96,6 +100,35 @@ public class DownloadUtils {
}
/**
* 用于二级表头
* @param bean
* @param propertyName
* @return
*/
protected
Object
getPropertyOfDouble
(
Object
bean
,
String
propertyName
)
{
try
{
if
(
bean
==
null
)
{
return
null
;
}
if
(
bean
instanceof
Map
)
{
//如果是map
return
((
Map
)
bean
).
get
(
propertyName
);
}
return
BeanUtils
.
getProperty
(
bean
,
propertyName
);
}
catch
(
Throwable
e
)
{
LOGGER
.
info
(
"bean:"
+
bean
+
",Property:"
+
propertyName
+
e
.
getMessage
(),
e
);
return
null
;
}
}
protected
String
convertPropertyOfDouble
(
Object
bean
,
String
propertyName
,
Object
property
)
{
if
(
property
==
null
)
{
return
""
;
}
return
property
.
toString
();
}
/**
* 数据获取接口
* @param pageNum -- 从0计数
* @return
...
...
@@ -148,26 +181,53 @@ public class DownloadUtils {
* @param columnWidth 列宽
* @return void
*/
@Deprecated
protected
<
T
>
void
downloadOfDoubleHeaderTitle
(
String
tempPath
,
Integer
reportId
,
String
fileName
,
Integer
excelExtensionCode
,
List
<
HeaderQO
>
headerList
,
List
<
String
>
propertyNameList
,
DownloadDataLoader
<
T
>
loader
,
List
<
String
>
needEncryptField
,
List
<
Integer
>
columnWidth
)
throws
Exception
{
downloadCommon
(
new
DownloadExcelQO
().
setTempPath
(
tempPath
).
setReportId
(
reportId
).
setFileName
(
fileName
)
.
setExcelExtensionCode
(
excelExtensionCode
).
setHeaders
(
headerList
).
setPropertyNameList
(
propertyNameList
)
.
setNeedEncryptField
(
needEncryptField
).
setColumnWidth
(
columnWidth
),
loader
);
}
/**
* 下载文件,2层标题结构
* @Title: downloadForDoubleHeaderTitle
* @Description:
* @author guojuxing
* @param tempPath 临时路径
* @param reportId 报表中心ID
* @param fileName 文件名称
* @param excelExtensionCode Excel文件扩展名 枚举 ExcelExtensionEnum
* @param headerList 表头名称 2层标题结构
* @param propertyNameList 字段名
* @param loader 数据加载类
* @param needEncryptField 需要加密的字段,每一个元素存的是字段,如phone(电话)
* @param columnWidth 列宽
* @return void
*/
protected
<
T
>
void
downloadForDoubleHeaderTitle
(
String
tempPath
,
Integer
reportId
,
String
fileName
,
Integer
excelExtensionCode
,
LinkedHashMap
<
String
,
List
<
String
>>
headerList
,
LinkedHashMap
<
String
,
List
<
String
>>
propertyNameList
,
DownloadDataLoader
<
T
>
loader
,
Map
<
String
,
List
<
String
>>
needEncryptField
,
List
<
Integer
>
columnWidth
)
throws
Exception
{
downloadCommon
(
new
DownloadExcelQO
().
setTempPath
(
tempPath
).
setReportId
(
reportId
).
setFileName
(
fileName
)
.
setExcelExtensionCode
(
excelExtensionCode
).
setHeaderMap
(
headerList
).
setPropertyNameMap
(
propertyNameList
)
.
setNeedEncryptFieldMap
(
needEncryptField
).
setColumnWidth
(
columnWidth
),
loader
);
}
private
<
T
>
void
downloadCommon
(
DownloadExcelQO
param
,
DownloadDataLoader
<
T
>
loader
)
throws
Exception
{
LOGGER
.
info
(
"下载导出数据参数:{}"
,
JSON
.
toJSONString
(
param
));
Integer
reportId
=
param
.
getReportId
();
String
fileName
=
param
.
getFileName
();
Integer
excelExtensionCode
=
param
.
getExcelExtensionCode
();
List
<
String
>
headerList
=
param
.
getHeaderList
();
List
<
HeaderQO
>
headers
=
param
.
getHeaders
();
List
<
String
>
propertyNameList
=
param
.
getPropertyNameList
();
List
<
String
>
needEncryptField
=
param
.
getNeedEncryptField
();
String
tempPath
=
param
.
getTempPath
();
//是否是2层标题结构
boolean
isDoubleHeaderTitle
=
CollectionUtils
.
isNotEmpty
(
headers
);
LinkedHashMap
<
String
,
List
<
String
>>
headerMap
=
param
.
getHeaderMap
();
LinkedHashMap
<
String
,
List
<
String
>>
propertyNameMap
=
param
.
getPropertyNameMap
();
Map
<
String
,
List
<
String
>>
needEncryptFieldMap
=
param
.
getNeedEncryptFieldMap
();
boolean
isDoubleHeaderTitle
=
headerMap
!=
null
&&
!
headerMap
.
isEmpty
();
if
(
StringUtils
.
isEmpty
(
fileName
)
||
loader
==
null
||
CollectionUtils
.
isEmpty
(
propertyNameList
)
)
{
throw
new
RuntimeException
(
"参数错误。FileName:"
+
fileName
+
",DataLoader:"
+
loader
+
",PropertyName:"
+
propertyNameList
);
if
(
StringUtils
.
isEmpty
(
fileName
)
||
loader
==
null
)
{
throw
new
RuntimeException
(
"参数错误。FileName:"
+
fileName
+
",DataLoader:"
+
loader
);
}
// 获取输出流,设置content-type等头域
//final OutputStream out = getResponseStream(response ,fileName);
...
...
@@ -203,7 +263,13 @@ public class DownloadUtils {
}
};
writeOutputStream
(
loader
,
propertyNameList
,
writer
,
needEncryptField
,
reportId
);
if
(
isDoubleHeaderTitle
)
{
//二级表头处理
writeOutputStreamOfDoubleHeader
(
loader
,
propertyNameMap
,
writer
,
needEncryptFieldMap
,
reportId
);
}
else
{
writeOutputStream
(
loader
,
propertyNameList
,
writer
,
needEncryptField
,
reportId
);
}
// 写入excel
if
(
isDoubleHeaderTitle
)
{
CellStyle
style
=
workbook
.
createCellStyle
();
...
...
@@ -211,7 +277,7 @@ public class DownloadUtils {
style
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
// 指定单元格垂直居中对齐
style
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
if
(!
ExcelUtils
.
setHeaderTitle
(
style
,
sheet
,
param
.
getColumnWidth
(),
headers
,
rows
))
{
if
(!
ExcelUtils
.
doubleHeaderTitle
(
style
,
sheet
,
param
.
getColumnWidth
(),
headerMap
,
rows
))
{
throw
new
IOException
(
"设置导出文件内容失败。"
);
}
}
else
{
...
...
@@ -298,6 +364,23 @@ public class DownloadUtils {
return
out
;
}
private
void
test
()
{
LinkedHashMap
<
String
,
List
<
String
>>
headerMap
=
new
LinkedHashMap
<>(
16
);
headerMap
.
put
(
"测试1"
,
null
);
headerMap
.
put
(
"域名2"
,
Arrays
.
asList
(
"门店1"
,
"门店2"
));
headerMap
.
put
(
"域名3"
,
Arrays
.
asList
(
"门店1"
,
"门店2"
));
LinkedHashMap
<
String
,
List
<
String
>>
headerPropertyNameMap
=
new
LinkedHashMap
<>(
16
);
headerPropertyNameMap
.
put
(
"test1"
,
null
);
headerPropertyNameMap
.
put
(
"2"
,
Arrays
.
asList
(
"store1"
,
"store2"
));
headerPropertyNameMap
.
put
(
"3"
,
Arrays
.
asList
(
"store1"
,
"store2"
));
Map
<
String
,
List
<
String
>>
needEncryptFieldMap
=
new
HashMap
<>(
16
);
needEncryptFieldMap
.
put
(
"test1"
,
null
);
needEncryptFieldMap
.
put
(
"2"
,
Arrays
.
asList
(
"store1"
));
needEncryptFieldMap
.
put
(
"3"
,
Arrays
.
asList
(
"store1"
));
List
<
Map
<
String
,
Object
>>
dataList
=
new
ArrayList
<>();
}
protected
<
T
>
void
writeOutputStream
(
DownloadDataLoader
<
T
>
loader
,
List
<
String
>
propertyNames
,
Writer
writer
,
List
<
String
>
needEncryptField
,
Integer
reportId
)
throws
Exception
{
...
...
@@ -345,6 +428,78 @@ public class DownloadUtils {
}
protected
<
T
>
void
writeOutputStreamOfDoubleHeader
(
DownloadDataLoader
<
T
>
loader
,
LinkedHashMap
<
String
,
List
<
String
>>
propertyNames
,
Writer
writer
,
Map
<
String
,
List
<
String
>>
needEncryptField
,
Integer
reportId
)
throws
Exception
{
DownloadReportTempDTO
tempReport
=
DataDownloadUtils
.
getByReportId
(
reportId
);
//是否是否加密处理
boolean
isNeedEncrypt
=
tempReport
!=
null
&&
tempReport
.
getDataType
().
intValue
()
!=
1
;
boolean
hasNeedEncryptField
=
needEncryptField
!=
null
&&
!
needEncryptField
.
isEmpty
();
int
pageNum
=
1
;
int
maxLength
=
102400
;
while
(
maxLength
--
>
0
)
{
// 分页获取数据
List
<
T
>
objList
=
null
;
try
{
objList
=
loader
.
getDownloadData
(
pageNum
++);
}
catch
(
Exception
e
)
{
LOGGER
.
error
(
"获得到处数据异常:{}"
,
e
.
getMessage
(),
e
);
}
if
(
CollectionUtils
.
isEmpty
(
objList
))
{
break
;
}
for
(
T
bean
:
objList
)
{
if
(
bean
==
null
)
{
continue
;
}
//查询的数据对象,格式转换
Map
<
String
,
Object
>
obj
=
(
Map
<
String
,
Object
>)
bean
;
Collection
<
String
>
result
=
new
ArrayList
<
String
>();
// 遍历指定属性
for
(
Map
.
Entry
<
String
,
List
<
String
>>
entry
:
propertyNames
.
entrySet
())
{
// 获得属性值 (表头第二层数据)
List
<
String
>
propertyValue
=
entry
.
getValue
();
//数据对象的value
Object
objValue
=
obj
.
get
(
entry
.
getKey
());
if
(
CollectionUtils
.
isEmpty
(
propertyValue
))
{
//如果是空,说明只有一层
String
value
=
Optional
.
ofNullable
(
objValue
).
orElse
(
""
).
toString
();
if
(
isNeedEncrypt
&&
hasNeedEncryptField
)
{
if
(
needEncryptField
.
containsKey
(
entry
.
getKey
()))
{
value
=
encrypt
(
value
);
}
}
result
.
add
(
value
);
}
else
{
//如果不为空,说明是二层结构,则
for
(
String
pro
:
propertyValue
)
{
// 获得属性值
Object
property
=
loader
.
getPropertyOfDouble
(
objValue
,
pro
);
// 将属性值转换成字符串
String
convertValue
=
loader
.
convertPropertyOfDouble
(
objValue
,
pro
,
property
);
if
(
isNeedEncrypt
&&
hasNeedEncryptField
)
{
boolean
hasProperty
=
needEncryptField
.
containsKey
(
entry
.
getKey
())
&&
CollectionUtils
.
isNotEmpty
(
needEncryptField
.
get
(
entry
.
getKey
()))
&&
needEncryptField
.
get
(
entry
.
getKey
()).
contains
(
pro
);
if
(
hasProperty
)
{
convertValue
=
encrypt
(
convertValue
);
}
}
result
.
add
(
convertValue
);
}
}
}
if
(
CollectionUtils
.
isEmpty
(
result
))
{
continue
;
}
writer
.
write
(
result
);
}
}
}
private
static
String
encrypt
(
String
data
)
{
if
(
StringUtils
.
isBlank
(
data
))
{
return
data
;
...
...
gic-enterprise-download/src/main/java/com/gic/download/utils/ExcelUtils.java
View file @
b0c1bc3f
...
...
@@ -144,6 +144,7 @@ public class ExcelUtils {
return
true
;
}
@Deprecated
public
static
boolean
setHeaderTitle
(
CellStyle
cellStyle
,
Sheet
sheet
,
List
<
Integer
>
columnWidth
,
List
<
HeaderQO
>
headerList
,
List
<?>
content
)
{
if
(
sheet
==
null
)
{
logger
.
info
(
"sheet is null"
);
...
...
@@ -193,6 +194,57 @@ public class ExcelUtils {
return
true
;
}
public
static
boolean
doubleHeaderTitle
(
CellStyle
cellStyle
,
Sheet
sheet
,
List
<
Integer
>
columnWidth
,
LinkedHashMap
<
String
,
List
<
String
>>
headerMap
,
List
<?>
content
)
{
if
(
sheet
==
null
)
{
logger
.
info
(
"sheet is null"
);
return
false
;
}
// 设置sheet格式
setSheetStyle
(
sheet
,
columnWidth
);
Row
row1
=
sheet
.
createRow
(
0
);
Row
row2
=
sheet
.
createRow
(
1
);
int
n
=
0
;
for
(
Map
.
Entry
<
String
,
List
<
String
>>
entry
:
headerMap
.
entrySet
())
{
Cell
cell1
=
row1
.
createCell
(
n
);
List
<
String
>
sonHeader
=
entry
.
getValue
();
String
value
=
entry
.
getKey
();
cell1
.
setCellValue
(
value
);
cell1
.
setCellStyle
(
cellStyle
);
//2层标题
if
(
CollectionUtils
.
isEmpty
(
sonHeader
))
{
//单标题
Cell
cell2
=
row2
.
createCell
(
n
);
cell2
.
setCellStyle
(
cellStyle
);
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
0
,
1
,
n
,
n
));
n
++;
continue
;
}
//创建第一行大标题
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
0
,
0
,
n
,
(
n
+
sonHeader
.
size
()
-
1
)));
//赋值
for
(
int
j
=
0
,
sonLength
=
sonHeader
.
size
();
j
<
sonLength
;
j
++)
{
Cell
cell2
=
row2
.
createCell
(
n
++);
cell2
.
setCellStyle
(
cellStyle
);
cell2
.
setCellValue
(
sonHeader
.
get
(
j
));
}
}
// 如果内容为空 则退出
if
(
content
==
null
||
content
.
isEmpty
())
{
logger
.
info
(
"content is null,cannot write excel"
);
return
true
;
}
int
indexRow
=
2
;
for
(
Object
rowContent
:
content
)
{
Row
row
=
sheet
.
createRow
(
indexRow
++);
setRowInfo
(
row
,
rowContent
);
}
return
true
;
}
/**
* 導出到excel
*
...
...
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