excel脚本(完成)

本C#脚本用于两个excel文件查找相应的属性并对其赋值,最下边放有例子。

最新更新请看:两文件相同项赋值Excel的脚本

新版,处理效率提高:

using System;
using OfficeOpenXml; // 用于处理Excel文件的库
using System.IO; // 用于文件操作
using System.Windows.Forms; // 用于显示文件选择对话框
using System.Collections.Generic; // 用于使用字典和列表
using System.Threading.Tasks; // 用于并行处理

namespace excel_c_
{
    internal class Program
    {
        // 用于存储总表和字典表文件的路径
        public static string summaryFilePath;
        public static string ddicFilePath;
        public static string header_initiative;
        public static string cellValue;
        public static double doubleValue;

        [STAThread]
        static void Main(string[] args)
        {
            // 打开文件对话框让用户选择总表的Excel文件
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "选择总表的Excel文件";
            openFileDialog.Filter = "Excel文件 (*.xlsx;*.xls)|*.xlsx;*.xls|All files (*.*)|*.*";
            summaryFilePath = booleanPathed(openFileDialog); // 获取总表的文件路径

            // 如果用户选择了无效文件,显示错误信息并退出程序
            if (summaryFilePath.Equals("err"))
            {
                MessageBox.Show("操作错误!", "请从新打开软件");
                Environment.Exit(0);
            }

            // 打开文件对话框让用户选择字典表的Excel文件
            OpenFileDialog openFileDialogDDIC = new OpenFileDialog();
            openFileDialogDDIC.Title = "选择字典表的Excel文件";
            openFileDialogDDIC.Filter = "Excel文件 (*.xlsx;*.xls)|*.xlsx;*.xls|All files (*.*)|*.*";
            ddicFilePath = booleanPathed(openFileDialogDDIC); // 获取字典表的文件路径

            // 如果用户选择了无效文件,显示错误信息并退出程序
            if (ddicFilePath.Equals("err"))
            {
                MessageBox.Show("操作错误!", "请从新打开软件");
                Environment.Exit(0);
            }

            // 进行匹配和写入操作
            MatchingAssignment(summaryFilePath, ddicFilePath);

            // 显示完成信息并退出程序
            //MessageBox.Show("完成写入!", "程序运行结束");
            Environment.Exit(0);
        }

        // 打开文件对话框并返回选择的文件路径
        static string booleanPathed(OpenFileDialog openFileDialog)
        {
            // 如果用户选择了文件
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string FilePath = openFileDialog.FileName;
                // 检查文件是否存在
                if (!File.Exists(FilePath))
                {
                    MessageBox.Show("文件不存在,请检查路径!", "err");
                    Environment.Exit(0); // 如果文件不存在,退出程序
                }
                return FilePath; // 返回文件路径
            }
            return "err"; // 如果未选择文件,返回错误标志
        }

        // 将字典表与总表进行匹配并进行写入操作
        static void MatchingAssignment(string summaryFilePath, string ddicFilePath)
        {
            // 设置EPPlus许可证上下文为非商业用途
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            // 预先加载字典表到内存
            var ddicMap = LoadDictionary(ddicFilePath);

            // 打开总表的Excel文件
            using (var package = new ExcelPackage(new FileInfo(summaryFilePath)))
            {
                // 获取第一个工作表
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];

                // 检查工作表是否有内容
                if (worksheet.Dimension != null)
                {
                    int colCount = worksheet.Dimension.End.Column; // 获取列数
                    int rowCount = worksheet.Dimension.End.Row;    // 获取行数

                    Console.WriteLine($"行列 ({rowCount},{colCount})");



                    // 将表头和数据存入内存中以提高访问速度
                    var headers = new List<string>(); // 用于存储表头
                    var data = new object[rowCount, colCount]; // 用于存储工作表的数据
                    //var data = new object[rowCount + 1, colCount]; // 用于存储工作表的数据


                    // 读取表头
                    for (int col = worksheet.Dimension.Start.Column; col <= colCount; col++)
                    {
                        headers.Add(worksheet.Cells[1, col].Value?.ToString());
                    }

                    // 修改读取数据的逻辑
                    for (int row = worksheet.Dimension.Start.Row; row <= rowCount; row++)
                    {
                        for (int col = worksheet.Dimension.Start.Column; col <= colCount; col++)
                        {
                            object cellValue = worksheet.Cells[row, col].Value;
                            string LodeData = Convert.ToString(cellValue) ?? " "; // 默认值

                            if (string.IsNullOrEmpty(LodeData))
                            {
                                LodeData = " "; // 如果 LodeData 为 null 或空,则赋予空格作为默认值
                            }

                            data[row - 1, col - 1] = LodeData; // 将数据存入内存
                        }
                    }

                    Parallel.For(0, rowCount, row =>
                    {
                        for (int col = 0; col < headers.Count; col++)
                        {
                            string headerInitiative = headers[col];
                            string cellValue = data[row, col]?.ToString();
                            string ID = "";


                            //Console.WriteLine($"现在的行列 ({row},{col})");
                            if (cellValue == null || cellValue == " ")
                            {

                            }
                            else if (!string.IsNullOrEmpty(headerInitiative) && !string.IsNullOrEmpty(cellValue) && row != 0)
                            {
                                ID = LookupInDdicMap(ddicMap, headerInitiative);

                                //Console.WriteLine($"头为: {headerInitiative} ({row},{col}) 值: {data[row, col]?.ToString()} ID: {ID}");

                                if (!ID.Equals("nohaveID"))// && !string.IsNullOrEmpty(cellValue)
                                {
                                    // Console.WriteLine($"头为: {headerInitiative} ({row},{col}) 值: {data[row, col]?.ToString()} ID: {ID}");
                                    //Console.WriteLine($"---------------------------------------------------------");
                                    for (int j = 0; j < colCount; j++)
                                    {
                                        if (ID.Equals(data[0, j]?.ToString()))
                                        {
                                            data[row, j] = 1;
                                            // Console.WriteLine($"写入1到 ({row},{j})");
                                        }
                                    }
                                }
                                //else
                                //{
                                //    for (int j = 0; j < colCount; j++)
                                //    {
                                //        if (ID.Equals(data[0, j]?.ToString()))
                                //        {
                                //            data[row, j] = 0;
                                //            Console.WriteLine($"写入0到 ({row},{j})");
                                //        }
                                //    }
                                //}
                            }


                        }
                    });
                    // 将处理后的数据写回工作表
                    for (int row = 0; row < rowCount; row++)
                    {
                        for (int col = 0; col < colCount; col++)
                        {
                            worksheet.Cells[row + 1, col + 1].Value = data[row, col]; // 写回数据
                        }
                    }

                    // 使用 SaveFileDialog 让用户选择保存文件的名称和位置
                    SaveFileDialog saveFileDialog = new SaveFileDialog();
                    saveFileDialog.Title = "保存修改后的Excel文件";
                    saveFileDialog.Filter = "Excel文件 (*.xlsx)|*.xlsx";
                    saveFileDialog.FileName = "Hil_IN.xlsx"; // 默认文件名

                    if (saveFileDialog.ShowDialog() == DialogResult.OK)
                    {
                        string new_FilePath = saveFileDialog.FileName;
                        package.SaveAs(new FileInfo(new_FilePath));
                        MessageBox.Show($"文件已保存到: {new_FilePath}", "保存成功");
                    }
                    else
                    {
                        MessageBox.Show("未选择文件保存位置,操作已取消。", "取消保存");
                    }

                }
                else
                {
                    Console.WriteLine("工作表是空的。"); // 如果工作表为空,输出提示信息
                }

                 保存Excel文件
                //string newFilePath = Path.Combine(Path.GetDirectoryName(summaryFilePath), "Hil_IN.xlsx");
                //package.SaveAs(new FileInfo(newFilePath));


            }
        }

        static Dictionary<string, string> LoadDictionary(string ddicFilePath)
        {
            var ddicMap = new Dictionary<string, string>();
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (var package = new ExcelPackage(new FileInfo(ddicFilePath)))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
                if (worksheet.Dimension.Address != null)
                {
                    // 遍历字典表的每一行,假设表头从第2行开始
                    for (int row = worksheet.Dimension.Start.Row; row <= worksheet.Dimension.End.Row; row++)
                    {
                        string headerFromDdic = worksheet.Cells[row, 2].Value?.ToString();  // 第二列是表头
                        string id = worksheet.Cells[row, 3].Value?.ToString();              // 第三列是ID

                        // 确保字典表的第二列(表头)和第三列(ID)都不为空
                        if (!string.IsNullOrEmpty(headerFromDdic) && !string.IsNullOrEmpty(id))
                        {
                            // 将字典表的第二列作为键,第三列作为值
                            if (!ddicMap.ContainsKey(headerFromDdic))
                            {
                                ddicMap[headerFromDdic] = id;
                            }
                        }
                    }
                }
            }
            return ddicMap;
        }

        static string LookupInDdicMap(Dictionary<string, string> ddicMap, string headerInitiative)
        {
            // 在字典表中查找表头对应的ID
            if (ddicMap.TryGetValue(headerInitiative, out var id))
            {
                return id; // 返回ID
            }
            return "nohaveID"; // 如果找不到,返回标志
        }
    }
}

下面是老版,处理效率太低:

using System;
using OfficeOpenXml;
using System.IO;
using System.Windows.Forms;


namespace excel_c_
{
    internal class Program
    {

        public static string summaryFilePath;
        public static string ddicFilePath;
        public static string header_initiative;
        public static string cellValue;
        public static double doubleValue;
        public static int col2;

        [STAThread]
        static void Main(string[] args)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "选择总表的Excel文件";
            openFileDialog.Filter = "Excel文件 (*.xlsx;*.xls)|*.xlsx;*.xls|All files (*.*)|*.*";
            summaryFilePath = booleanPathed(openFileDialog);

            OpenFileDialog openFileDialogDDIC = new OpenFileDialog();
            openFileDialogDDIC.Title = "选择字典表的Excel文件";
            openFileDialogDDIC.Filter = "Excel文件 (*.xlsx;*.xls)|*.xlsx;*.xls|All files (*.*)|*.*";
            ddicFilePath = booleanPathed(openFileDialogDDIC);

            if (summaryFilePath.Equals("err") || ddicFilePath.Equals("err"))
            {
                return;
            }

            MatchingAssignment(summaryFilePath, ddicFilePath);

            MessageBox.Show("完成写入!", "程序运行结束");
            Environment.Exit(0);
        }

        static string booleanPathed(OpenFileDialog openFileDialog)
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string FilePath = openFileDialog.FileName;
                if (!File.Exists(FilePath))
                {
                    MessageBox.Show("文件不存在,请检查路径!", "err");
                    Environment.Exit(0);
                }
                //Console.WriteLine("操作完成。");
                return (FilePath);
            }
            return ("err");
        }


        static void MatchingAssignment(string summaryFilePath, string ddicFilePath)
        {
            string ID = "";
            // 使用EPPlus打开Excel文件  
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 设置许可证上下文为非商业  
            using (var package = new ExcelPackage(new FileInfo(summaryFilePath)))
            {
                // 获取第一个工作表(索引从0开始)  
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];

                // 假设我们要读取第一行第一列的值  
                if (worksheet.Dimension.Address != null)
                {
                    col2 = worksheet.Dimension.End.Column;
                    // 你也可以遍历整个工作表  
                    for (int row = worksheet.Dimension.Start.Row + 1; row <= worksheet.Dimension.End.Row; row++)
                    {
                        for (int col = worksheet.Dimension.Start.Column; col <= worksheet.Dimension.End.Column; col++)
                        {
                            //当前单元格标头
                            header_initiative = worksheet.Cells[1, col].Value?.ToString();

                            cellValue = worksheet.Cells[row, col].Value?.ToString();

                            ID = LookUpDdic(ddicFilePath, header_initiative, cellValue);
                            //Console.Write($"单元格的值是: {cellValue}");

                            //写进去
                            for (int j = 1; j <= col2; j++)
                            {
                                if (ID.Equals(worksheet.Cells[1, j].Value?.ToString()))//找列
                                {
                                    if (Convert.ToInt32(worksheet.Cells[row, j].Value) != 1)//判断它之前是否为1
                                    {
                                        //if (!string.IsNullOrEmpty(cellValue))//********不等于空就写入1********
                                        if (!string.IsNullOrEmpty(cellValue) && (double.TryParse(cellValue, out doubleValue) && doubleValue != 0))//不等于空并且不等于0就写入1
                                        {
                                            worksheet.Cells[row, j].Value = 1;
                                            break;
                                        }
                                        else
                                        {
                                            worksheet.Cells[row, j].Value = 0;
                                            break;
                                        }
                                    }
                                }

                            }
                        }
                    }
                }
                else
                {
                    Console.WriteLine("工作表是空的。");
                }
                package.Save();
            }
        }

        static string LookUpDdic(string ddicFilePath, string header_initiative, string cellValue)
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 设置许可证上下文为非商业  
            using (var package = new ExcelPackage(new FileInfo(ddicFilePath)))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];

                if (worksheet.Dimension.Address != null)
                {
                    for (int row = worksheet.Dimension.Start.Row; row <= worksheet.Dimension.End.Row; row++)
                    {
                        //只需要遍历第二列就行
                        var cellValueDdic = worksheet.Cells[row, 2].Value?.ToString();

                        if (header_initiative.Equals(cellValueDdic))
                        {
                            return worksheet.Cells[row, 2 + 1].Value?.ToString();
                        }
                    }
                    return "nohaveID";
                }
            }
            return "nohaveID";
        }

    }
}

格式化代码:‌在Windows上,‌使用Ctrl+K, Ctrl+D快捷键可以格式化当前文档。‌如果想要格式化选定的代码块,‌可以先使用Ctrl+A全选代码,‌然后按Ctrl+K, Ctrl+F进行格式化。‌

EG:如果总表每列每个单元格不为空和0则在相应ID下输入1,反之输入0,字典表要有第一列(值随便),总表要在最后一列多写一列(防止最后一列被刷掉)

下方为最原始版本:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OfficeOpenXml;
using System.IO;
using System.Windows.Forms;


namespace excel_c_
{
    internal class Program
    {

        public static string summaryFilePath;
        public static string ddicFilePath;
        public static string header_initiative;
        public static string cellValue;
        public static double doubleValue;
        //public static int row2;     //第二次写表
        public static int col2;

        [STAThread]
        static void Main(string[] args)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "选择总表的Excel文件";
            openFileDialog.Filter = "Excel文件 (*.xlsx;*.xls)|*.xlsx;*.xls|All files (*.*)|*.*";
            summaryFilePath = booleanPathed(openFileDialog);

            OpenFileDialog openFileDialogDDIC = new OpenFileDialog();
            openFileDialogDDIC.Title = "选择字典表的Excel文件";
            openFileDialogDDIC.Filter = "Excel文件 (*.xlsx;*.xls)|*.xlsx;*.xls|All files (*.*)|*.*";
            ddicFilePath = booleanPathed(openFileDialogDDIC);

            if (summaryFilePath.Equals("err") || ddicFilePath.Equals("err"))
            {
                return;
            }
            
            MatchingAssignment(summaryFilePath, ddicFilePath);

            MessageBox.Show("完成写入!", "程序运行结束");
            Environment.Exit(0);
        }

        static string booleanPathed(OpenFileDialog openFileDialog)
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string FilePath = openFileDialog.FileName;
                if (!File.Exists(FilePath))
                {
                    Console.WriteLine("文件不存在,请检查路径!");
                    return ("err");
                }
                Console.WriteLine("操作完成。");
                return (FilePath);
            }
            return ("err");
        }


        static void MatchingAssignment(string summaryFilePath, string ddicFilePath)
        {
            string ID="";
            // 使用EPPlus打开Excel文件  
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 设置许可证上下文为非商业  
            using (var package = new ExcelPackage(new FileInfo(summaryFilePath)))
            {
                // 获取第一个工作表(索引从0开始)  
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];


                // 假设我们要读取第一行第一列的值  
                if (worksheet.Dimension.Address != null)
                {
                    //row2 = worksheet.Dimension.End.Row;
                    col2 = worksheet.Dimension.End.Column;
                    // 你也可以遍历整个工作表  
                    for (int row = worksheet.Dimension.Start.Row + 1; row <= worksheet.Dimension.End.Row; row++)
                    {
                        for (int col = worksheet.Dimension.Start.Column; col <= worksheet.Dimension.End.Column; col++)
                        {
                            //当前单元格标头
                            header_initiative = worksheet.Cells[1, col].Value?.ToString();

                            cellValue = worksheet.Cells[row, col].Value?.ToString();


                            Console.Write($"({row},{col}) ");
                            if (row == 1)
                                Console.Write(header_initiative);
                            else
                            {
                                ID = LookUpDdic(ddicFilePath, header_initiative, cellValue);
                                Console.Write($"单元格的值是: {cellValue}");
                            }

                            Console.WriteLine($"查到的ID为,{ID}) ");


                            //写进去

                            for (int j = 1; j <= col2; j++)
                            {
                                if (ID.Equals(worksheet.Cells[1, j].Value?.ToString()))//找列
                                {
                                    if (Convert.ToInt32(worksheet.Cells[row, j].Value) != 1)//判断它之前是否为1
                                    {
                                        //if (!string.IsNullOrEmpty(cellValue))//********不等于空就写入1********
                                        if (!string.IsNullOrEmpty(cellValue) && (double.TryParse(cellValue, out doubleValue) && doubleValue != 0))//不等于空并且不等于0就写入1
                                        {
                                            worksheet.Cells[row, j].Value = 1;

                                            Console.WriteLine($"({row},{j}) 写入 1");

                                            break;
                                        }
                                        else
                                        {
                                            worksheet.Cells[row, j].Value = 0;
                                            Console.WriteLine($"({row},{j}) 写入 0");
                                            break;
                                        }
                                    }
                                }

                            }
                        }

                        //Console.WriteLine(); // 换行  
                    }
                }
                else
                {
                    //package.SaveAs(summaryFilePath);
                    Console.WriteLine("工作表是空的。");
                }
                package.Save();
            }
        }

        static string LookUpDdic(string ddicFilePath, string header_initiative, string cellValue)
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 设置许可证上下文为非商业  
            using (var package = new ExcelPackage(new FileInfo(ddicFilePath)))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0];

                if (worksheet.Dimension.Address != null)
                {
                    for (int row = worksheet.Dimension.Start.Row; row <= worksheet.Dimension.End.Row; row++)
                    {
                        //只需要遍历第二列就行
                        var cellValueDdic = worksheet.Cells[row, 2].Value?.ToString();

                        if (header_initiative.Equals(cellValueDdic))
                        {
                            return worksheet.Cells[row, 2 + 1].Value?.ToString();
                        }                       
                    }
                    return "nohaveID";
                }
            }
            return "nohaveID";
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值