首页 > 其他分享 >记录NPOI导出Excel并使用不同颜色标注特定条件相同的行

记录NPOI导出Excel并使用不同颜色标注特定条件相同的行

时间:2024-10-31 10:10:47浏览次数:1  
标签:特定条件 string Excel CurrentLength PositionDic NPOI WorkBook ExportData return

一、环境概述

开发工具:Visual Studio 2022
.Net环境:.Net Core 6.0
相关依赖:NPOI

二、基本概述

需求要实现导出的数据里如果连续行满足某个条件就用颜色标记,但是标记的区间要用不同颜色区分开,用了双指针,但是是记录了起始位置和偏移量,封装比较屎,这里主要记录一下思想。

三、代码实现
1、核心代码

        /// <summary>
        /// 用于获取线性表中需要标记的坐标(起始位置+偏移量)
        /// </summary>
        /// <param name="WorkBook"></param>
        /// <param name="ExportData"></param>
        /// <param name="comparer"></param>
        public static Dictionary<int,int>  GetMarkPosition(DataTable ExportData, Func<DataRow, DataRow, bool> comparer) {
            Dictionary<int, int> PositionDic = new Dictionary<int, int>();
            if (ExportData == null || ExportData.Rows.Count == 0)
            {
                return PositionDic;
            }
            int RowCount = ExportData.Rows.Count;
            int StartRow = 0;//开始指针
            int CurrentLength = 0;//偏移量
            for (int i = 1; i < RowCount; i++)
            {
                if (comparer(ExportData.Rows[i], ExportData.Rows[i - 1]))
                {
                    CurrentLength++;
                }
                else
                {
                    if (CurrentLength > 0)
                    {
                        PositionDic.Add(StartRow, CurrentLength);
                    }
                    StartRow = i;
                    CurrentLength = 0;
                }
            }
            if (CurrentLength > 0)
            {
                PositionDic.Add(StartRow, CurrentLength);
            }
            return PositionDic;
        }

        /// <summary>
        /// 用于标记连续相等的行
        /// </summary>
        /// <param name="WorkBook">用于获取样式的</param>
        /// <param name="Sheet">标记操作作用的Excel表</param>
        /// <param name="ExportData">数据</param>
        /// <param name="comparer">自定义的比较器</param>
        /// <param name="ColorAction">自定义的标记操作</param>
        public static void MarkSameRow(IWorkbook WorkBook,ISheet Sheet,DataTable ExportData, Func<DataRow, DataRow, bool> comparer,Action<IWorkbook,ISheet, KeyValuePair<int, int>,bool> ColorAction) {
            Dictionary<int,int> PositionDic = GetMarkPosition(ExportData, comparer);
            if (PositionDic==null||PositionDic.Count()==0) {
                return;
            }
            bool change = false;
            foreach (var item in PositionDic) {
                change = !change;
                ColorAction(WorkBook,Sheet,item, change);
            }
        }

2、实际使用

      //自定义的行比较的逻辑,作为委托参数
      private bool CompareRowData(DataRow CurRow, DataRow PreRow)
        {
            bool IsEquals = false;
            if (CurRow == null || PreRow == null)
            {
                return IsEquals;
            }
            string CurValue1 = Convert.ToString(CurRow[0]) ?? string.Empty;
            string CurValue2 = Convert.ToString(CurRow[1]) ?? string.Empty;

            string PreValue1 = Convert.ToString(PreRow[0]) ?? string.Empty;
            string PreValue2 = Convert.ToString(PreRow[1]) ?? string.Empty;
            if (CurValue1.Equals(PreValue1) && CurValue2.Equals(PreValue2))
            {
                IsEquals = true;
                return IsEquals;
            }
            return IsEquals;
        }
        //自定义的填充颜色的逻辑,作为委托参数
        private void FillColor(IWorkbook WorkBook, ISheet Sheet, KeyValuePair<int, int> Position, bool IsChange)
        {
            if (WorkBook == null)
            {
                return;
            }
            XSSFColor Color1 = ExcelUtils.GetXSSFColorWithRGB(68, 179, 225);
            XSSFColor Color2 = ExcelUtils.GetXSSFColorWithRGB(166, 166, 166);

            XSSFCellStyle ColorStyle1 = ExcelUtils.GetBGColorStyle(WorkBook, Color1);
            XSSFCellStyle ColorStyle2 = ExcelUtils.GetBGColorStyle(WorkBook, Color2);
            if (Sheet == null)
            {
                return;
            }
            for (int i = Position.Key + 2; i < Position.Key + Position.Value + 3; i++)
            {
                for(int j = 0; j < 9; j++) {
                    ICell Cell = ExcelUtils.GetCell(Sheet, i, j);
                    Cell.CellStyle = IsChange ? ColorStyle1 : ColorStyle2;
                }
            }
        }
        //实际使用
        ExcelUtils.MarkSameRow(WorkBook, Sheet, ExportData, CompareRowData, FillColor);
        

三、效果展示

标签:特定条件,string,Excel,CurrentLength,PositionDic,NPOI,WorkBook,ExportData,return
From: https://www.cnblogs.com/sitepoint/p/18517115

相关文章

  • Excel函数之VLOOKUP
    1.介绍VLOOKUP函数是Excel中的一个纵向查找函数,它与LOOKUP函数和HLOOKUP函数属于一类函数,在工作中都有广泛应用,例如可以用来查找数据,按列查找,在多个表格之间核对数据、传递数据,在多个表格之间快速导入数据等函数功能,主要用于查找和检索数据。2.使用VLOOKUP函数语法=VLOOK......
  • 使用C#制作Excel抽签窗体程序
    窗体功能有每次选择人数的选择及重置等,具体功能见下 publicpartialclassForm1:Form{publicintN1=0;//一次抽取数量publicintN2=0;//总共抽取数量publicintN3=0;//当前抽取数publicintN4=0;//总数publicForm1(){......
  • 为什么新建的Excel默认是xlsm格式?Excel新建或保存为xlsm格式的解决方法
    .xlsm格式是Excel中的一种特殊文件格式,它支持宏(Macro)功能,而最近一些小伙伴发现自己无论是新建还是另存保存的格式xlsx会自动变成xlsm后缀格式,那么这种情况要如何才能够解决呢?不清楚的小伙伴下面就来试试小编的方法吧。【更多精品素材欢迎前往办公之家下载】Excel新建或保存为......
  • 用Python将 UE5内存分析日志 提取到Excel表
            上篇文章我们已经实现了 “使用Python批量提取文本中,当某一行存在 “×××××”时获取这一行文字,并将所有提取的内容按顺序保存到一个新的文件中”。而后来我发现这个功能已经不能满足我的需求了,所以本次我们将重新对一个更复杂文件的内容进行批量提......
  • 如何使用python将多个Excel表格合并到同一张表格
    背景:在使用上位机对PCB进行测试时,每测一片板子,生成一张表格数据,但是后期需要对数据统一分析,因此需要合并成同一张表格。表格数据: 使用python将两个表格数据合并:importpandasaspdimportos#文件夹路径folder_path='333'#读取文件夹内所有Excel文......
  • 高校智慧平台SExcelExpErr存在SQL注入漏洞
    0x01阅读须知        本文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考。本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁......
  • Excel-多表数据查找匹配(VLOOKUP)
    ......
  • Excel-多表数据查找匹配(VLOOKUP)
    ......
  • Java EasyExcel 导出报内存溢出如何解决
    大家好,我是V哥。使用EasyExcel进行大数据量导出时容易导致内存溢出,特别是在导出百万级别的数据时。你有遇到过这种情况吗,以下是V哥整理的解决该问题的一些常见方法,分享给大家,欢迎一起讨论:EasyExcel大数据量导出常见方法1.分批写入EasyExcel支持分批写入数据,可以将数据分批......
  • java excel转pdf
    使用jacob实现Excel转PDF在使用jacob之前需要做一些准备,首先需要去下载jacob的压缩包jacob.zip,下载地址:https://github.com/freemansoft/jacob-project/releases/download/Root_B-1_21/jacob-1.21.zip解压之后,得到如下内容: 1、如果你是64位系统就用x64的dll,32位系统就用x......