ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.net npoi 导出合并单元格

2021-07-16 16:03:16  阅读:178  来源: 互联网

标签:item 单元格 合并 ids npoi dts cellstyles net


          我写这个是因为 一个妹子(因为我喜欢这妹子,不然谁鸟你,所以身边对你好的异性一定对你图谋不轨,就像我)请教我这个问题

          导出exexl,大多数人百度一下就知道怎么写,但合并单元格就要有一定思考,我也看过大量的资料,但我觉得有解决问题的思路很重要,废话不说了  ,直接来看代码:  

    CellRangeAddress(y, y1, x, x1)分别代表这  合并的初始行,结束行,初始列,结束列

 

                CellRangeAddress region = new CellRangeAddress(y, y1, x, x1);//合并单元格
                sheet.AddMergedRegion(region);
                cell = sheet.GetRow(item.Ya).GetCell(2);
                cell.CellStyle = cellstyles;//合并单元格后的样式

这里的

cellstyles合并单元格的样式,我就不做解释,直接贴代码:
            //这里就是合并单元格后单元格的样式
            //在合并单元格后  cell.CellStyle = cellstyles;   这样就ok了  字体大小也可以在这里该
            NPOI.SS.UserModel.ICellStyle cellstyles = workbook.CreateCellStyle();//设置垂直居中格式
            cellstyles.VerticalAlignment = VerticalAlignment.Center;//垂直居中
            cellstyles.Alignment = HorizontalAlignment.Left;//水平居左
            cellstyles = workbook.CreateCellStyle();//设置垂直居中格式
            cellstyles.VerticalAlignment = VerticalAlignment.Center;//垂直居中
            cellstyles.Alignment = HorizontalAlignment.Left;//水平居中

上面都是凑字数,接下来说一说  我对合并上下单元格的理解想法就是 :用数组或者集合存放合并单元格的坐标,对就是这么简单,算了直接贴代码:

            //写入列
            for (int i = 0; i < dts.Columns.Count; i++)
            {
                row.CreateCell(i).SetCellValue(dts.Columns[i].ColumnName);
            }
            //根据上次代码  做的改进,用一个集合来存放 合并单元格的位置,因为  我们这只需要上下单元格合并 所以  一条数据只存放2个值,代表这 从第几行 到第几行  注意  后者的值必定大于等于前者
            //如  是上下左右的单元格 合并一条数据就要存放4个值  
            List<indexs> ids = new List<indexs>();
            bool flag = true; ;
            string temp = "";
            //写入行数据
            for (int i = 0; i < dts.Rows.Count; i++)
            {
                /*
                 标题占一行
                 列名占一行
                  所以 row = sheet.CreateRow(i + 2);    这里是 i+2
                */
                row = sheet.CreateRow(i + 2);
                for (int j = 0; j < dts.Columns.Count; j++)
                {
                    if (dts.Columns[j].ColumnName == "IDNumber")//判断是否到需要合并的单元格
                    {
                        if (i != 0)
                        {
                            if (temp != dts.Rows[i][j].ToString().Trim())
                            {
                                temp = dts.Rows[i][j].ToString().Trim();
                                if (temp == dts.Rows[i - 1][j].ToString().Trim())
                                {
                                    ids.Add(new indexs
                                    {
                                        Ya = i + 1,
                                    });
                                }
                                else
                                {
                                    if (ids.Count() != 0 && ids[ids.Count - 1].Yb == 0)
                                    {
                                        ids[ids.Count - 1].Yb = i + 1;
                                        flag = true;
                                    }
                                }
                            }
                            else
                            {
                                if (temp == dts.Rows[i - 1][j].ToString().Trim())
                                {
                                    //flag  防止出现重复
                                    if (flag)
                                    {
                                        //出现相同订单号的位置
                                        flag = false;
                                        ids.Add(new indexs
                                        {
                                            Ya = i + 1,
                                        });
                                    }
                                    temp = dts.Rows[i][j].ToString().Trim();//感觉这里可以不写这个  你可以试试
                                }
                                //防止最后一条数据也是合并项
                                if (i == dts.Rows.Count - 1)
                                {
                                    ids[ids.Count - 1].Yb = i + 2;
                                }
                            }
                        }
                    }
                    //写入单元格
                    var col = row.CreateCell(j);
                    col.SetCellValue(dts.Rows[i][j].ToString().Trim());
                }
            }

            //这里就是合并单元格后单元格的样式
            //在合并单元格后  cell.CellStyle = cellstyles;   这样就ok了  字体大小也可以在这里该
            NPOI.SS.UserModel.ICellStyle cellstyles = workbook.CreateCellStyle();//设置垂直居中格式
            cellstyles.VerticalAlignment = VerticalAlignment.Center;//垂直居中
            cellstyles.Alignment = HorizontalAlignment.Left;//水平居左
            cellstyles = workbook.CreateCellStyle();//设置垂直居中格式
            cellstyles.VerticalAlignment = VerticalAlignment.Center;//垂直居中
            cellstyles.Alignment = HorizontalAlignment.Left;//水平居中

            foreach (var item in ids)
            {
                //CellRangeAddress(item.Ya, item.Yb, 0, 0) 这里的两个0是没行中第一个单元格   而item.Ya, item.Yb  代表第几行到第几行    我们需求是上下相同的订单号合并所以只需要改变这个的前两个值,后面两个值  随之递增   
                //因为 我们这只需要合并上下单元格的序号    而序号在每行的第一个单元格  所以这里的后两个值都是0,
                CellRangeAddress region = new CellRangeAddress(item.Ya, item.Yb, 0, 0);//合并单元格
                sheet.AddMergedRegion(region);
                cell = sheet.GetRow(item.Ya).GetCell(0);
                cell.CellStyle = cellstyles;
            }

哎!,要是问我的是个男的,上面代码一个中文字都不会存在,所以还在为合并单元格发愁的你们 ,一定要感谢这妹子。

还有dome写的是合并上下单元格,但左右单元格的合并大致是一样的

心情好给你们看看我写的dome:

链接:https://pan.baidu.com/s/1zp6rVsQEn_PY2mGLalnlfA
提取码:1580

 

标签:item,单元格,合并,ids,npoi,dts,cellstyles,net
来源: https://www.cnblogs.com/panliwu521801314/p/15020488.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有