diff --git a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java index c0de039d..06f03666 100644 --- a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelExcelServiceImpl.java @@ -4965,17 +4965,33 @@ public class CoDelExcelServiceImpl implements CoDelExcelService { * @return 行数 */ private int calculateLineCount(String content) { + return calculateLineCount(content, 45); + } + + /** + * 计算文本在单元格中实际占用的行数,同时考虑显式换行符和因列宽不足导致的自动折行。 + * + * @param content 单元格内容 + * @param maxCharsPerLine 每行可容纳的估算字符数(中文字符按2个宽度计算) + * @return 实际显示行数 + */ + private int calculateLineCount(String content, int maxCharsPerLine) { if (content == null || content.isEmpty()) { return 1; } - // 计算换行符数量 + 1 = 行数 - int lineCount = 1; - for (int i = 0; i < content.length(); i++) { - if (content.charAt(i) == '\n') { - lineCount++; + int totalLines = 0; + String[] segments = content.split("\n", -1); + for (String segment : segments) { + // 中文字符宽度约为英文的2倍,用加权字符数估算视觉宽度 + int visualWidth = 0; + for (char c : segment.toCharArray()) { + visualWidth += (c > 0x7F) ? 2 : 1; } + // 至少占1行,超出列宽则向上取整计算折行数 + int wrappedLines = (int) Math.ceil((double) visualWidth / maxCharsPerLine); + totalLines += Math.max(1, wrappedLines); } - return lineCount; + return Math.max(1, totalLines); } /**