Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
customer-service
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
QG
customer-service
Commits
99afdf82
Commit
99afdf82
authored
Aug 17, 2020
by
suntao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
小慢工单2
parent
837c9519
Changes
13
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
1020 additions
and
1 deletion
+1020
-1
pom.xml
pom.xml
+35
-1
WorkOrder.java
src/main/java/cn/quantgroup/customer/entity/WorkOrder.java
+98
-0
WorkOrderStatus.java
.../quantgroup/customer/model/workorder/WorkOrderStatus.java
+30
-0
WorkOrderVO.java
...a/cn/quantgroup/customer/model/workorder/WorkOrderVO.java
+64
-0
WorlOrderPriority.java
...uantgroup/customer/model/workorder/WorlOrderPriority.java
+33
-0
WorkOrderRepo.java
src/main/java/cn/quantgroup/customer/repo/WorkOrderRepo.java
+17
-0
WorkOrderRest.java
src/main/java/cn/quantgroup/customer/rest/WorkOrderRest.java
+57
-0
IWorkOrderService.java
...ava/cn/quantgroup/customer/service/IWorkOrderService.java
+21
-0
WorkOrderServiceImpl.java
...uantgroup/customer/service/impl/WorkOrderServiceImpl.java
+130
-0
CsvReader.java
src/main/java/cn/quantgroup/customer/util/poi/CsvReader.java
+72
-0
Reader.java
src/main/java/cn/quantgroup/customer/util/poi/Reader.java
+22
-0
ReaderTest.java
...main/java/cn/quantgroup/customer/util/poi/ReaderTest.java
+61
-0
XlsxReader.java
...main/java/cn/quantgroup/customer/util/poi/XlsxReader.java
+380
-0
No files found.
pom.xml
View file @
99afdf82
...
...
@@ -220,6 +220,40 @@
<groupId>
cn.quantgroup
</groupId>
<artifactId>
idgenerator-spring-boot-starter
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi
</artifactId>
<version>
3.15
</version>
</dependency>
<dependency>
<groupId>
org.apache.poi
</groupId>
<artifactId>
poi-ooxml
</artifactId>
<version>
3.15
</version>
</dependency>
<dependency>
<groupId>
xerces
</groupId>
<artifactId>
xercesImpl
</artifactId>
<version>
2.11.0
</version>
</dependency>
<dependency>
<groupId>
com.opencsv
</groupId>
<artifactId>
opencsv
</artifactId>
<version>
5.1
</version>
</dependency>
<dependency>
<groupId>
junit
</groupId>
<artifactId>
junit
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
</dependencies>
</project>
src/main/java/cn/quantgroup/customer/entity/WorkOrder.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
entity
;
import
cn.quantgroup.customer.model.workorder.WorkOrderStatus
;
import
cn.quantgroup.customer.model.workorder.WorlOrderPriority
;
import
lombok.*
;
import
javax.persistence.*
;
import
java.sql.Timestamp
;
/**
* @author yangjun
* @Date 2020/4/13 17:37
* @Desc
* @Update
*/
@Entity
@Table
(
name
=
"work_order"
)
@ToString
@Builder
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public
class
WorkOrder
{
@Id
@Column
(
name
=
"id"
)
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Long
id
;
@Column
(
name
=
"work_order_id"
)
private
Long
workOrderId
;
@Column
(
name
=
"user_name"
)
private
String
userName
;
@Column
(
name
=
"phone"
)
private
String
phone
;
@Column
(
name
=
"subject"
)
private
String
subject
;
@Column
(
name
=
"from_channel"
)
private
String
from
;
@Column
(
name
=
"type1"
)
private
String
type1
;
@Column
(
name
=
"type2"
)
private
String
type2
;
@Column
(
name
=
"type3"
)
private
String
type3
;
/**
* 优先级
*/
@Column
(
name
=
"priority"
)
private
WorlOrderPriority
priority
;
/**
* 状态
*/
@Column
(
name
=
"status"
)
private
WorkOrderStatus
status
;
@Column
(
name
=
"create_username"
)
private
String
createUsername
;
@Column
(
name
=
"op_username"
)
private
String
opUsername
;
/**
* 流转次数
*/
@Column
(
name
=
"duration_times"
)
private
Integer
durationTimes
;
/**
* 流转时长
*/
@Column
(
name
=
"duration"
)
private
Integer
duration
;
@Column
(
name
=
"created_at"
)
private
Timestamp
createdAt
;
@Column
(
name
=
"op_at"
)
private
Timestamp
opAt
;
@Column
(
name
=
"updated_at"
)
private
Timestamp
updatedAt
;
@Column
(
name
=
"remark"
)
private
String
remark
;
}
src/main/java/cn/quantgroup/customer/model/workorder/WorkOrderStatus.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
model
.
workorder
;
import
lombok.Getter
;
public
enum
WorkOrderStatus
{
CREATED
(
"创建"
),
WAIT
(
"等待"
),
DOING
(
"处理中"
),
COMPLETE
(
"完成"
),
RE_OPEN
(
"重启"
),
CLOSE
(
"关闭"
);
@Getter
private
String
desc
;
WorkOrderStatus
(
String
desc
)
{
this
.
desc
=
desc
;
}
public
static
WorkOrderStatus
getWorkOrderStatus
(
String
desc
)
{
for
(
WorkOrderStatus
status
:
WorkOrderStatus
.
values
())
{
if
(
status
.
getDesc
().
equals
(
desc
))
{
return
status
;
}
}
return
null
;
}
}
src/main/java/cn/quantgroup/customer/model/workorder/WorkOrderVO.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
model
.
workorder
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.sql.Timestamp
;
/**
* @description:
* @author:tao
* @create: 2020-08-13 17:07
*/
@Data
public
class
WorkOrderVO
implements
Serializable
{
private
String
workOrderId
;
private
String
userName
;
private
String
phone
;
private
String
subject
;
private
String
from
;
private
String
type1
;
private
String
type2
;
private
String
type3
;
/**
* 优先级
*/
private
String
priority
;
/**
* 状态
*/
private
String
status
;
private
String
createUsername
;
private
String
opUsername
;
/**
* 流转次数
*/
private
String
durationTimes
;
/**
* 流转时长
*/
private
String
duration
;
private
String
createdAt
;
private
String
opAt
;
private
String
updatedAt
;
private
String
remark
;
}
src/main/java/cn/quantgroup/customer/model/workorder/WorlOrderPriority.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
model
.
workorder
;
import
lombok.Getter
;
/**
* @description: 工单优先级
* @author:tao
* @create: 2020-08-14 15:40
*/
public
enum
WorlOrderPriority
{
UNDEFINED
(
"未知"
),
LOW
(
"低"
),
MIDDLE
(
"中"
),
HIGH
(
"高"
);
@Getter
private
String
desc
;
WorlOrderPriority
(
String
desc
)
{
this
.
desc
=
desc
;
}
public
static
WorlOrderPriority
getWorlOrderPriority
(
String
desc
)
{
for
(
WorlOrderPriority
priority
:
WorlOrderPriority
.
values
())
{
if
(
priority
.
getDesc
().
equals
(
desc
))
{
return
priority
;
}
}
return
null
;
}
}
src/main/java/cn/quantgroup/customer/repo/WorkOrderRepo.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
repo
;
import
cn.quantgroup.customer.entity.WorkOrder
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
import
org.springframework.data.jpa.repository.Query
;
import
java.util.List
;
public
interface
WorkOrderRepo
extends
JpaRepository
<
WorkOrder
,
Long
>
,
JpaSpecificationExecutor
<
WorkOrder
>
{
@Query
(
value
=
"select * from operate_log where loan_id =?1 and status = 1 ORDER BY created_at ASC"
,
nativeQuery
=
true
)
List
<
WorkOrder
>
findbss
(
Long
loanId
);
@Query
(
value
=
"select count(1) from operate_log where loan_id =?1 and status = 1"
,
nativeQuery
=
true
)
Long
findLogsCountsByLoanId
(
Long
loanId
);
}
src/main/java/cn/quantgroup/customer/rest/WorkOrderRest.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
rest
;
import
cn.quantgroup.customer.model.workorder.WorkOrderStatus
;
import
cn.quantgroup.customer.rest.vo.JsonResult
;
import
cn.quantgroup.customer.service.IWorkOrderService
;
import
cn.quantgroup.customer.util.poi.ReaderTest
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.exception.ExceptionUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.io.IOException
;
/**
* @description: 工单查询
* @Author:tao
* @create: 2020-08-13 15:57
*/
@Slf4j
@RestController
@RequestMapping
(
"workOrder"
)
public
class
WorkOrderRest
{
@Autowired
private
IWorkOrderService
workOrderService
;
@GetMapping
(
"queryPage"
)
public
JsonResult
queryPage
(
Integer
pageNumber
,
Integer
pageSize
,
String
phone
,
String
status
)
{
WorkOrderStatus
statusEnum
;
try
{
statusEnum
=
WorkOrderStatus
.
valueOf
(
status
);
}
catch
(
IllegalArgumentException
e
)
{
log
.
error
(
"[workOrderRest_queryPage]查询参数status错误,status={}, e={}"
,
status
,
ExceptionUtils
.
getStackTrace
(
e
));
return
JsonResult
.
buildErrorStateResult
(
"查询参数status错误"
);
}
return
workOrderService
.
queryWorkOrder
(
pageNumber
,
pageSize
,
phone
,
statusEnum
);
}
@GetMapping
(
"upload"
)
public
JsonResult
upload
()
throws
Exception
{
ReaderTest
readerTest
=
new
ReaderTest
();
readerTest
.
read
();
workOrderService
.
importData
(
readerTest
.
getList
());
return
JsonResult
.
buildSuccessResult
(
"success"
,
null
);
}
public
static
void
main
(
String
[]
args
)
throws
IOException
{
}
}
src/main/java/cn/quantgroup/customer/service/IWorkOrderService.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
service
;
import
cn.quantgroup.customer.model.workorder.WorkOrderStatus
;
import
cn.quantgroup.customer.model.workorder.WorkOrderVO
;
import
cn.quantgroup.customer.rest.vo.JsonResult
;
import
org.springframework.data.domain.Page
;
import
java.util.List
;
/**
* @description:
* @author:tao
* @create: 2020-08-14 15:23
*/
public
interface
IWorkOrderService
{
void
importData
(
List
<
WorkOrderVO
>
list
);
JsonResult
<
Page
<
WorkOrderVO
>>
queryWorkOrder
(
Integer
pageNumber
,
Integer
pageSize
,
String
phone
,
WorkOrderStatus
status
);
}
src/main/java/cn/quantgroup/customer/service/impl/WorkOrderServiceImpl.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
service
.
impl
;
import
cn.quantgroup.customer.entity.WorkOrder
;
import
cn.quantgroup.customer.model.workorder.WorkOrderVO
;
import
cn.quantgroup.customer.model.workorder.WorkOrderStatus
;
import
cn.quantgroup.customer.model.workorder.WorlOrderPriority
;
import
cn.quantgroup.customer.repo.WorkOrderRepo
;
import
cn.quantgroup.customer.rest.vo.JsonResult
;
import
cn.quantgroup.customer.service.IWorkOrderService
;
import
cn.quantgroup.customer.util.DateUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Page
;
import
org.springframework.data.domain.PageRequest
;
import
org.springframework.stereotype.Service
;
import
javax.persistence.criteria.Predicate
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
/**
* @description:
* @author:tao
* @create: 2020-08-14 15:24
*/
@Slf4j
@Service
public
class
WorkOrderServiceImpl
implements
IWorkOrderService
{
@Autowired
private
WorkOrderRepo
workOrderRepo
;
@Override
public
void
importData
(
List
<
WorkOrderVO
>
list
)
{
int
pageSize
=
10000
;
// 总页数
int
pages
=
list
.
size
()
/
pageSize
;
int
mo
=
list
.
size
()
%
pageSize
;
if
(
mo
>
0
)
{
pages
++;
}
for
(
int
currentPage
=
0
;
currentPage
<
pages
;
currentPage
++)
{
List
<
WorkOrder
>
workOrders
=
new
ArrayList
<>();
for
(
int
i
=
currentPage
*
pageSize
;
i
<
Math
.
min
(
list
.
size
(),
(
currentPage
+
1
)
*
pageSize
);
i
++)
{
// 0=> [0,10000)
// 1=> [10000,20000)
final
WorkOrderVO
woe
=
list
.
get
(
i
);
WorkOrder
workOrder
=
new
WorkOrder
();
workOrder
.
setWorkOrderId
(
Long
.
valueOf
(
woe
.
getWorkOrderId
()));
workOrder
.
setUserName
(
woe
.
getUserName
());
workOrder
.
setPhone
(
woe
.
getPhone
());
workOrder
.
setSubject
(
woe
.
getSubject
());
workOrder
.
setFrom
(
woe
.
getFrom
());
workOrder
.
setType1
(
woe
.
getType1
());
workOrder
.
setType2
(
woe
.
getType2
());
workOrder
.
setType3
(
woe
.
getType3
());
workOrder
.
setPriority
(
WorlOrderPriority
.
getWorlOrderPriority
(
woe
.
getPriority
()));
workOrder
.
setStatus
(
WorkOrderStatus
.
getWorkOrderStatus
(
woe
.
getStatus
()));
workOrder
.
setCreateUsername
(
woe
.
getCreateUsername
());
workOrder
.
setOpUsername
(
woe
.
getOpUsername
());
workOrder
.
setDurationTimes
(
Integer
.
valueOf
(
woe
.
getDurationTimes
()));
workOrder
.
setDuration
(
Integer
.
valueOf
(
woe
.
getDuration
()));
workOrder
.
setCreatedAt
(
DateUtil
.
stringToTimestamp
(
woe
.
getCreatedAt
()));
workOrder
.
setOpAt
(
DateUtil
.
stringToTimestamp
(
woe
.
getOpAt
()));
workOrder
.
setUpdatedAt
(
DateUtil
.
getCurrentTimestamp
());
workOrder
.
setRemark
(
woe
.
getRemark
());
workOrders
.
add
(
workOrder
);
}
workOrderRepo
.
save
(
workOrders
);
}
log
.
info
(
"导入完成"
);
}
@Override
public
JsonResult
<
Page
<
WorkOrderVO
>>
queryWorkOrder
(
Integer
pageNumber
,
Integer
pageSize
,
String
phone
,
WorkOrderStatus
status
)
{
Page
<
WorkOrder
>
page
=
workOrderRepo
.
findAll
((
root
,
criteriaQuery
,
criteriaBuilder
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
// 指定渠道号
if
(
Objects
.
nonNull
(
status
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"status"
),
status
.
ordinal
()));
}
if
(
StringUtils
.
isNotEmpty
(
phone
))
{
predicates
.
add
(
criteriaBuilder
.
equal
(
root
.
get
(
"phone"
),
phone
));
}
// 设置查询条件
criteriaQuery
.
where
(
criteriaBuilder
.
and
(
predicates
.
toArray
(
new
Predicate
[
predicates
.
size
()])));
// 指定排序
criteriaQuery
.
orderBy
(
criteriaBuilder
.
desc
(
root
.
get
(
"id"
)));
return
criteriaQuery
.
getRestriction
();
},
new
PageRequest
(
pageNumber
,
pageSize
));
Page
<
WorkOrderVO
>
map
=
page
.
map
(
it
->
{
WorkOrderVO
workOrderVO
=
new
WorkOrderVO
();
workOrderVO
.
setWorkOrderId
(
it
.
getWorkOrderId
()
+
""
);
workOrderVO
.
setUserName
(
it
.
getUserName
());
workOrderVO
.
setPhone
(
it
.
getPhone
());
workOrderVO
.
setSubject
(
it
.
getSubject
());
workOrderVO
.
setFrom
(
it
.
getFrom
());
workOrderVO
.
setType1
(
it
.
getType1
());
workOrderVO
.
setType2
(
it
.
getType2
());
workOrderVO
.
setType3
(
it
.
getType3
());
workOrderVO
.
setPriority
(
it
.
getPriority
().
getDesc
());
workOrderVO
.
setStatus
(
it
.
getStatus
().
getDesc
());
workOrderVO
.
setCreateUsername
(
it
.
getCreateUsername
());
workOrderVO
.
setOpUsername
(
it
.
getOpUsername
());
workOrderVO
.
setDurationTimes
(
it
.
getDurationTimes
()
+
""
);
workOrderVO
.
setDuration
(
it
.
getDuration
()
+
""
);
workOrderVO
.
setCreatedAt
(
it
.
getCreatedAt
()
==
null
?
""
:
DateUtil
.
format
(
it
.
getCreatedAt
(),
DateUtil
.
DATE_FORMAT_1
));
workOrderVO
.
setOpAt
(
it
.
getOpAt
()
==
null
?
""
:
DateUtil
.
format
(
it
.
getOpAt
(),
DateUtil
.
DATE_FORMAT_1
));
workOrderVO
.
setUpdatedAt
(
it
.
getUpdatedAt
()
==
null
?
""
:
DateUtil
.
format
(
it
.
getUpdatedAt
(),
DateUtil
.
DATE_FORMAT_1
));
workOrderVO
.
setRemark
(
it
.
getRemark
());
return
workOrderVO
;
});
if
(
map
!=
null
)
{
return
JsonResult
.
buildSuccessResult
(
"success"
,
map
);
}
else
{
return
JsonResult
.
buildErrorStateResult
(
"查询失败"
);
}
}
}
src/main/java/cn/quantgroup/customer/util/poi/CsvReader.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
util
.
poi
;
import
cn.quantgroup.customer.model.workorder.WorkOrderVO
;
import
cn.quantgroup.customer.util.JSONTools
;
import
com.opencsv.CSVReader
;
import
java.io.*
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @description:
* @author:tao
* @create: 2020-08-14 14:17
*/
public
class
CsvReader
{
public
static
void
main
(
String
[]
args
)
throws
IOException
{
try
{
DataInputStream
in
=
new
DataInputStream
(
new
FileInputStream
(
new
File
(
"/Users/simon/Downloads/2.csv"
)));
CSVReader
csvReader
=
new
CSVReader
(
new
InputStreamReader
(
in
,
"UTF-8"
));
String
[]
strs
;
// while ((strs = csvReader.readNext()) != null) {
// System.out.println(Arrays.deepToString(strs));
//}
List
<
WorkOrderVO
>
list
=
new
ArrayList
<>();
WorkOrderVO
workOrderVO
=
null
;
while
((
strs
=
csvReader
.
readNext
())
!=
null
)
{
System
.
out
.
println
(
JSONTools
.
serialize
(
strs
));
// workOrderExcel = new WorkOrderExcel();
// workOrderExcel.setWorkOrderId(strs[0]);
// workOrderExcel.setDurationTimes(strs[1]);
// workOrderExcel.setUserName(strs[2]);
// workOrderExcel.setPhone(strs[3]);
// workOrderExcel.setSubject(strs[4]);
// workOrderExcel.setFrom(strs[5]);
// workOrderExcel.setType1(strs[6]);
// workOrderExcel.setType2(strs[7]);
// workOrderExcel.setType3(strs[8]);
// workOrderExcel.setPriority(strs[9]);
// workOrderExcel.setCreateUsername(strs[10]);
// workOrderExcel.setCreatedAt(strs[11]);
// workOrderExcel.setOpUsername(strs[12]);
// workOrderExcel.setDuration(strs[13]);
// workOrderExcel.setStatus(strs[14]);
// workOrderExcel.setOpAt(strs[15]);
// workOrderExcel.setRemark(strs[16]);
// list.add(workOrderExcel);
}
// System.out.println(JSONTools.serialize(list.get(0)));
// System.out.println(JSONTools.serialize(list.get(1)));
// System.out.println(JSONTools.serialize(list.get(list.size() - 2)));
// System.out.println(JSONTools.serialize(list.get(list.size() - 1)));
csvReader
.
close
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
// List<String> list = FileUtils.readLines(new File("/Users/simon/Downloads/2.csv"));
//
// System.out.println(list.get(0));
// System.out.println(list.get(1));
// System.out.println(list.get(2));
// System.out.println(list.get(3));
// System.out.println(list.get(list.size() - 1));
// System.out.println(list.get(list.size() - 2));
}
}
src/main/java/cn/quantgroup/customer/util/poi/Reader.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
util
.
poi
;
import
java.util.List
;
/**
* @description:
* @author:tao
* @create: 2020-08-14 11:37
*/
public
interface
Reader
{
/**
* 数据放回接口
*
* @param filePath 文件路径
* @param sheetName sheet名称
* @param sheetIndex sheet序号
* @param curRow 行号
* @param cellList 一行的所有单元格字段
*/
void
read
(
String
filePath
,
String
sheetName
,
int
sheetIndex
,
int
curRow
,
List
<
String
>
cellList
);
}
src/main/java/cn/quantgroup/customer/util/poi/ReaderTest.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
util
.
poi
;
import
cn.quantgroup.customer.model.workorder.WorkOrderVO
;
import
cn.quantgroup.customer.util.JSONTools
;
import
lombok.Getter
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author y
* @create 2018-01-19 0:13
* @desc
**/
public
class
ReaderTest
implements
Reader
{
private
final
static
String
filePath
=
"/Users/simon/Downloads/1.xlsx"
;
// private final static String filePath = "/Users/simon/Downloads/work_order_created.xlsx";
private
WorkOrderVO
workOrderVO
=
null
;
@Getter
private
List
<
WorkOrderVO
>
list
=
new
ArrayList
<>();
public
void
read
()
throws
Exception
{
long
start
=
System
.
currentTimeMillis
();
XlsxReader
excelXlsxReader
=
new
XlsxReader
(
this
);
int
totalRows
=
excelXlsxReader
.
process
(
filePath
);
System
.
out
.
println
(
"总行数:"
+
totalRows
+
",耗时:"
+
(
System
.
currentTimeMillis
()
-
start
));
System
.
out
.
println
(
JSONTools
.
serialize
(
list
.
get
(
0
)));
System
.
out
.
println
(
JSONTools
.
serialize
(
list
.
get
(
list
.
size
()-
1
)));
}
@Override
public
void
read
(
String
filePath
,
String
sheetName
,
int
sheetIndex
,
int
curRow
,
List
<
String
>
cellList
)
{
workOrderVO
=
new
WorkOrderVO
();
workOrderVO
.
setWorkOrderId
(
cellList
.
get
(
0
));
workOrderVO
.
setDurationTimes
(
cellList
.
get
(
1
));
workOrderVO
.
setUserName
(
cellList
.
get
(
2
));
workOrderVO
.
setPhone
(
cellList
.
get
(
3
));
workOrderVO
.
setSubject
(
cellList
.
get
(
4
));
workOrderVO
.
setFrom
(
cellList
.
get
(
5
));
workOrderVO
.
setType1
(
cellList
.
get
(
6
));
workOrderVO
.
setType2
(
cellList
.
get
(
7
));
workOrderVO
.
setType3
(
cellList
.
get
(
8
));
workOrderVO
.
setPriority
(
cellList
.
get
(
9
));
workOrderVO
.
setCreateUsername
(
cellList
.
get
(
10
));
workOrderVO
.
setCreatedAt
(
cellList
.
get
(
11
));
workOrderVO
.
setOpUsername
(
cellList
.
get
(
12
));
workOrderVO
.
setDuration
(
cellList
.
get
(
13
));
workOrderVO
.
setStatus
(
cellList
.
get
(
14
));
workOrderVO
.
setOpAt
(
cellList
.
get
(
15
));
workOrderVO
.
setRemark
(
cellList
.
get
(
16
));
list
.
add
(
workOrderVO
);
}
}
src/main/java/cn/quantgroup/customer/util/poi/XlsxReader.java
0 → 100644
View file @
99afdf82
package
cn
.
quantgroup
.
customer
.
util
.
poi
;
import
org.apache.poi.openxml4j.opc.OPCPackage
;
import
org.apache.poi.ss.usermodel.BuiltinFormats
;
import
org.apache.poi.ss.usermodel.DataFormatter
;
import
org.apache.poi.xssf.eventusermodel.XSSFReader
;
import
org.apache.poi.xssf.model.SharedStringsTable
;
import
org.apache.poi.xssf.model.StylesTable
;
import
org.apache.poi.xssf.usermodel.XSSFCellStyle
;
import
org.apache.poi.xssf.usermodel.XSSFRichTextString
;
import
org.xml.sax.Attributes
;
import
org.xml.sax.InputSource
;
import
org.xml.sax.SAXException
;
import
org.xml.sax.XMLReader
;
import
org.xml.sax.helpers.DefaultHandler
;
import
org.xml.sax.helpers.XMLReaderFactory
;
import
java.io.InputStream
;
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 用于解决office2007版本大数据量问题
**/
public
class
XlsxReader
extends
DefaultHandler
{
private
Reader
reader
;
public
XlsxReader
(
Reader
reader
)
{
this
.
reader
=
reader
;
}
// 单元格中的数据可能的数据类型
enum
CellDataType
{
BOOL
,
ERROR
,
FORMULA
,
INLINESTR
,
SSTINDEX
,
NUMBER
,
DATE
,
NULL
}
// 共享字符串表
private
SharedStringsTable
sst
;
//上一次的索引值
private
String
lastIndex
;
// 文件的绝对路径
private
String
filePath
=
""
;
// 工作表索引
private
int
sheetIndex
=
0
;
// sheet名
private
String
sheetName
=
""
;
// 总行数
private
int
totalRows
=
0
;
// 一行内cell集合
private
List
<
String
>
cellList
=
new
ArrayList
<
String
>();
// 判断整行是否为空行的标记
private
boolean
flag
=
false
;
// 当前行
private
int
curRow
=
1
;
//当前列
private
int
curCol
=
0
;
// T元素标识
private
boolean
isTElement
;
// 异常信息,如果为空则表示没有异常
private
String
exceptionMessage
;
// 单元格数据类型,默认为字符串类型
private
CellDataType
nextDataType
=
CellDataType
.
SSTINDEX
;
private
final
DataFormatter
formatter
=
new
DataFormatter
();
// 单元格日期格式的索引
private
short
formatIndex
;
// 日期格式字符串
private
String
formatString
;
//定义前一个元素和当前元素的位置,用来计算其中空的单元格数量,如A6和A8等
private
String
preRef
=
null
,
ref
=
null
;
//定义该文档一行最大的单元格数,用来补全一行最后可能缺失的单元格
private
String
maxRef
=
null
;
//在工作簿中共享所有表格的样式表
private
StylesTable
stylesTable
;
/**
* 遍历工作簿中所有的电子表格
* 并缓存在mySheetList中
*
* @param filename
* @throws Exception
*/
public
int
process
(
String
filename
)
throws
Exception
{
filePath
=
filename
;
OPCPackage
pkg
=
OPCPackage
.
open
(
filename
);
XSSFReader
xssfReader
=
new
XSSFReader
(
pkg
);
stylesTable
=
xssfReader
.
getStylesTable
();
SharedStringsTable
sst
=
xssfReader
.
getSharedStringsTable
();
XMLReader
parser
=
XMLReaderFactory
.
createXMLReader
(
"org.apache.xerces.parsers.SAXParser"
);
this
.
sst
=
sst
;
parser
.
setContentHandler
(
this
);
XSSFReader
.
SheetIterator
sheets
=
(
XSSFReader
.
SheetIterator
)
xssfReader
.
getSheetsData
();
//遍历sheet
while
(
sheets
.
hasNext
())
{
//标记初始行为第一行
curRow
=
1
;
sheetIndex
++;
//sheets.next()和sheets.getSheetName()不能换位置,否则sheetName报错
InputStream
sheet
=
sheets
.
next
();
sheetName
=
sheets
.
getSheetName
();
InputSource
sheetSource
=
new
InputSource
(
sheet
);
//解析excel的每条记录,在这个过程中startElement()、characters()、endElement()这三个函数会依次执行
parser
.
parse
(
sheetSource
);
sheet
.
close
();
}
//返回该excel文件的总行数,不包括首列和空行
return
totalRows
;
}
/**
* 第一个执行
*
* @param uri
* @param localName
* @param name
* @param attributes
* @throws SAXException
*/
@Override
public
void
startElement
(
String
uri
,
String
localName
,
String
name
,
Attributes
attributes
)
throws
SAXException
{
//c => 单元格
if
(
"c"
.
equals
(
name
))
{
//前一个单元格的位置
if
(
preRef
==
null
)
{
preRef
=
attributes
.
getValue
(
"r"
);
}
else
{
preRef
=
ref
;
}
//当前单元格的位置
ref
=
attributes
.
getValue
(
"r"
);
//设定单元格类型
this
.
setNextDataType
(
attributes
);
}
//当元素为t时
if
(
"t"
.
equals
(
name
))
{
isTElement
=
true
;
}
else
{
isTElement
=
false
;
}
//置空
lastIndex
=
""
;
}
/**
* 第二个执行
* 得到单元格对应的索引值或是内容值
* 如果单元格类型是字符串、INLINESTR、数字、日期,lastIndex则是索引值
* 如果单元格类型是布尔值、错误、公式,lastIndex则是内容值
*
* @param ch
* @param start
* @param length
* @throws SAXException
*/
@Override
public
void
characters
(
char
[]
ch
,
int
start
,
int
length
)
throws
SAXException
{
lastIndex
+=
new
String
(
ch
,
start
,
length
);
}
/**
* 第三个执行
*
* @param uri
* @param localName
* @param name
* @throws SAXException
*/
@Override
public
void
endElement
(
String
uri
,
String
localName
,
String
name
)
throws
SAXException
{
//t元素也包含字符串
if
(
isTElement
)
{
//这个程序没经过
//将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符
String
value
=
lastIndex
.
trim
();
cellList
.
add
(
curCol
,
value
);
curCol
++;
isTElement
=
false
;
//如果里面某个单元格含有值,则标识该行不为空行
if
(
value
!=
null
&&
!
""
.
equals
(
value
))
{
flag
=
true
;
}
}
else
if
(
"v"
.
equals
(
name
))
{
//v => 单元格的值,如果单元格是字符串,则v标签的值为该字符串在SST中的索引
String
value
=
this
.
getDataValue
(
lastIndex
.
trim
(),
""
);
//根据索引值获取对应的单元格值
//补全单元格之间的空单元格
if
(!
ref
.
equals
(
preRef
))
{
int
len
=
countNullCell
(
ref
,
preRef
);
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
cellList
.
add
(
curCol
,
""
);
curCol
++;
}
}
cellList
.
add
(
curCol
,
value
);
curCol
++;
//如果里面某个单元格含有值,则标识该行不为空行
if
(
value
!=
null
&&
!
""
.
equals
(
value
))
{
flag
=
true
;
}
}
else
{
//如果标签名称为row,这说明已到行尾,调用optRows()方法
if
(
"row"
.
equals
(
name
))
{
//默认第一行为表头,以该行单元格数目为最大数目
if
(
curRow
==
1
)
{
maxRef
=
ref
;
}
//补全一行尾部可能缺失的单元格
if
(
maxRef
!=
null
)
{
int
len
=
countNullCell
(
maxRef
,
ref
);
for
(
int
i
=
0
;
i
<=
len
;
i
++)
{
cellList
.
add
(
curCol
,
""
);
curCol
++;
}
}
//该行不为空行且该行不是第一行,则发送(第一行为列名,不需要)
if
(
flag
&&
curRow
!=
1
)
{
try
{
reader
.
read
(
filePath
,
sheetName
,
sheetIndex
,
curRow
,
cellList
);
// method.invoke(reader, filePath, sheetName, sheetIndex, curRow, cellList);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
totalRows
++;
}
cellList
.
clear
();
curRow
++;
curCol
=
0
;
preRef
=
null
;
ref
=
null
;
flag
=
false
;
}
}
}
/**
* 处理数据类型
*
* @param attributes
*/
public
void
setNextDataType
(
Attributes
attributes
)
{
//cellType为空,则表示该单元格类型为数字
nextDataType
=
CellDataType
.
NUMBER
;
formatIndex
=
-
1
;
formatString
=
null
;
//单元格类型
String
cellType
=
attributes
.
getValue
(
"t"
);
String
cellStyleStr
=
attributes
.
getValue
(
"s"
);
//获取单元格的位置,如A1,B1
// String columnData = attributes.getValue("r");
if
(
"b"
.
equals
(
cellType
))
{
//处理布尔值
nextDataType
=
CellDataType
.
BOOL
;
}
else
if
(
"e"
.
equals
(
cellType
))
{
//处理错误
nextDataType
=
CellDataType
.
ERROR
;
}
else
if
(
"inlineStr"
.
equals
(
cellType
))
{
nextDataType
=
CellDataType
.
INLINESTR
;
}
else
if
(
"s"
.
equals
(
cellType
))
{
//处理字符串
nextDataType
=
CellDataType
.
SSTINDEX
;
}
else
if
(
"str"
.
equals
(
cellType
))
{
nextDataType
=
CellDataType
.
FORMULA
;
}
if
(
cellStyleStr
!=
null
)
{
//处理日期
int
styleIndex
=
Integer
.
parseInt
(
cellStyleStr
);
XSSFCellStyle
style
=
stylesTable
.
getStyleAt
(
styleIndex
);
formatIndex
=
style
.
getDataFormat
();
formatString
=
style
.
getDataFormatString
();
if
(
formatString
.
contains
(
"m/d/yy"
))
{
nextDataType
=
CellDataType
.
DATE
;
formatString
=
"yyyy-MM-dd hh:mm:ss"
;
}
if
(
formatString
==
null
)
{
nextDataType
=
CellDataType
.
NULL
;
formatString
=
BuiltinFormats
.
getBuiltinFormat
(
formatIndex
);
}
}
}
/**
* 对解析出来的数据进行类型处理
*
* @param value 单元格的值,
* value代表解析:BOOL的为0或1, ERROR的为内容值,FORMULA的为内容值,INLINESTR的为索引值需转换为内容值,
* SSTINDEX的为索引值需转换为内容值, NUMBER为内容值,DATE为内容值
* @param thisStr 一个空字符串
* @return
*/
@SuppressWarnings
(
"deprecation"
)
public
String
getDataValue
(
String
value
,
String
thisStr
)
{
switch
(
nextDataType
)
{
// 这几个的顺序不能随便交换,交换了很可能会导致数据错误
case
BOOL:
//布尔值
char
first
=
value
.
charAt
(
0
);
thisStr
=
first
==
'0'
?
"FALSE"
:
"TRUE"
;
break
;
case
ERROR:
//错误
thisStr
=
"\"ERROR:"
+
value
.
toString
()
+
'"'
;
break
;
case
FORMULA:
//公式
thisStr
=
'"'
+
value
.
toString
()
+
'"'
;
break
;
case
INLINESTR:
XSSFRichTextString
rtsi
=
new
XSSFRichTextString
(
value
.
toString
());
thisStr
=
rtsi
.
toString
();
rtsi
=
null
;
break
;
case
SSTINDEX:
//字符串
String
sstIndex
=
value
.
toString
();
try
{
int
idx
=
Integer
.
parseInt
(
sstIndex
);
XSSFRichTextString
rtss
=
new
XSSFRichTextString
(
sst
.
getEntryAt
(
idx
));
//根据idx索引值获取内容值
thisStr
=
rtss
.
toString
();
rtss
=
null
;
}
catch
(
NumberFormatException
ex
)
{
thisStr
=
value
.
toString
();
}
break
;
case
NUMBER:
//数字
if
(
formatString
!=
null
)
{
thisStr
=
formatter
.
formatRawCellContents
(
Double
.
parseDouble
(
value
),
formatIndex
,
formatString
).
trim
();
}
else
{
thisStr
=
value
;
}
thisStr
=
thisStr
.
replace
(
"_"
,
""
).
trim
();
break
;
case
DATE:
//日期
thisStr
=
formatter
.
formatRawCellContents
(
Double
.
parseDouble
(
value
),
formatIndex
,
formatString
);
// 对日期字符串作特殊处理,去掉T
thisStr
=
thisStr
.
replace
(
"T"
,
" "
);
break
;
default
:
thisStr
=
" "
;
break
;
}
return
thisStr
;
}
public
int
countNullCell
(
String
ref
,
String
preRef
)
{
//excel2007最大行数是1048576,最大列数是16384,最后一列列名是XFD
String
xfd
=
ref
.
replaceAll
(
"\\d+"
,
""
);
String
xfd_1
=
preRef
.
replaceAll
(
"\\d+"
,
""
);
xfd
=
fillChar
(
xfd
,
3
,
'@'
,
true
);
xfd_1
=
fillChar
(
xfd_1
,
3
,
'@'
,
true
);
char
[]
letter
=
xfd
.
toCharArray
();
char
[]
letter_1
=
xfd_1
.
toCharArray
();
int
res
=
(
letter
[
0
]
-
letter_1
[
0
])
*
26
*
26
+
(
letter
[
1
]
-
letter_1
[
1
])
*
26
+
(
letter
[
2
]
-
letter_1
[
2
]);
return
res
-
1
;
}
public
String
fillChar
(
String
str
,
int
len
,
char
let
,
boolean
isPre
)
{
int
len_1
=
str
.
length
();
if
(
len_1
<
len
)
{
if
(
isPre
)
{
for
(
int
i
=
0
;
i
<
(
len
-
len_1
);
i
++)
{
str
=
let
+
str
;
}
}
else
{
for
(
int
i
=
0
;
i
<
(
len
-
len_1
);
i
++)
{
str
=
str
+
let
;
}
}
}
return
str
;
}
/**
* @return the exceptionMessage
*/
public
String
getExceptionMessage
()
{
return
exceptionMessage
;
}
}
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