首页 新闻 会员 周边

asp.net Excel合并单元格

0
悬赏园豆:20 [已解决问题] 解决于 2015-09-30 11:27

asp.net 写 Excel第一列的单元格 每每3个合并成一个单元格  如这张图上的 红线框住的部分该怎么合并

Kiss丿残阳的主页 Kiss丿残阳 | 初学一级 | 园豆:190
提问于:2015-09-25 17:44
< >
分享
最佳答案
0

如果是死的內容,就每三個去合併,如果是活得,可以寫個循環吧,我也是新手,提供個意見而已

收获园豆:20
潘雪婷 | 菜鸟二级 |园豆:204 | 2015-09-28 13:59

很高兴,你能为我提供意见,我还在找解决方案

Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-28 18:31

@Kiss丿残阳: 还没解决吗?你是用NPOI做的吗?我前几天刚做了几个报表,用NPOI做的,你把你的问题说详细点,我帮你想想

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-29 08:07

@潘雪婷: 是用npoi  ,excel中的第一列 每每3个单元格,合并为1个单元格,如图被红线框起来的

Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-29 08:19

@Kiss丿残阳: 可以附上你赋值的代码吗?

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-29 08:21

@潘雪婷: 这个就是我导出用的代码但是那个合并 不知道怎么弄

public static MemoryStream WriteListToExcel(XDictArray list,String strdate)
    {
        MemoryStream ms = new MemoryStream();

        IWorkbook workbook = new HSSFWorkbook();
        ISheet sheet = workbook.CreateSheet();

        // IRow TitleRow = sheet.CreateRow(0);

        /******************写入标题行,合并居中*********************/


        //合并单元格
        ICellStyle headerRowStyle = workbook.CreateCellStyle();
        headerRowStyle.Alignment = HorizontalAlignment.Center;//水平居中
        headerRowStyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中
        IFont headerfont = workbook.CreateFont();
        headerfont.FontHeightInPoints = 12;//大小
        headerfont.Boldweight = 700;
        headerRowStyle.SetFont(headerfont);
        headerRowStyle.BorderDiagonalLineStyle = BorderStyle.Thin;
        headerRowStyle.BorderBottom = BorderStyle.Thin;// (BorderStyle)CellBorderType.THIN;
        headerRowStyle.BorderLeft = BorderStyle.Thin;
        headerRowStyle.BorderRight = BorderStyle.Thin;
        headerRowStyle.BorderTop = BorderStyle.Thin;

        //头样式
        ICellStyle headerRowStyle2 = workbook.CreateCellStyle();
        headerRowStyle2.Alignment = HorizontalAlignment.Center;//水平居中
        headerRowStyle2.VerticalAlignment = VerticalAlignment.Center;//垂直居中
        headerRowStyle2.BorderBottom = BorderStyle.Thin;// (BorderStyle)CellBorderType.THIN;
        headerRowStyle2.BorderLeft = BorderStyle.Thin;
        headerRowStyle2.BorderRight = BorderStyle.Thin;
        headerRowStyle2.BorderTop = BorderStyle.Thin;
        //内容样式
        ICellStyle cellstyle = workbook.CreateCellStyle();
        cellstyle.Alignment = HorizontalAlignment.Center;//水平居中
        cellstyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中

        //cellstyle.BorderBottom = BorderStyle.Thin;//边框
        //cellstyle.BorderLeft = BorderStyle.Thin;
        //cellstyle.BorderRight = BorderStyle.Thin;
        //cellstyle.BorderTop = BorderStyle.Thin;

        IFont cellstylefont = workbook.CreateFont();
        cellstylefont.FontHeightInPoints = 10;//大小
        cellstylefont.Boldweight = 700;
        cellstyle.SetFont(cellstylefont);

        //--------------
        IRow headerRow = sheet.CreateRow(0);
        headerRow.HeightInPoints = 20;
        headerRow.Height = 600;

       // -------------
        //内容样式
        ICellStyle bottomrow = workbook.CreateCellStyle();
        bottomrow.Alignment = HorizontalAlignment.Center;//水平居中
        bottomrow.VerticalAlignment = VerticalAlignment.Center;//垂直居中

        bottomrow.BorderBottom = BorderStyle.Thin;//边框
      //------------------

         //第一列
        NPOI.SS.UserModel.IRow row = sheet.CreateRow(0);
        row.CreateCell(0).SetCellValue("案件类型");
        row.CreateCell(1).SetCellValue("参数");
        row.CreateCell(2).SetCellValue("总数");
        row.CreateCell(3).SetCellValue("套数");
        row.CreateCell(4).SetCellValue("建筑面积(㎡)");
        //设置列的宽度
        sheet.SetColumnWidth(0, 20 * 256);
        sheet.SetColumnWidth(1, 22 * 256);
        sheet.SetColumnWidth(2, 15 * 256);
        sheet.SetColumnWidth(3, 15 * 256);
        sheet.SetColumnWidth(4, 20 * 256);

        SetRowStyle(row, headerRowStyle, 0, 5);//样式

        //// 第二列
        //NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(1);
        //row2.CreateCell(0).SetCellValue("第二列第一行");


       
        int rowIndex = 1;

        int Szs = 0;           //总计宗数
        int Sts = 0;           //总计套数
        decimal Sjzmj = 0;     //总计建筑面积
        decimal Schf = 0;      //总计测绘费
        int Slzs = 0;          //总计上年同期宗数
        int Slts = 0;          //总计上年同期套数
        decimal Sljzmj = 0;    //总计上年同期建筑面积
        decimal Slchf = 0;     //总计上年同期测绘费
        string casetype = string.Empty;

        foreach (XDict wobj in list)
        {


            decimal jzmj = 0;
            decimal chf = 0;
            decimal ljzmj = 0;
            decimal lchf = 0;

            casetype = wobj["dname"].ToString();//类型名字
            int zs = wobj.GetInt("zs");
            int ts = wobj.GetInt("ts");
            if (wobj["jzmj"].ToString() != "")
            {
                jzmj = Convert.ToDecimal(wobj["jzmj"].ToString());
            }
            if (wobj["chf"].ToString() != "")
            {
                chf = Convert.ToDecimal(wobj["chf"].ToString());
            }
            int lzs = wobj.GetInt("lzs");
            int lts = wobj.GetInt("lzs");
            if (wobj["ljzmj"].ToString() != "")
            {
                ljzmj = Convert.ToDecimal(wobj["ljzmj"].ToString());
            }
            if (wobj["chf"].ToString() != "")
            {
                lchf = Convert.ToDecimal(wobj["lchf"].ToString());
            }

            //////CellRangeAddress cellRangeAddress0 = new CellRangeAddress(1, 2, 0, 0);合并
            //////sheet.AddMergedRegion(cellRangeAddress0);
            //////headerRow.CreateCell(0).SetCellValue("志愿者");
           
            //CellRangeAddress cellRangeAddress0 = new CellRangeAddress(1, 2, 0, 0);//合并
            //sheet.AddMergedRegion(cellRangeAddress0);

            for (int i = 0; i < 3; i++)
            {
                IRow dataRow = sheet.CreateRow(rowIndex);
                ++rowIndex;
                
              
                if (i == 0)
                {
                   

                  
                    dataRow.CreateCell(1).SetCellValue(strdate);//参数
                    dataRow.CreateCell(2).SetCellValue(zs);//总数
                    dataRow.CreateCell(3).SetCellValue(ts);//套数
                    dataRow.CreateCell(4).SetCellValue((jzmj).ToString());//建筑面积(㎡)

                    SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
                    
                }
                else if (i == 1)
                {
                    dataRow.CreateCell(0).SetCellValue(casetype);//案件类型
                    
                    dataRow.CreateCell(1).SetCellValue("上年度同期");//参数
                    dataRow.CreateCell(2).SetCellValue(lzs);//总数
                    dataRow.CreateCell(3).SetCellValue(lts);//套数
                    dataRow.CreateCell(4).SetCellValue((ljzmj).ToString());//建筑面积(㎡)
                    SetRowStyle(dataRow, cellstyle, 0, 1);//样式
                    SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
                    
                }
                else if (i == 2)
                {
                    dataRow.CreateCell(0).SetCellValue("");
                    dataRow.CreateCell(1).SetCellValue("与上年度对比");//参数
                    dataRow.CreateCell(2).SetCellValue((zs - lzs));//总数
                    dataRow.CreateCell(3).SetCellValue((ts - lts));//套数
                    dataRow.CreateCell(4).SetCellValue((jzmj - ljzmj).ToString());//建筑面积(㎡)

                    SetRowStyle(dataRow, bottomrow, 0, 1);
                    SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
                }
            }
           
            //CellRangeAddress cellRangeAddress0 = new CellRangeAddress(1, 3, 0, 0);//合并
            //sheet.AddMergedRegion(cellRangeAddress0);
            //sheet.AddMergedRegion(new Region(2, 2, 4, 4));

            Szs += zs;
            Sts += ts;
            Sjzmj += jzmj;
            Schf += chf;

            Slzs += lzs;
            Slts += lts;
            Sljzmj += ljzmj;

          
        }
      
            for (int i = 0; i < 3; i++)
            {
                IRow dataRows = sheet.CreateRow(rowIndex);
                ++rowIndex;
                //CellRangeAddress cellRangeAddress0 = new CellRangeAddress(1, 2, 0, 0);//合并
                //sheet.AddMergedRegion(cellRangeAddress0);
               
                if (i == 0)
                {
                    
                    dataRows.CreateCell(1).SetCellValue(strdate);//参数
                    dataRows.CreateCell(2).SetCellValue(Szs);//总数
                    dataRows.CreateCell(3).SetCellValue(Sts);//套数
                    dataRows.CreateCell(4).SetCellValue((Sjzmj).ToString());//建筑面积(㎡)

                    SetRowStyle(dataRows, headerRowStyle2, 1, 5);//样式

                }
                else if (i == 1)
                {
                    dataRows.CreateCell(0).SetCellValue("总计");//案件类型

                    dataRows.CreateCell(1).SetCellValue("上年度同期");//参数
                    dataRows.CreateCell(2).SetCellValue(Slzs);//总数
                    dataRows.CreateCell(3).SetCellValue(Slts);//套数
                    dataRows.CreateCell(4).SetCellValue((Sljzmj).ToString());//建筑面积(㎡)

                    SetRowStyle(dataRows, cellstyle, 0, 1);//样式
                    SetRowStyle(dataRows, headerRowStyle2,1, 5);//样式

                }
                else if (i == 2)
                {
                    dataRows.CreateCell(0).SetCellValue("");
                    dataRows.CreateCell(1).SetCellValue("与上年度对比");//参数
                    dataRows.CreateCell(2).SetCellValue((Szs - Slzs));//总数
                    dataRows.CreateCell(3).SetCellValue((Sts - Slts));//套数
                    dataRows.CreateCell(4).SetCellValue((Sjzmj - Sljzmj).ToString());//建筑面积(㎡)

                    SetRowStyle(dataRows, bottomrow, 0, 1);
                    SetRowStyle(dataRows, headerRowStyle2, 1, 5);//样式

                }
               
            }

        ////保存excel文档
        ////sheet.ForceFormulaRecalculation = true;
        workbook.Write(ms);

        ms.Flush();

        ms.Position = 0;


        return ms;
    }
Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-30 09:31

@Kiss丿残阳: 你現在導出的樣子給我看看

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 09:41

@潘雪婷: 现在就想到这样的效果

Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-30 09:45

@Kiss丿残阳: 這是你要的結果?還是你現在導出已經是這樣了?我要看的是你現在導出是什麼樣子的了?

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 09:48

@Kiss丿残阳:  你現在導出一下給我看看

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 09:53

@潘雪婷:

-----------------我想要的结果是下面的这幅图------------------------------------------

----------------------------------------最后面这幅图是我现在的结果-----------------------------

Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-30 09:54

@Kiss丿残阳: 

for (int i = 0; i < 3; i++)
            {
                IRow dataRow = sheet.CreateRow(rowIndex);
                ++rowIndex;


                if (i == 0)
                {
                    dataRow.CreateCell(1).SetCellValue(strdate);//参数
                    dataRow.CreateCell(2).SetCellValue(zs);//总数
                    dataRow.CreateCell(3).SetCellValue(ts);//套数
                    dataRow.CreateCell(4).SetCellValue((jzmj).ToString());//建筑面积(㎡)

                    SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
                }
                else if (i == 1)
                {
                    dataRow.CreateCell(0).SetCellValue(casetype);//案件类型
                   
                    dataRow.CreateCell(1).SetCellValue("上年度同期");//参数
                    dataRow.CreateCell(2).SetCellValue(lzs);//总数
                    dataRow.CreateCell(3).SetCellValue(lts);//套数
                    dataRow.CreateCell(4).SetCellValue((ljzmj).ToString());//建筑面积(㎡)
                    SetRowStyle(dataRow, cellstyle, 0, 1);//样式
                    SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
                   
                }
                else if (i == 2)
                {
                    dataRow.CreateCell(0).SetCellValue("");
                    dataRow.CreateCell(1).SetCellValue("与上年度对比");//参数
                    dataRow.CreateCell(2).SetCellValue((zs - lzs));//总数
                    dataRow.CreateCell(3).SetCellValue((ts - lts));//套数
                    dataRow.CreateCell(4).SetCellValue((jzmj - ljzmj).ToString());//建筑面积(㎡)

                    SetRowStyle(dataRow, bottomrow, 0, 1);
                    SetRowStyle(dataRow, headerRowStyle2, 1, 5);//样式
                }
            }

你这里的for 循环你设断点看看,按你的导出的效果看,你定义一个变量为1,就和rowIndex一样,你这个比较简单,都是每三行合并一次,在填充第一列数据的时候顺便合并就好了

int a = 1;
if (a <= rowIndex-2)
      {
             sheet.AddMergedRegion(new CellRangeAddress(a, a + 2, 0, 0));
             a = a + 2;
       }

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 10:53

@Kiss丿残阳: 我上面说错了,我写的那段你放在最后面,放在 workbook.Write(ms);前面,然后导出看看效果如何

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 10:57

@Kiss丿残阳: 我代码写错了,应该是这样子

for (int a = 1; a <= rowIndex - 2; a = a + 2)
{
       sheet.AddMergedRegion(new CellRangeAddress(a, a + 2, 0, 0));
}

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 11:05

@潘雪婷: 好的,谢谢我先看下效果咯

Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-30 11:14

@Kiss丿残阳: 不客气,也不知道行不行,希望可以帮到你而已

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 11:14

@潘雪婷: 非常感谢你给我思路问题已解决

Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-30 11:27

@Kiss丿残阳: 不客气,解决了就好,互相帮助嘛,谁都有有困难的时候。

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 11:28

@潘雪婷: 多谢你提供思路给我这个是我调试好了的效果刚好是//合并第一列每每3个单元格合并为一个单元格

#region //合并第一列每每3个单元格合并为一个单元格

for (Int32 a = 1; a <= rowIndex - 3; a = a + 3)
{
CellRangeAddress range = new CellRangeAddress(a, a + 2, 0, 0);
sheet.AddMergedRegion(range);

}
#endregion

Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-30 14:07

@Kiss丿残阳: 額,看來我的思路还是有些偏差,不过你解决了就好了,结果都是一样的,发现你的习惯非常好,还写注释,我每次都不写,感觉好麻烦,但确实很有用,我每次都是做完就不管了

潘雪婷 | 园豆:204 (菜鸟二级) | 2015-09-30 14:13
其他回答(1)
0

用NPOI吧

LiveCoding | 园豆:497 (菜鸟二级) | 2015-09-26 02:18

对啊用的是npoi  

支持(0) 反对(0) Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-26 10:02

那这样的单元格怎样合并呢,希望你能够给我个思路

支持(0) 反对(0) Kiss丿残阳 | 园豆:190 (初学一级) | 2015-09-26 15:12

@Kiss丿残阳:我自己没有去实现这个功能,不过这个功能官方DEMO也有吧。

支持(0) 反对(0) LiveCoding | 园豆:497 (菜鸟二级) | 2015-09-27 21:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册