|
|
|
@ -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); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
|