首先根据条件,记录需合并单元格的起始行和结束行
string oldCol0 = ""; //上一行的值,相同则合并
List<List<int>> mergs = new List<List<int>>(); //各段需合并的单元格行号
List<int> submerg = new List<int>(); //当前需合并一组单元格行号
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow dtRow = dt.Rows[i];
IRow excelRow = sheet.CreateRow(rowIndex++);
for (int j = startCol; j < dtRow.ItemArray.Length; j++)
{
ICell cell_Conent = excelRow.CreateCell(j - startCol);
string val = dtRow[j].ToString(); //以文本或数字两种格式插入Excel,避免数字前面出现绿三角
double trans;
if(double.TryParse(val,out trans))
cell_Conent.SetCellValue(trans);
else
cell_Conent.SetCellValue(val);
cell_Conent.CellStyle = cellStyle_normal;
if (j == startCol)
{
if (val == oldCol0)//与上行值相同,记录需合并单元格
{
if (submerg.Count == 0) //开始一段新合并,将本行和上行都记录
{
submerg.Add(rowIndex - 2);
submerg.Add(rowIndex-1);//行号比index多1,
}
else //只记录本行
submerg.Add(rowIndex-1);
}
else //本行与上行值不同,提交当前需合并的单元格行号
{
if (submerg.Count > 0)
mergs.Add(submerg.Clone());
submerg.Clear();
}
oldCol0 = val;
}
}
}
if (submerg.Count > 0) //最后一行不能忘了
mergs.Add(submerg.Clone());
//合并单元格
if (mergCell)
{
/**
第一个参数:从第几行开始合并
第二个参数:到第几行结束合并
第三个参数:从第几列开始合并
第四个参数:到第几列结束合并
**/
for (int i = 0; i < mergs.Count; i++)
{
int st = mergs[i][0];
int ed = mergs[i][mergs[i].Count - 1];
CellRangeAddress cellRange = new CellRangeAddress(st, ed, 0, 0);
sheet.AddMergedRegion(cellRange);
}
}