行高超过409不能显示全部内容的情况下,自动插入行并调整行高保证内容全部显示
半成品代码,对已经有合并单元格情况,未处理。
function Calculate_cell_text_height(end_row_index,end_columns_index){ //在没有合并单元格之前进行插入行操作。执行一次之后,再次执行,因为插入多余的行,会出现大面积空白区域
let font_size_array = {9:7.7,10:9.2,11:10.7,12:12.2} //9 10 11 12号字体对应的大小实 际 {9:7.5,10:9,11:10.5,12:12} ,数组中增加 0.2 余量,保证显示效果
for(var rowindex=end_row_index;rowindex>=3;rowindex--){
let cell_value2_array = [];
let fontsizept = 0;
let require_cell_lines = 0; //按行计算每个单元格需要的最大行数
let maxrowlines = 0; // 记录最多的那个单元格还有多少行数没有显示出来
let rows_max_lines_array = [];
for(var columnindex =1;columnindex<=end_columns_index;columnindex++ ){
let cell_value_rows = 0; //每个单元格需要显示的行数
//let matchs = ActiveWorkbook.wWorksheets.Item(1).Cells(rowindex,columnindex).Value2.match(new RegExp("\n","g"));
let ccell = Application.ActiveSheet.Cells.Item(rowindex,columnindex)
fontsizept = font_size_array[ccell.Font.Size]+2;//每一个字猜测左右各有1磅空间,左右内边距合计2磅。上下内边距猜测也是2磅。
let maxlinechars = Math.floor(ccell.Width / fontsizept) //每一行能显示的字符数
console.log("第" + rowindex + "行,第" + columnindex + "列能显示的最多字符数:"+maxlinechars)
cell_value2_array = String(ccell.Value2).split("\n") //每一个数组元素需要几行,从而计算出总共需要的行数
for(var i=0;i<cell_value2_array.length;i++){
cell_value_rows= cell_value_rows+ Math.ceil( cell_value2_array[i].length / maxlinechars) ; //单个单元格需要的总行数
}
console.log("第" + rowindex + "行,第" + columnindex + "列单元格需要显示的最大行数:" + cell_value_rows)
require_cell_lines = Math.max(require_cell_lines,cell_value_rows)
let cell_maxrowlines = Math.floor(ccell.Height / fontsizept) //每一单元格能显示的最大行数
console.log("第" + rowindex + "行,第" + columnindex + "列单元格实际承载最大行数:" + cell_maxrowlines)
if((require_cell_lines - cell_maxrowlines)>0 ){
maxrowlines = Math.max(maxrowlines,require_cell_lines - cell_maxrowlines) //判断 还有多少行没有显示出来。只记录最多的那个单元格需要的行数
}
} //列循环结束
console.log("第" + rowindex + "行,最多未显示行数:" + maxrowlines)
let crowheight = Application.ActiveSheet.Rows.Item(rowindex).RowHeight;
if((409.25 - crowheight) >= maxrowlines * fontsizept ){
Application.ActiveSheet.Cells.Rows.Item(rowindex).RowHeight = crowheight + maxrowlines * fontsizept; //总行高不超过409,就直接调整行高
}else{ //插入行,合并各单元格
let mergecount = Application.Cells.Rows.Item(rowindex).Columns.Item(1).MergeArea.Count //判断 合并单元格的数量,后续功能需要自行完善。
let addlinescount = Math.ceil((maxrowlines * fontsizept) / 409.25 )
console.log("addlinescount:"+addlinescount)
Application.ActiveSheet.Cells.Rows.Item(rowindex+1).Resize(addlinescount).Insert();
for(var columnindex =1;columnindex<=end_columns_index;columnindex++ ){
Application.ActiveSheet.Range(Application.ActiveSheet.Cells.Item(rowindex,columnindex),Application.ActiveSheet.Cells.Item(rowindex+addlinescount,columnindex)).Merge()
}
let pt = maxrowlines * fontsizept
for(var j =1 ; j<=addlinescount;j++ ){
if(pt > 409.25 ){
Application.ActiveSheet.Cells.Rows.Item(rowindex+j).RowHeight = 409.25;
} else {
Application.ActiveSheet.Cells.Rows.Item(rowindex+j).RowHeight = pt;
}
pt = pt-409.25;
}
}
} //行 循环结束
}
function test(){
Calculate_cell_text_height(16,8) //少量行,执行速度还可以,大量的行,需要等待。
}