xls不规则表合并单元格读取

本文介绍了一种使用OfficeOpenXml库在C#中解析Excel文件的方法,包括定位特定工作表、查找特定列并读取内容,同时处理了单元格合并的情况,并实现了数据去重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

            ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
            using (ExcelPackage package = new ExcelPackage(new FileInfo(xlsPath)))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets["Result"];//读固定的表名字
                if (worksheet == null)
                {
                    err = ("档案中没有Result的工作本(Sheet),请检查.");
                    return false;
                }
                //遍历
                var start = worksheet.Dimension.Start;
                var end = worksheet.Dimension.End;
                //确定列
                for (int row = 3; row <= 5; row++)
                {
                    for (int col = 1; col <= end.Column; col++)
                    {
                        string cellValue = worksheet.Cells[row, col].Text;
                        if (cellValue.Contains("Finished Good "))  //自定义要读取的列
                        {
                            ExcelColumnIndex["FG"] = col;
                        }
                        if (cellValue.Contains("Project Name"))
                        {
                            ExcelColumnIndex["MT"] = col;
                        }
                        if (cellValue.Contains("Test Program DOC"))
                        {
                            ExcelColumnIndex["SOFT"] = col;
                        }
                        if (cellValue.Contains("Vendor MAC"))
                        {
                            ExcelColumnIndex["MACSTART"] = col;
                        }
                        if (cellValue.Contains("使用MAC个数"))
                        {
                            ExcelColumnIndex["MACUSECOUNT"] = col;
                        }
                    }
                }

                List<string> DistinctPnMt = new List<string>();
                for (int row = 7; row < end.Row; row++)
                {//这里都是读取内容
                    string cellValue = worksheet.Cells[row, ExcelColumnIndex["FG"]].Text;
                    if (!string.IsNullOrEmpty(cellValue))
                    {
                        string macu = GetMegerValue(worksheet, row, ExcelColumnIndex["MACUSECOUNT"]).Trim();
                        if (!int.TryParse(macu, out int macUse))
                        {
                            macUse = 0;
                        }
                        string tempMt = worksheet.Cells[row, ExcelColumnIndex["MT"]].Text.Trim();
                        if (!Regex.IsMatch(tempMt, @" MT:[0-9]{1,10}"))
                        { continue; }
                        //有内容
                        MatchCollection tt = Regex.Matches(tempMt, @" MT:[0-9]{1,10}");
                        List<string> strList = new List<string>();
                        foreach (Match item in tt)
                        {
                            strList.Add(item.Value.Replace(":", ""));
                        }
                        strList = strList.Distinct().ToList();


                        if (strList.Count > 1)
                        {
                            continue;
                        }
                        Devolo_Pn_Maintain pn = new Devolo_Pn_Maintain()
                        {
                            Pn = cellValue,
                            MT = strList[0],
                            MacOui = GetMegerValue(worksheet, row, ExcelColumnIndex["MACSTART"]).Replace("-", "").Replace(":", "").Trim(),
                            MacUseQuantity = macUse,
                            ProgramDOC = GetMegerValue(worksheet, row, ExcelColumnIndex["SOFT"]).Trim(),
                        };

                        Devolo_Pn_Maintain tempDis = pn_List.FirstOrDefault(o => o.Pn.Equals(pn.Pn) && o.MT.Equals(pn.MT));

                        if (tempDis == null)
                        {
                            pn_List.Add(pn);
                        }
                        else
                        {
                            pn_List.Remove(tempDis);
                            DistinctPnMt.Add(tempDis.Pn + "," + tempDis.MT);
                        }
                    }
                }
                if (DistinctPnMt.Count > 0)
                {
                    err = "xls中有重复数据" + string.Join("\r\n", DistinctPnMt);
                    return false;
                }
            }
        /// <summary>
        /// 读取有合并单元格的内容,普通的单元格也可以读
        /// </summary>
        /// <param name="wSheet"></param>
        /// <param name="row"></param>
        /// <param name="column"></param>
        /// <returns></returns>
        public static string GetMegerValue(ExcelWorksheet wSheet, int row, int column)
        {
            string range = wSheet.MergedCells[row, column];
            if (range == null)
                if (wSheet.Cells[row, column].Value != null)
                    return wSheet.Cells[row, column].Value.ToString();
                else
                    return "";
            object value =
                wSheet.Cells[(new ExcelAddress(range)).Start.Row, (new ExcelAddress(range)).Start.Column].Value;
            if (value != null)
                return value.ToString();
            else
                return "";
        }

        Dictionary<string, int> ExcelColumnIndex = new Dictionary<string, int>()
        {
            {"FG",0 },
            {"MT",0 },
            {"SOFT",0 },
            {"MACSTART",0 },
            {"MACUSECOUNT",0 },
        };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值