C# 使用NPOI从table中导出数据到Excel,合并同一列中相同的单元格

for (int i = 0; i < dt.Rows.Count; i++){ IRow row = Sheet.CreateRow(i+1); for (int j = 0; j < dt.Columns.Count; j++) { row.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString()); if ((j==1||j==2) && i >0) {if (string.Compare(dt.Rows[i][j].ToString(), dt.Rows[i - 1][j].ToString()) == 0) {CellRangeAddress region = new CellRangeAddress(i,i+1,j,j); Sheet.AddMergedRegion(region);}}}}
现在用的是上面的代码来判断单元格值是否相同,相同则合并(第1列和第2列),超过两个相同的就会有问题,前两个可以正常合并,第3个开始单元格合并了,但内容有问题,如下图

请帮忙看看要怎么改,或者另外有什么方法

n行合并,应该是一起合并的,并不是两行两行合并。
要实现,算法上要想一下。

确定每组的开始行号跟结束行号,由这两个值来合并
int start=…;//合并开始行号
int end=…;//合并结束行号
if(start!=end)//该组开始行号跟结束行号相同时候,该组只有一行,不用合并。不等才合并
{
CellRangeAddress region = new CellRangeAddress(start,end,j,j);
Sheet.AddMergedRegion(region);
}
上面开始行号跟结束行号,就需要在循环中判断,并设置。
这只是思路,供参考。追问

但是目前就是没法确定start和end

追答int start = 0;//记录同组开始行号
int end = 0;//记录同组结束行号
string temp = "";
DataTable dt;
for (int i = 0; i < dt.Rows.Count; i++)
{
    IRow row = Sheet.CreateRow(i + 1);
    for (int j = 0; j < dt.Columns.Count; j++)
    {
        string cellText = dt.Rows[i][j].ToString();
        row.CreateCell(j).SetCellValue(cellText);
        if (j == 2)
        {
            if (cellText == temp)//上下行相等,记录要合并的最后一行
            {
                end = i;
            }
            else//上下行不等,记录
            {
                if (start != end)
                {
                    CellRangeAddress region = new CellRangeAddress(start, end, 1, 1);
                    Sheet.AddMergedRegion(region);
                    CellRangeAddress region2 = new CellRangeAddress(start, end, 2, 2);
                    Sheet.AddMergedRegion(region2);
                }
                start = i;
                end = i;
                temp = cellText;
            }
        }
                    
    }
}

花了点时间帮你写了下代码,看行不行。可以的话要点赞啊~

追问

有点样子了,前3行合并了,但第4行没有合并

追答

我直接看看不出什么。
你调试下吧,在上面的第14行设个断点,看为什么第四行的时候不对。

温馨提示:答案为网友推荐,仅供参考
相似回答