Commit 065a1c38 by wangjian

2025-09-22 wj 整体修改3

parent 5da44a9a
...@@ -4,10 +4,7 @@ import java.io.IOException; ...@@ -4,10 +4,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.qianhe.common.core.domain.BaseEntity; import com.qianhe.common.core.domain.BaseEntity;
...@@ -269,7 +266,7 @@ public class SjFybpController extends BaseController ...@@ -269,7 +266,7 @@ public class SjFybpController extends BaseController
exl.write(out); exl.write(out);
exl.close(); exl.close();
}catch(Exception e){ }catch(Exception e){
e.getMessage(); e.printStackTrace();
throw new BusinessException("导出Excel失败,请联系网站管理员!"); throw new BusinessException("导出Excel失败,请联系网站管理员!");
}finally{ }finally{
if (exl != null) { if (exl != null) {
...@@ -331,10 +328,10 @@ public class SjFybpController extends BaseController ...@@ -331,10 +328,10 @@ public class SjFybpController extends BaseController
} }
//合并行 //合并行
mergeCellsByColumn(sheet,0); // mergeCellsByColumn(sheet,0);
mergeCellsByColumn(sheet,1); mergeCellsByColumn(sheet,1, 5);
mergeCellsByColumn(sheet,2); mergeCellsByColumn(sheet,2, 5);
mergeCellsByColumn(sheet,3); mergeCellsByColumn(sheet,3, 5);
if(cbList.size()>0){ if(cbList.size()>0){
sheet.getRow(1).getCell(2).setCellValue(cbList.get(0).getFyrq() + "年"); sheet.getRow(1).getCell(2).setCellValue(cbList.get(0).getFyrq() + "年");
...@@ -342,41 +339,117 @@ public class SjFybpController extends BaseController ...@@ -342,41 +339,117 @@ public class SjFybpController extends BaseController
} }
} }
// 根据某一列的值是否相同,对其他列的单元格进行合并
private static void mergeCellsByColumn(Sheet sheet, int columnIndex) { /**
Map<String, Integer> groups = new HashMap<>(); * 合并指定列中相同值的单元格
* @param sheet Excel工作表
// 遍历该列,记录相同值的行索引 * @param columnIndex 要合并的列索引
int start=1; * @param startRowIndex 数据起始行索引(从0开始),之前的行将被忽略
int end=1; */
String old=""; private static void mergeCellsByColumn(Sheet sheet, int columnIndex, int startRowIndex) {
for (int i = 1; i <= sheet.getLastRowNum(); i++) { // 清除已存在的合并区域(可选)
// 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); Row row = sheet.getRow(i);
if (row == null) continue;
Cell cell = row.getCell(columnIndex); Cell cell = row.getCell(columnIndex);
String cellValue = cell.getStringCellValue(); String cellValue = getCellValue(cell);
if (!groups.containsKey(cellValue)) {
if(groups.get(old)!=null){ // 当前值与起始值不同,合并前面的行
start = groups.get(old); if (!cellValue.equals(currentValue)) {
} // 检查合并区域是否重叠
old=cellValue; if (!isRegionOverlapping(sheet, startRow, i - 1, columnIndex)) {
groups.put(cellValue, i); mergeCellsInRange(sheet, columnIndex, startRow, i - 1);
//合并行 } else {
mergeCellsInRange(sheet, columnIndex, start, end); // 处理重叠情况,可记录日志或抛出异常
start=i; //log.warn("合并区域重叠: 行[{}:{}]列[{}]", startRow, i - 1, columnIndex);
end=i;
} else {
end++;
if(i==sheet.getLastRowNum()){
mergeCellsInRange(sheet, columnIndex, start, end);
} }
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) { 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)); 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);
}
}
} }
...@@ -280,7 +280,7 @@ public class SjFybpServiceImpl implements ISjFybpService ...@@ -280,7 +280,7 @@ public class SjFybpServiceImpl implements ISjFybpService
//return sjFybpMapper.selectSjFybpCtList(sjFybp); //return sjFybpMapper.selectSjFybpCtList(sjFybp);
//季度 //季度
String[] jddms = {"一","二","三","四","合计"}; String[] jddms = {"第一季度","第二季度","第三季度","第四季度","合计"};
String[] jdmcs = {"一季度","二季度","三季度","四季度","合计"}; String[] jdmcs = {"一季度","二季度","三季度","四季度","合计"};
List<SjfybpVo> rtnList = new ArrayList<>(); List<SjfybpVo> rtnList = new ArrayList<>();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment