Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Q
qianhe-ydsj
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
jiangyun
qianhe-ydsj
Commits
065a1c38
Commit
065a1c38
authored
Sep 23, 2025
by
wangjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
2025-09-22 wj 整体修改3
parent
5da44a9a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
108 additions
and
35 deletions
+108
-35
qianhe-ydsj/src/main/java/com/qianhe/controller/SjFybpController.java
+107
-34
qianhe-ydsj/src/main/java/com/qianhe/service/impl/SjFybpServiceImpl.java
+1
-1
No files found.
qianhe-ydsj/src/main/java/com/qianhe/controller/SjFybpController.java
View file @
065a1c38
...
...
@@ -4,10 +4,7 @@ import java.io.IOException;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.net.URLEncoder
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.*
;
import
javax.servlet.http.HttpServletResponse
;
import
com.qianhe.common.core.domain.BaseEntity
;
...
...
@@ -269,7 +266,7 @@ public class SjFybpController extends BaseController
exl
.
write
(
out
);
exl
.
close
();
}
catch
(
Exception
e
){
e
.
getMessag
e
();
e
.
printStackTrac
e
();
throw
new
BusinessException
(
"导出Excel失败,请联系网站管理员!"
);
}
finally
{
if
(
exl
!=
null
)
{
...
...
@@ -331,10 +328,10 @@ public class SjFybpController extends BaseController
}
//合并行
mergeCellsByColumn
(
sheet
,
0
);
mergeCellsByColumn
(
sheet
,
1
);
mergeCellsByColumn
(
sheet
,
2
);
mergeCellsByColumn
(
sheet
,
3
);
//
mergeCellsByColumn(sheet,0);
mergeCellsByColumn
(
sheet
,
1
,
5
);
mergeCellsByColumn
(
sheet
,
2
,
5
);
mergeCellsByColumn
(
sheet
,
3
,
5
);
if
(
cbList
.
size
()>
0
){
sheet
.
getRow
(
1
).
getCell
(
2
).
setCellValue
(
cbList
.
get
(
0
).
getFyrq
()
+
"年"
);
...
...
@@ -342,41 +339,117 @@ public class SjFybpController extends BaseController
}
}
// 根据某一列的值是否相同,对其他列的单元格进行合并
private
static
void
mergeCellsByColumn
(
Sheet
sheet
,
int
columnIndex
)
{
Map
<
String
,
Integer
>
groups
=
new
HashMap
<>();
// 遍历该列,记录相同值的行索引
int
start
=
1
;
int
end
=
1
;
String
old
=
""
;
for
(
int
i
=
1
;
i
<=
sheet
.
getLastRowNum
();
i
++)
{
/**
* 合并指定列中相同值的单元格
* @param sheet Excel工作表
* @param columnIndex 要合并的列索引
* @param startRowIndex 数据起始行索引(从0开始),之前的行将被忽略
*/
private
static
void
mergeCellsByColumn
(
Sheet
sheet
,
int
columnIndex
,
int
startRowIndex
)
{
// 清除已存在的合并区域(可选)
// clearMergedRegions(sheet, columnIndex);
if
(
sheet
.
getLastRowNum
()
<=
startRowIndex
)
{
return
;
// 没有可合并的数据行
}
int
startRow
=
startRowIndex
;
String
currentValue
=
getCellValue
(
sheet
.
getRow
(
startRow
).
getCell
(
columnIndex
));
for
(
int
i
=
startRowIndex
+
1
;
i
<=
sheet
.
getLastRowNum
();
i
++)
{
Row
row
=
sheet
.
getRow
(
i
);
if
(
row
==
null
)
continue
;
Cell
cell
=
row
.
getCell
(
columnIndex
);
String
cellValue
=
cell
.
getStringCellValue
();
if
(!
groups
.
containsKey
(
cellValue
))
{
if
(
groups
.
get
(
old
)!=
null
){
start
=
groups
.
get
(
old
);
}
old
=
cellValue
;
groups
.
put
(
cellValue
,
i
);
//合并行
mergeCellsInRange
(
sheet
,
columnIndex
,
start
,
end
);
start
=
i
;
end
=
i
;
}
else
{
end
++;
if
(
i
==
sheet
.
getLastRowNum
()){
mergeCellsInRange
(
sheet
,
columnIndex
,
start
,
end
);
String
cellValue
=
getCellValue
(
cell
);
// 当前值与起始值不同,合并前面的行
if
(!
cellValue
.
equals
(
currentValue
))
{
// 检查合并区域是否重叠
if
(!
isRegionOverlapping
(
sheet
,
startRow
,
i
-
1
,
columnIndex
))
{
mergeCellsInRange
(
sheet
,
columnIndex
,
startRow
,
i
-
1
);
}
else
{
// 处理重叠情况,可记录日志或抛出异常
//log.warn("合并区域重叠: 行[{}:{}]列[{}]", startRow, i - 1, columnIndex);
}
startRow
=
i
;
currentValue
=
cellValue
;
}
}
// 合并最后一组单元格
if
(!
isRegionOverlapping
(
sheet
,
startRow
,
sheet
.
getLastRowNum
(),
columnIndex
))
{
mergeCellsInRange
(
sheet
,
columnIndex
,
startRow
,
sheet
.
getLastRowNum
());
}
else
{
//log.warn("合并区域重叠: 行[{}:{}]列[{}]", startRow, sheet.getLastRowNum(), columnIndex);
}
}
// 获取单元格值的工具方法,处理不同类型和null情况
private
static
String
getCellValue
(
Cell
cell
)
{
if
(
cell
==
null
)
return
""
;
switch
(
cell
.
getCellType
())
{
case
STRING:
return
cell
.
getStringCellValue
().
trim
();
case
NUMERIC:
return
String
.
valueOf
(
cell
.
getNumericCellValue
());
case
BOOLEAN:
return
String
.
valueOf
(
cell
.
getBooleanCellValue
());
default
:
return
""
;
}
}
// 合并指定范围内的单元格
private
static
void
mergeCellsInRange
(
Sheet
sheet
,
int
columnIndex
,
int
startIndex
,
int
endIndex
)
{
if
(
startIndex
!=
endIndex
){
if
(
startIndex
<
endIndex
)
{
// 只有当起始行小于结束行时才合并
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
startIndex
,
endIndex
,
columnIndex
,
columnIndex
));
}
}
/**
* 检查合并区域是否与现有区域重叠
*/
private
static
boolean
isRegionOverlapping
(
Sheet
sheet
,
int
startRow
,
int
endRow
,
int
columnIndex
)
{
CellRangeAddress
newRegion
=
new
CellRangeAddress
(
startRow
,
endRow
,
columnIndex
,
columnIndex
);
// 检查是否与现有合并区域重叠
for
(
int
i
=
0
;
i
<
sheet
.
getNumMergedRegions
();
i
++)
{
CellRangeAddress
existingRegion
=
sheet
.
getMergedRegion
(
i
);
// 检查是否为同一列
if
(
existingRegion
.
getFirstColumn
()
!=
columnIndex
||
existingRegion
.
getLastColumn
()
!=
columnIndex
)
{
continue
;
}
// 检查行范围是否重叠
if
(!(
newRegion
.
getLastRow
()
<
existingRegion
.
getFirstRow
()
||
newRegion
.
getFirstRow
()
>
existingRegion
.
getLastRow
()))
{
return
true
;
// 重叠
}
}
return
false
;
}
/**
* 清除指定列的所有合并区域
*/
private
static
void
clearMergedRegions
(
Sheet
sheet
,
int
columnIndex
)
{
List
<
Integer
>
regionsToRemove
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
sheet
.
getNumMergedRegions
();
i
++)
{
CellRangeAddress
region
=
sheet
.
getMergedRegion
(
i
);
if
(
region
.
getFirstColumn
()
==
columnIndex
&&
region
.
getLastColumn
()
==
columnIndex
)
{
regionsToRemove
.
add
(
i
);
}
}
// 从后往前删除,避免索引变化
Collections
.
reverse
(
regionsToRemove
);
for
(
int
index
:
regionsToRemove
)
{
sheet
.
removeMergedRegion
(
index
);
}
}
}
qianhe-ydsj/src/main/java/com/qianhe/service/impl/SjFybpServiceImpl.java
View file @
065a1c38
...
...
@@ -280,7 +280,7 @@ public class SjFybpServiceImpl implements ISjFybpService
//return sjFybpMapper.selectSjFybpCtList(sjFybp);
//季度
String
[]
jddms
=
{
"
一"
,
"二"
,
"三"
,
"四
"
,
"合计"
};
String
[]
jddms
=
{
"
第一季度"
,
"第二季度"
,
"第三季度"
,
"第四季度
"
,
"合计"
};
String
[]
jdmcs
=
{
"一季度"
,
"二季度"
,
"三季度"
,
"四季度"
,
"合计"
};
List
<
SjfybpVo
>
rtnList
=
new
ArrayList
<>();
...
...
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