本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";
}
}
}