Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
王仕雄
/
wangsx-test
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit b37012ca
authored
Aug 07, 2019
by
王仕雄
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
excel解析相关工具类与测试方法
1 parent
f898ceb8
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
885 additions
and
0 deletions
khdo/pom.xml
khdo/src/main/java/com/bootdo/common/utils/AAA.java
khdo/src/main/java/com/bootdo/common/utils/ExcelUtilTest.java
khdo/src/main/java/com/bootdo/common/utils/ExeclUtil.java
khdo/src/main/java/com/bootdo/common/utils/HzdyDO.java
khdo/src/main/java/com/bootdo/common/utils/JxlExcelUtils.java
khdo/pom.xml
View file @
b37012c
...
...
@@ -238,6 +238,24 @@
<version>
1.9.2
</version>
</dependency>
<!--jxl jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Excel文档-->
<dependency>
<groupId>
net.sourceforge.jexcelapi
</groupId>
<artifactId>
jxl
</artifactId>
<version>
2.6.12
</version>
</dependency>
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi
</artifactId>
<version>
3.16
</version>
</dependency>
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi-ooxml
</artifactId>
<version>
3.16
</version>
</dependency>
<!--war包部署需要-->
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
...
...
khdo/src/main/java/com/bootdo/common/utils/AAA.java
0 → 100644
View file @
b37012c
package
com
.
bootdo
.
common
.
utils
;
public
class
AAA
{
public
static
void
main
(
String
[]
args
)
{
String
ids
=
"[380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409]"
;
String
answers
=
"[B不同意, ['C脱敏治疗','B提高免疫力','A 避免接触过敏原'], B不同意, ['卡托普利','赖诺普利片','苯磺酸氨氯地平片','珍菊降压片','氢氯噻嗪'], ['泮托拉唑','奥美拉唑','兰索拉唑','氢氧化铝片'], ['容易引发脑溢血','长期高血压导致肾衰竭','容易导致动脉粥样硬化','长期高血压导致冠心病'], ['晕车贴','晕车药','坐车前不吃东西','吸闻橘子皮预防晕车'], ['不得掰开使用','服用时不能咀嚼'], ['鼻塞','鼻痒','流涕','喷嚏','慢性荨麻疹','皮肤瘙痒','哮喘','面部红斑','过敏性结膜炎'], ['氯雷他定','扑尔敏片'], ['肥胖','吸烟','饮酒','缺乏运动','高血压病家族遗传史','老年人','怀孕的妇女','食盐摄入量大的人','饮食过于油腻的人'], ['抗酸剂','抑酸剂','粘膜保护剂'], ['厌食','营养不良','身体消瘦','肠梗阻及穿孔','智力发育障碍','荨麻疹','哮喘'], ['接触患有肠道寄生虫病的患者',]"
;
String
[]
s
=
ids
.
split
(
","
);
String
[]
s2
=
answers
.
split
(
","
);
String
a2
=
"B不同意@|,['B提高免疫力']@|,B不同意@|,['苯磺酸氨氯地平片','珍菊降压片','氢氯噻嗪']@|,['兰索拉唑','奥美拉唑']@|,['容易导致动脉粥样硬化','长期高血压导致冠心病']@|,['坐车前不吃东西']@|,['其他','服用时不能咀嚼']@|,['鼻痒','慢性荨麻疹','喷嚏','过敏性结膜炎']@|,['康必得','氯雷他定','扑尔敏片']@|,['饮酒','缺乏运动','食盐摄入量大的人']@|,['促胃肠动力药','粘膜保护剂']@|,['身体消瘦','肠梗阻及穿孔']@|,['接触被污染的玩具','接触被污染的地板']@|,['定期服用驱虫药','瓜果蔬菜洗净吃']@|,['阿苯达唑片','其他']@|,['男性性功能障碍']@|,['海鲜','紫外线','动物皮毛']@|,['失眠','耳鸣','头晕']@|,['B降压药不能随便吃,一旦吃了就断不了','D降压药有副作用,尽量不使用降压药']@|,['B电视广告','D药店服务人员介绍','F听别人介绍']@|,['C不好,没什么效果,反而嗜睡等副作用很大 对我没"
;
String
[]
a22
=
a2
.
split
(
"[@][|],"
);
System
.
out
.
println
(
99
);
}
}
khdo/src/main/java/com/bootdo/common/utils/ExcelUtilTest.java
0 → 100644
View file @
b37012c
package
com
.
bootdo
.
common
.
utils
;
import
java.io.FileInputStream
;
import
java.io.FileNotFoundException
;
import
java.io.InputStream
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.HashMap
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
import
org.springframework.util.ObjectUtils
;
import
org.springframework.util.StringUtils
;
public
class
ExcelUtilTest
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
InputStream
in
=
new
FileInputStream
(
"d://12348.xls"
);
Map
<
String
,
String
>
fieldd
=
new
HashMap
<
String
,
String
>();
fieldd
.
put
(
"ids"
,
"ids"
);
fieldd
.
put
(
"titles"
,
"titles"
);
fieldd
.
put
(
"answers"
,
"answers"
);
List
<
HzdyDO
>
resultList
=
new
ArrayList
<
HzdyDO
>();
resultList
=
ExeclUtil
.
ExecltoList
(
in
,
HzdyDO
.
class
,
fieldd
);
List
<
Integer
>
idLength
=
new
ArrayList
<
Integer
>();
List
<
Integer
>
titleLength
=
new
ArrayList
<
Integer
>();
List
<
Integer
>
answerLength
=
new
ArrayList
<
Integer
>();
for
(
HzdyDO
hzdyDO:
resultList
)
{
idLength
.
add
(
hzdyDO
.
getIds
().
split
(
"[@][|],"
).
length
);
titleLength
.
add
(
hzdyDO
.
getTitles
().
split
(
"[@][|],"
).
length
);
answerLength
.
add
(
hzdyDO
.
getAnswers
().
split
(
"[@][|],"
).
length
);
}
//id与title对比
for
(
int
i
=
0
;
i
<
idLength
.
size
();
i
++)
{
if
(
idLength
.
get
(
i
).
intValue
()
!=
titleLength
.
get
(
i
).
intValue
())
{
System
.
out
.
println
(
"第"
+
i
+
1
+
"条数据的id与title长度不匹配"
);
break
;
}
if
(
idLength
.
get
(
i
).
intValue
()
!=
answerLength
.
get
(
i
).
intValue
())
{
System
.
out
.
println
(
"第"
+
i
+
1
+
"条数据的id与answer长度不匹配"
);
break
;
}
}
//对查询结果中的题目id,题目文本,用户答案进行拆分
List
<
Map
<
String
,
Object
>>
finalDataList
=
new
ArrayList
<
Map
<
String
,
Object
>>();
for
(
int
i
=
0
;
i
<
10
;
i
++)
{
Map
finalMap
=
new
HashMap
<
String
,
Object
>();
finalMap
.
put
(
"enterpriseName"
,
i
+
"a"
);
//乙方企业
finalMap
.
put
(
"projectName"
,
i
+
"b"
);
//项目名称
finalMap
.
put
(
"taskDt"
,
i
+
"c"
);
//任务月度
finalMap
.
put
(
"fullName"
,
i
+
"d"
);
//答题人姓名
finalMap
.
put
(
"phone"
,
i
+
"e"
);
//答题人手机号
finalMap
.
put
(
"createDt"
,
i
+
"f"
);
//答题时间
finalMap
.
put
(
"audit_status"
,
i
+
"g"
);
//状态
String
topicIds
=
String
.
valueOf
(
resultList
.
get
(
i
).
getIds
());
//用户答题的,题目id数组, 与问卷标准的id数组可能不匹配,但与用户答题的题目文本,题目答案数组是匹配的
topicIds
=
topicIds
.
substring
(
0
,
topicIds
.
length
()-
2
);
String
topicTitles
=
String
.
valueOf
(
resultList
.
get
(
i
).
getTitles
());
//用户答题的,题目文本数组
topicTitles
=
topicTitles
.
substring
(
0
,
topicTitles
.
length
()-
2
);
String
topicAnswers
=
String
.
valueOf
(
resultList
.
get
(
i
).
getAnswers
());
//用户答题的,题目答案数组
topicAnswers
=
topicAnswers
.
substring
(
0
,
topicAnswers
.
length
()-
2
);
List
<
String
>
topicIdList
=
new
ArrayList
<
String
>();
//当前问卷应该存在的题目id 问卷的标准id数组
String
[]
topicIdArr
=
topicIds
.
split
(
"[@][|],"
);
String
[]
topicTitleArr
=
topicTitles
.
split
(
"[@][|],"
);
String
[]
topicAnswerArr
=
topicAnswers
.
split
(
"[@][|],"
);
for
(
int
j
=
0
;
j
<
topicIdArr
.
length
;
j
++)
{
finalMap
.
put
(
topicIdArr
[
j
],
topicAnswerArr
[
j
]);
}
finalDataList
.
add
(
finalMap
);
}
//设置报表名字
String
fileName
=
"医学调研任务报表新"
;
//设置分页名称
String
sheetName
=
"医学调研任务记录新"
;
//设置报表1表头
String
[]
columns
=
{
"乙方企业"
,
"项目名称"
,
"任务月度"
,
"项目参与人"
,
"手机号"
,
"填写时间"
,
"状态"
};
//状态单独处理
String
statusRemark
=
"audit_status|1:审核中|2:审核通过|3:审核不通过|其他"
;
//设置报表从map中获取的key,必须与表头长度对应
String
[]
columnKeys
=
{
"enterpriseName"
,
"projectName"
,
"taskDt"
,
"fullName"
,
"phone"
,
"createDt"
,
statusRemark
};
//增加表头,增加key 表头为题目的title ,key为题目的id
List
<
String
>
columnArr
=
new
ArrayList
<
String
>(
Arrays
.
asList
(
columns
));
List
<
String
>
columnKeyArr
=
new
ArrayList
<
String
>(
Arrays
.
asList
(
columnKeys
));
String
[]
topicIdArr
=
resultList
.
get
(
0
).
getIds
().
split
(
"[@][|],"
);
String
[]
topicTitleArr
=
resultList
.
get
(
0
).
getTitles
().
split
(
"[@][|],"
);
for
(
int
j
=
0
;
j
<
topicIdArr
.
length
;
j
++)
{
columnArr
.
add
(
String
.
valueOf
(
topicTitleArr
[
j
]));
columnKeyArr
.
add
(
String
.
valueOf
(
topicIdArr
[
j
]));
}
String
[]
columnsV2
=
new
String
[
columnArr
.
size
()];
String
[]
columnKeysV2
=
new
String
[
columnKeyArr
.
size
()];
columnArr
.
toArray
(
columnsV2
);
columnKeyArr
.
toArray
(
columnKeysV2
);
//第一个excel表格
JxlExcelUtils
.
exportOwoSheetExcleFinal
(
null
,
fileName
,
finalDataList
,
sheetName
,
columnsV2
,
columnKeysV2
);
System
.
out
.
println
(
999
);
}
}
khdo/src/main/java/com/bootdo/common/utils/ExeclUtil.java
0 → 100644
View file @
b37012c
package
com
.
bootdo
.
common
.
utils
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.lang.reflect.Field
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Date
;
import
java.util.Iterator
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map.Entry
;
import
org.apache.poi.hssf.usermodel.HSSFCell
;
import
org.apache.poi.hssf.usermodel.HSSFRow
;
import
org.apache.poi.hssf.usermodel.HSSFSheet
;
import
org.apache.poi.hssf.usermodel.HSSFWorkbook
;
public
class
ExeclUtil
{
static
int
sheetsize
=
5000
;
/**
* @author Lyy
* @param data
* 导入到excel中的数据
* @param out
* 数据写入的文件
* @param fields
* 需要注意的是这个方法中的map中:每一列对应的实体类的英文名为键,excel表格中每一列名为值
* @throws Exception
*/
public
static
<
T
>
void
ListtoExecl
(
List
<
T
>
data
,
OutputStream
out
,
Map
<
String
,
String
>
fields
)
throws
Exception
{
HSSFWorkbook
workbook
=
new
HSSFWorkbook
();
// 如果导入数据为空,则抛出异常。
if
(
data
==
null
||
data
.
size
()
==
0
)
{
workbook
.
close
();
throw
new
Exception
(
"导入的数据为空"
);
}
// 根据data计算有多少页sheet
int
pages
=
data
.
size
()
/
sheetsize
;
if
(
data
.
size
()
%
sheetsize
>
0
)
{
pages
+=
1
;
}
// 提取表格的字段名(英文字段名是为了对照中文字段名的)
String
[]
egtitles
=
new
String
[
fields
.
size
()];
String
[]
cntitles
=
new
String
[
fields
.
size
()];
Iterator
<
String
>
it
=
fields
.
keySet
().
iterator
();
int
count
=
0
;
while
(
it
.
hasNext
())
{
String
egtitle
=
(
String
)
it
.
next
();
String
cntitle
=
fields
.
get
(
egtitle
);
egtitles
[
count
]
=
egtitle
;
cntitles
[
count
]
=
cntitle
;
count
++;
}
// 添加数据
for
(
int
i
=
0
;
i
<
pages
;
i
++)
{
int
rownum
=
0
;
// 计算每页的起始数据和结束数据
int
startIndex
=
i
*
sheetsize
;
int
endIndex
=
(
i
+
1
)
*
sheetsize
-
1
>
data
.
size
()
?
data
.
size
()
:
(
i
+
1
)
*
sheetsize
-
1
;
// 创建每页,并创建第一行
HSSFSheet
sheet
=
workbook
.
createSheet
();
HSSFRow
row
=
sheet
.
createRow
(
rownum
);
// 在每页sheet的第一行中,添加字段名
for
(
int
f
=
0
;
f
<
cntitles
.
length
;
f
++)
{
HSSFCell
cell
=
row
.
createCell
(
f
);
cell
.
setCellValue
(
cntitles
[
f
]);
}
rownum
++;
// 将数据添加进表格
for
(
int
j
=
startIndex
;
j
<
endIndex
;
j
++)
{
row
=
sheet
.
createRow
(
rownum
);
T
item
=
data
.
get
(
j
);
for
(
int
h
=
0
;
h
<
cntitles
.
length
;
h
++)
{
Field
fd
=
item
.
getClass
().
getDeclaredField
(
egtitles
[
h
]);
fd
.
setAccessible
(
true
);
Object
o
=
fd
.
get
(
item
);
String
value
=
o
==
null
?
""
:
o
.
toString
();
HSSFCell
cell
=
row
.
createCell
(
h
);
cell
.
setCellValue
(
value
);
}
rownum
++;
}
}
// 将创建好的数据写入输出流
workbook
.
write
(
out
);
// 关闭workbook
workbook
.
close
();
}
/**
* @author Lyy
* @param entityClass excel中每一行数据的实体类
* @param in excel文件
* @param fields 字段名字
* 需要注意的是这个方法中的map中:
* excel表格中每一列名为键,每一列对应的实体类的英文名为值
* @throws Exception
*/
public
static
<
T
>
List
<
T
>
ExecltoList
(
InputStream
in
,
Class
<
T
>
entityClass
,
Map
<
String
,
String
>
fields
)
throws
Exception
{
List
<
T
>
resultList
=
new
ArrayList
<
T
>();
HSSFWorkbook
workbook
=
new
HSSFWorkbook
(
in
);
// excel中字段的中英文名字数组
String
[]
egtitles
=
new
String
[
fields
.
size
()];
String
[]
cntitles
=
new
String
[
fields
.
size
()];
Iterator
<
String
>
it
=
fields
.
keySet
().
iterator
();
int
count
=
0
;
while
(
it
.
hasNext
())
{
String
cntitle
=
(
String
)
it
.
next
();
String
egtitle
=
fields
.
get
(
cntitle
);
egtitles
[
count
]
=
egtitle
;
cntitles
[
count
]
=
cntitle
;
count
++;
}
// 得到excel中sheet总数
int
sheetcount
=
workbook
.
getNumberOfSheets
();
if
(
sheetcount
==
0
)
{
workbook
.
close
();
throw
new
Exception
(
"Excel文件中没有任何数据"
);
}
// 数据的导出
for
(
int
i
=
0
;
i
<
sheetcount
;
i
++)
{
HSSFSheet
sheet
=
workbook
.
getSheetAt
(
i
);
if
(
sheet
==
null
)
{
continue
;
}
// 每页中的第一行为标题行,对标题行的特殊处理
HSSFRow
firstRow
=
sheet
.
getRow
(
0
);
int
celllength
=
firstRow
.
getLastCellNum
();
String
[]
excelFieldNames
=
new
String
[
celllength
];
LinkedHashMap
<
String
,
Integer
>
colMap
=
new
LinkedHashMap
<
String
,
Integer
>();
// 获取Excel中的列名
for
(
int
f
=
0
;
f
<
celllength
;
f
++)
{
HSSFCell
cell
=
firstRow
.
getCell
(
f
);
excelFieldNames
[
f
]
=
cell
.
getStringCellValue
().
trim
();
// 将列名和列号放入Map中,这样通过列名就可以拿到列号
for
(
int
g
=
0
;
g
<
excelFieldNames
.
length
;
g
++)
{
colMap
.
put
(
excelFieldNames
[
g
],
g
);
}
}
// 由于数组是根据长度创建的,所以值是空值,这里对列名map做了去空键的处理
colMap
.
remove
(
null
);
// 判断需要的字段在Excel中是否都存在
// 需要注意的是这个方法中的map中:中文名为键,英文名为值
boolean
isExist
=
true
;
List
<
String
>
excelFieldList
=
Arrays
.
asList
(
excelFieldNames
);
for
(
String
cnName
:
fields
.
keySet
())
{
if
(!
excelFieldList
.
contains
(
cnName
))
{
isExist
=
false
;
break
;
}
}
// 如果有列名不存在,则抛出异常,提示错误
if
(!
isExist
)
{
workbook
.
close
();
throw
new
Exception
(
"Excel中缺少必要的字段,或字段名称有误"
);
}
// 将sheet转换为list
for
(
int
j
=
1
;
j
<=
sheet
.
getLastRowNum
();
j
++)
{
HSSFRow
row
=
sheet
.
getRow
(
j
);
// 根据泛型创建实体类
T
entity
=
entityClass
.
newInstance
();
// 给对象中的字段赋值
for
(
Entry
<
String
,
String
>
entry
:
fields
.
entrySet
())
{
// 获取中文字段名
String
cnNormalName
=
entry
.
getKey
();
// 获取英文字段名
String
enNormalName
=
entry
.
getValue
();
// 根据中文字段名获取列号
int
col
=
colMap
.
get
(
cnNormalName
);
// 获取当前单元格中的内容
String
content
=
row
.
getCell
(
col
).
toString
().
trim
();
// 给对象赋值
setFieldValueByName
(
enNormalName
,
content
,
entity
);
}
resultList
.
add
(
entity
);
}
}
workbook
.
close
();
return
resultList
;
}
/**
* @MethodName : setFieldValueByName
* @Description : 根据字段名给对象的字段赋值
* @param fieldName
* 字段名
* @param fieldValue
* 字段值
* @param o
* 对象
*/
private
static
void
setFieldValueByName
(
String
fieldName
,
Object
fieldValue
,
Object
o
)
throws
Exception
{
Field
field
=
getFieldByName
(
fieldName
,
o
.
getClass
());
if
(
field
!=
null
)
{
field
.
setAccessible
(
true
);
// 获取字段类型
Class
<?>
fieldType
=
field
.
getType
();
// 根据字段类型给字段赋值
if
(
String
.
class
==
fieldType
)
{
field
.
set
(
o
,
String
.
valueOf
(
fieldValue
));
}
else
if
((
Integer
.
TYPE
==
fieldType
)
||
(
Integer
.
class
==
fieldType
))
{
field
.
set
(
o
,
Integer
.
parseInt
(
fieldValue
.
toString
()));
}
else
if
((
Long
.
TYPE
==
fieldType
)
||
(
Long
.
class
==
fieldType
))
{
field
.
set
(
o
,
Long
.
valueOf
(
fieldValue
.
toString
()));
}
else
if
((
Float
.
TYPE
==
fieldType
)
||
(
Float
.
class
==
fieldType
))
{
field
.
set
(
o
,
Float
.
valueOf
(
fieldValue
.
toString
()));
}
else
if
((
Short
.
TYPE
==
fieldType
)
||
(
Short
.
class
==
fieldType
))
{
field
.
set
(
o
,
Short
.
valueOf
(
fieldValue
.
toString
()));
}
else
if
((
Double
.
TYPE
==
fieldType
)
||
(
Double
.
class
==
fieldType
))
{
field
.
set
(
o
,
Double
.
valueOf
(
fieldValue
.
toString
()));
}
else
if
(
Character
.
TYPE
==
fieldType
)
{
if
((
fieldValue
!=
null
)
&&
(
fieldValue
.
toString
().
length
()
>
0
))
{
field
.
set
(
o
,
Character
.
valueOf
(
fieldValue
.
toString
().
charAt
(
0
)));
}
}
else
if
(
Date
.
class
==
fieldType
)
{
field
.
set
(
o
,
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
)
.
parse
(
fieldValue
.
toString
()));
}
else
{
field
.
set
(
o
,
fieldValue
);
}
}
else
{
throw
new
Exception
(
o
.
getClass
().
getSimpleName
()
+
"类不存在字段名 "
+
fieldName
);
}
}
/**
* @MethodName : getFieldByName
* @Description : 根据字段名获取字段
* @param fieldName
* 字段名
* @param clazz
* 包含该字段的类
* @return 字段
*/
private
static
Field
getFieldByName
(
String
fieldName
,
Class
<?>
clazz
)
{
// 拿到本类的所有字段
Field
[]
selfFields
=
clazz
.
getDeclaredFields
();
// 如果本类中存在该字段,则返回
for
(
Field
field
:
selfFields
)
{
if
(
field
.
getName
().
equals
(
fieldName
))
{
return
field
;
}
}
// 否则,查看父类中是否存在此字段,如果有则返回
Class
<?>
superClazz
=
clazz
.
getSuperclass
();
if
(
superClazz
!=
null
&&
superClazz
!=
Object
.
class
)
{
return
getFieldByName
(
fieldName
,
superClazz
);
}
// 如果本类和父类都没有,则返回空
return
null
;
}
}
khdo/src/main/java/com/bootdo/common/utils/HzdyDO.java
0 → 100644
View file @
b37012c
package
com
.
bootdo
.
common
.
utils
;
public
class
HzdyDO
{
String
ids
;
String
titles
;
String
answers
;
public
String
getIds
()
{
return
ids
;
}
public
void
setIds
(
String
ids
)
{
this
.
ids
=
ids
;
}
public
String
getTitles
()
{
return
titles
;
}
public
void
setTitles
(
String
titles
)
{
this
.
titles
=
titles
;
}
public
String
getAnswers
()
{
return
answers
;
}
public
void
setAnswers
(
String
answers
)
{
this
.
answers
=
answers
;
}
}
khdo/src/main/java/com/bootdo/common/utils/JxlExcelUtils.java
0 → 100644
View file @
b37012c
package
com
.
bootdo
.
common
.
utils
;
/**
* Created with IntelliJ IDEA.
* User: GRAND-CQU-RD001
* Date: 14-5-8
* Time: 上午10:31
* To change this template use File | Settings | File Templates.
*/
import
java.io.OutputStream
;
import
java.io.UnsupportedEncodingException
;
import
java.util.ArrayList
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
import
javax.servlet.http.HttpServletResponse
;
import
org.springframework.util.StringUtils
;
import
jxl.CellView
;
import
jxl.SheetSettings
;
import
jxl.Workbook
;
import
jxl.format.Alignment
;
import
jxl.format.Colour
;
import
jxl.format.VerticalAlignment
;
import
jxl.write.Label
;
import
jxl.write.WritableCellFormat
;
import
jxl.write.WritableFont
;
import
jxl.write.WritableSheet
;
import
jxl.write.WritableWorkbook
;
/**
* jxl导出excel
* @author jamboree
* @date 2013-11-28
*/
public
class
JxlExcelUtils
{
/**--------------exportExcel2
* @author
* @param objData1 导出内容数组
* @param sheetName1 导出工作表的名称
* @param columns1 导出Excel的表头数组
* @return
*/
public
static
int
exportExcel2
(
HttpServletResponse
response
,
List
<
Map
<
String
,
Object
>>
objData1
,
String
sheetName1
,
List
<
String
>
columns1
,
List
<
Map
<
String
,
Object
>>
objData2
,
String
sheetName2
,
List
<
String
>
columns2
)
{
int
flag
=
0
;
//声明工作簿jxl.write.WritableWorkbook
WritableWorkbook
wwb
;
try
{
//根据传进来的file对象创建可写入的Excel工作薄
OutputStream
os
=
response
.
getOutputStream
();
wwb
=
Workbook
.
createWorkbook
(
os
);
/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。
* createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet
ws1
=
wwb
.
createSheet
(
sheetName1
,
0
);
WritableSheet
ws2
=
wwb
.
createSheet
(
sheetName2
,
1
);
SheetSettings
ss1
=
ws1
.
getSettings
();
ss1
.
setVerticalFreeze
(
1
);
//冻结表头
SheetSettings
ss2
=
ws2
.
getSettings
();
ss2
.
setVerticalFreeze
(
1
);
//冻结表头
CellView
cellView
=
new
CellView
();
cellView
.
setAutosize
(
true
);
//设置自动大小
//创建单元格样式
WritableFont
font1
=
new
WritableFont
(
WritableFont
.
createFont
(
"微软雅黑"
),
10
,
WritableFont
.
BOLD
);
WritableFont
font2
=
new
WritableFont
(
WritableFont
.
createFont
(
"微软雅黑"
),
9
,
WritableFont
.
NO_BOLD
);
WritableCellFormat
wcf1
=
new
WritableCellFormat
(
font1
);
WritableCellFormat
wcf2
=
new
WritableCellFormat
(
font2
);
//设置样式,字体
//背景颜色
wcf1
.
setAlignment
(
Alignment
.
CENTRE
);
//平行居中
wcf1
.
setVerticalAlignment
(
VerticalAlignment
.
CENTRE
);
//垂直居中
wcf1
.
setBackground
(
Colour
.
GRAY_25
);
wcf2
.
setAlignment
(
Alignment
.
CENTRE
);
//平行居中
wcf2
.
setVerticalAlignment
(
VerticalAlignment
.
CENTRE
);
//垂直居中
// wcf2.setBackground(Colour.LIGHT_ORANGE);
//判断一下表头数组是否有数据 写入sheet1数据
if
(
columns1
!=
null
&&
columns1
.
size
()
>
0
)
{
//循环写入表头
for
(
int
i
=
0
;
i
<
columns1
.
size
();
i
++)
{
/*
* 添加单元格(Cell)内容addCell()
* 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型
* 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
* Label(i, 0, columns[i], wcf)
* 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
//根据内容自动设置列宽
ws1
.
setColumnView
(
i
,
new
String
(
"空格"
+
columns1
.
get
(
i
)+
"空格"
).
length
());
ws1
.
addCell
(
new
Label
(
i
,
0
,
columns1
.
get
(
i
),
wcf1
));
}
//判断表中是否有数据
if
(
objData1
!=
null
&&
objData1
.
size
()
>
0
)
{
//循环写入表中数据
for
(
int
i
=
0
;
i
<
objData1
.
size
();
i
++)
{
//转换成map集合{activyName:测试功能,count:2}
Map
<
String
,
Object
>
map
=
(
Map
<
String
,
Object
>)
objData1
.
get
(
i
);
//循环输出map中的子集:既列值
int
j
=
0
;
for
(
Object
o:
map
.
keySet
()){
//ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
//根据内容自动设置列宽
int
columnSize
=
new
String
(
"空格"
+
map
.
get
(
o
)+
"空格"
).
length
()<
8
?
8
:
new
String
(
"空格"
+
map
.
get
(
o
)+
"空格"
).
length
();
ws1
.
setColumnView
(
j
,
columnSize
);
ws1
.
addCell
(
new
Label
(
j
,
i
+
1
,(
String
.
valueOf
(
map
.
get
(
o
))==
null
||
"null"
.
equals
(
String
.
valueOf
(
map
.
get
(
o
))))?
"--"
:
String
.
valueOf
(
map
.
get
(
o
)),
wcf2
));
j
++;
}
}
}
else
{
flag
=
-
1
;
}
}
//判断一下表头数组是否有数据 写入sheet2数据
if
(
columns2
!=
null
&&
columns2
.
size
()
>
0
)
{
//循环写入表头
for
(
int
i
=
0
;
i
<
columns2
.
size
();
i
++)
{
/*
* 添加单元格(Cell)内容addCell()
* 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型
* 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
* Label(i, 0, columns[i], wcf)
* 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
//根据内容自动设置列宽
ws2
.
setColumnView
(
i
,
new
String
(
"空格"
+
columns2
.
get
(
i
)+
"空格"
).
length
());
ws2
.
addCell
(
new
Label
(
i
,
0
,
columns2
.
get
(
i
),
wcf1
));
}
//判断表中是否有数据
if
(
objData2
!=
null
&&
objData2
.
size
()
>
0
)
{
//循环写入表中数据
for
(
int
i
=
0
;
i
<
objData2
.
size
();
i
++)
{
//转换成map集合{activyName:测试功能,count:2}
Map
<
String
,
Object
>
map
=
(
Map
<
String
,
Object
>)
objData2
.
get
(
i
);
//循环输出map中的子集:既列值
int
j
=
0
;
for
(
Object
o:
map
.
keySet
()){
//ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
//根据内容自动设置列宽
int
columnSize
=
new
String
(
"空格"
+
map
.
get
(
o
)+
"空格"
).
length
()<
8
?
8
:
new
String
(
"空格"
+
map
.
get
(
o
)+
"空格"
).
length
();
ws2
.
setColumnView
(
j
,
columnSize
);
ws2
.
addCell
(
new
Label
(
j
,
i
+
1
,
String
.
valueOf
(
map
.
get
(
o
)),
wcf2
));
j
++;
}
}
}
else
{
flag
=
-
1
;
}
}
//写入Exel工作表
wwb
.
write
();
//关闭Excel工作薄对象
wwb
.
close
();
//关闭流
os
.
flush
();
os
.
close
();
os
=
null
;
}
catch
(
IllegalStateException
e
)
{
System
.
err
.
println
(
e
.
getMessage
());
}
catch
(
Exception
ex
)
{
flag
=
0
;
ex
.
printStackTrace
();
}
return
flag
;
}
/**
* 下载excel------2
* @author
* @param response
* @param filename 文件名 ,如:20110808.xls
* @param listData1 数据源
* @param sheetName1 表头名称
* @param columns1 列名称集合,如:{物品名称,数量,单价}
*/
public
static
void
exportTwoSheetExcle
(
HttpServletResponse
response
,
String
filename
,
List
<
Map
<
String
,
Object
>>
listData1
,
String
sheetName1
,
List
<
String
>
columns1
,
List
<
Map
<
String
,
Object
>>
listData2
,
String
sheetName2
,
List
<
String
>
columns2
)
{
//调用上面的方法、生成Excel文件
response
.
setContentType
(
"application/vnd.ms-excel"
);
//response.setHeader("Content-Disposition", "attachment;filename="+filename);
try
{
response
.
setHeader
(
"Content-Disposition"
,
"attachment;filename="
+
new
String
(
filename
.
getBytes
(
"gb2312"
),
"ISO8859-1"
)
+
".xls"
);
exportExcel2
(
response
,
listData1
,
sheetName1
,
columns1
,
listData2
,
sheetName2
,
columns2
);
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
}
/**
* 下载excel------1
* @author
* @param response
* @param filename 文件名 ,如:20110808.xls
* @param listData1 数据源
* @param sheetName1 表头名称
* @param columns1 列名称集合,如:{物品名称,数量,单价}
*/
public
static
void
exportOwoSheetExcle
(
HttpServletResponse
response
,
String
filename
,
List
<
Map
<
String
,
Object
>>
listData1
,
String
sheetName1
,
List
<
String
>
columns1
)
{
//调用上面的方法、生成Excel文件
response
.
setContentType
(
"application/vnd.ms-excel"
);
//response.setHeader("Content-Disposition", "attachment;filename="+filename);
try
{
response
.
setHeader
(
"Content-Disposition"
,
"attachment;filename="
+
new
String
(
filename
.
getBytes
(
"gb2312"
),
"ISO8859-1"
)
+
".xls"
);
exportExcel1
(
response
,
listData1
,
sheetName1
,
columns1
);
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
}
/**
*
* @param response
* @param filename 文件名
* @param listData 数据
* @param sheetName1 表格名
* @param columns 列数组
* @param columnKeys 列关键字数组
*
* 如下翻译处理,
* String statusRemark = "authStatus|1:审核中|2:审核通过|3:审核不通过|其他";
*
*/
public
static
void
exportOwoSheetExcleFinal
(
HttpServletResponse
response
,
String
filename
,
List
<
Map
<
String
,
Object
>>
listData
,
String
sheetName
,
String
[]
columns
,
String
[]
columnKeys
){
try
{
List
<
String
>
columnNames
=
new
ArrayList
<
String
>();
for
(
String
column:
columns
)
{
columnNames
.
add
(
column
);
}
List
<
Map
<
String
,
Object
>>
listDataFinal
=
new
ArrayList
<
Map
<
String
,
Object
>>();
for
(
int
i
=
0
;
i
<
listData
.
size
();
i
++)
{
Map
<
String
,
Object
>
stringObjectMap
=
(
Map
<
String
,
Object
>)
listData
.
get
(
i
);
Map
<
String
,
Object
>
map1
=
new
LinkedHashMap
<
String
,
Object
>();
for
(
int
j
=
0
;
j
<
columnNames
.
size
();
j
++)
{
if
(!
StringUtils
.
isEmpty
(
columnKeys
[
j
])
&&
columnKeys
[
j
].
contains
(
"|"
))
{
//有需要转换 翻译的列值
String
[]
colKeyStr
=
columnKeys
[
j
].
split
(
"[|]"
);
//第一个位置为key,最后一个为缺省值,中间为需要翻译的值
String
colVal
=
String
.
valueOf
(
stringObjectMap
.
get
(
colKeyStr
[
0
]));
String
colValFinal
=
null
;
for
(
int
k
=
1
;
k
<
colKeyStr
.
length
-
1
;
k
++)
{
if
(
colKeyStr
[
k
].
split
(
":"
)[
0
].
equals
(
colVal
)){
colValFinal
=
colKeyStr
[
k
].
split
(
":"
)[
1
];
}
}
if
(
StringUtils
.
isEmpty
(
colValFinal
))
{
//如果未找到翻译值,就取最后一个
colValFinal
=
colKeyStr
[
colKeyStr
.
length
-
1
];
}
map1
.
put
(
columnNames
.
get
(
j
),
colValFinal
);
continue
;
}
map1
.
put
(
columnNames
.
get
(
j
),
stringObjectMap
.
get
(
columnKeys
[
j
]));
}
listDataFinal
.
add
(
map1
);
}
JxlExcelUtils
.
exportOwoSheetExcle
(
response
,
filename
,
listDataFinal
,
sheetName
,
columnNames
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
throw
e
;
}
}
/**-------exportExcel1
* @author
* @param objData1 导出内容数组
* @param sheetName1 导出工作表的名称
* @param columns1 导出Excel的表头数组
* @return
*/
public
static
int
exportExcel1
(
HttpServletResponse
response
,
List
<
Map
<
String
,
Object
>>
objData
,
String
sheetName
,
List
<
String
>
columns
)
{
int
flag
=
0
;
//声明工作簿jxl.write.WritableWorkbook
WritableWorkbook
wwb
;
try
{
//根据传进来的file对象创建可写入的Excel工作薄
OutputStream
os
=
response
.
getOutputStream
();
wwb
=
Workbook
.
createWorkbook
(
os
);
/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。
* createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet
ws
=
wwb
.
createSheet
(
sheetName
,
0
);
SheetSettings
ss
=
ws
.
getSettings
();
ss
.
setVerticalFreeze
(
1
);
//冻结表头
CellView
cellView
=
new
CellView
();
cellView
.
setAutosize
(
true
);
//设置自动大小
//创建单元格样式
WritableFont
font1
=
new
WritableFont
(
WritableFont
.
createFont
(
"微软雅黑"
),
10
,
WritableFont
.
BOLD
);
WritableFont
font2
=
new
WritableFont
(
WritableFont
.
createFont
(
"微软雅黑"
),
9
,
WritableFont
.
NO_BOLD
);
WritableCellFormat
wcf1
=
new
WritableCellFormat
(
font1
);
WritableCellFormat
wcf2
=
new
WritableCellFormat
(
font2
);
//设置样式,字体
//背景颜色
wcf1
.
setAlignment
(
Alignment
.
CENTRE
);
//平行居中
wcf1
.
setVerticalAlignment
(
VerticalAlignment
.
CENTRE
);
//垂直居中
wcf1
.
setBackground
(
Colour
.
GRAY_25
);
wcf2
.
setAlignment
(
Alignment
.
CENTRE
);
//平行居中
wcf2
.
setVerticalAlignment
(
VerticalAlignment
.
CENTRE
);
//垂直居中
// wcf2.setBackground(Colour.LIGHT_ORANGE);
//判断一下表头数组是否有数据
if
(
columns
!=
null
&&
columns
.
size
()
>
0
)
{
//循环写入表头
for
(
int
i
=
0
;
i
<
columns
.
size
();
i
++)
{
/*
* 添加单元格(Cell)内容addCell()
* 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型
* 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
* Label(i, 0, columns[i], wcf)
* 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
//根据内容自动设置列宽
ws
.
setColumnView
(
i
,
new
String
(
"空格"
+
columns
.
get
(
i
)+
"空格"
).
length
());
ws
.
addCell
(
new
Label
(
i
,
0
,
columns
.
get
(
i
),
wcf1
));
}
//判断表中是否有数据
if
(
objData
!=
null
&&
objData
.
size
()
>
0
)
{
//循环写入表中数据
for
(
int
i
=
0
;
i
<
objData
.
size
();
i
++)
{
//转换成map集合{activyName:测试功能,count:2}
Map
<
String
,
Object
>
map
=
(
Map
<
String
,
Object
>)
objData
.
get
(
i
);
//循环输出map中的子集:既列值
int
j
=
0
;
for
(
Object
o:
map
.
keySet
()){
//ps:因为要“”通用”“导出功能,所以这里循环的时候不是get("Name"),而是通过map.get(o)
//根据内容自动设置列宽
int
columnSize
=
new
String
(
"空格"
+
map
.
get
(
o
)+
"空格"
).
length
()<
8
?
8
:
new
String
(
"空格"
+
map
.
get
(
o
)+
"空格"
).
length
();
ws
.
setColumnView
(
j
,
columnSize
);
ws
.
addCell
(
new
Label
(
j
,
i
+
1
,(
String
.
valueOf
(
map
.
get
(
o
))==
null
||
"null"
.
equals
(
String
.
valueOf
(
map
.
get
(
o
))))?
"--"
:
String
.
valueOf
(
map
.
get
(
o
)),
wcf2
));
j
++;
}
}
}
else
{
flag
=
-
1
;
}
//写入Exel工作表
wwb
.
write
();
//关闭Excel工作薄对象
wwb
.
close
();
//关闭流
os
.
flush
();
os
.
close
();
os
=
null
;
}
}
catch
(
IllegalStateException
e
)
{
System
.
err
.
println
(
e
.
getMessage
());
}
catch
(
Exception
ex
)
{
flag
=
0
;
ex
.
printStackTrace
();
}
return
flag
;
}
}
Write
Preview
Markdown
is supported
Attach a file
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 post a comment