从C#填充excel工作表中的3列,而不跨行重复值
抱歉,如果问题标题有点奇怪。我想用一个由3列组成的复合主键填充500个excel行。两列自动生成介于1和50之间的随机整数,第三列的日期介于2006年1月1日和2013年12月31日之间。所以我想有500行,每行有3个不同的组合。这是我的密码从C#填充excel工作表中的3列,而不跨行重复值,c#,excel,composite-primary-key,C#,Excel,Composite Primary Key,抱歉,如果问题标题有点奇怪。我想用一个由3列组成的复合主键填充500个excel行。两列自动生成介于1和50之间的随机整数,第三列的日期介于2006年1月1日和2013年12月31日之间。所以我想有500行,每行有3个不同的组合。这是我的密码 Type excelType = Type.GetTypeFromProgID("Excel.Application"); dynamic excel = Activator.CreateInstance(excelTyp
Type excelType = Type.GetTypeFromProgID("Excel.Application");
dynamic excel = Activator.CreateInstance(excelType);
excel.visible = true;
excel.Workbooks.Add();
Random rnd = new Random();
dynamic sheet = excel.ActiveSheet;
for (int i = 1; i <= 500; i++)
{
sheet.Cells[i, "A"] = rnd.Next(1,50);
sheet.Cells[i, "B"] = rnd.Next(1,50);
sheet.Cells[i, "C"] = RandomDay();
我真的不确定这是否有效,加上它运行缓慢,它必须反复迭代以检查组合是否存在。有人有更好更快的解决方案吗?
谢谢大家! 如果您的约束允许,我建议您在excel之外生成唯一的值,然后将它们插入excel,这样您就可以将它们放入元组字典中 这样,您可以通过从值创建字符串并将其用作字典中的键来检查预先存在的值。然后迭代字典值并将它们插入excel 哈希表(字典是什么)是固定的查找时间,因此可以节省大量时间来保证唯一性
Dictionary<String,Tuple<int,int,DateTime>> store = new Dictionary<String, Tuple<int, int, DateTime>>();
for (int i = 0; i < 500; i++)
{
int n1 = rnd.Next(1,50);
int n2 = rnd.Next(1,50);
DateTime dt = RandomDay();
String key = n1.ToString() + n2.ToString() + dt.ToString();
while (store.ContainsKey(key)) {
n1 = rnd.Next(1,50);
n2 = rnd.Next(1,50);
dt = RandomDay();
key = n1.ToString() + n2.ToString() + dt.ToString();
}
store.Add(key, new Tuple(n1, n2, dt));
}
字典存储=新建字典();
对于(int i=0;i<500;i++)
{
int n1=下一个rnd(1,50);
int n2=下一个(1,50)rnd;
DateTime dt=RandomDay();
字符串键=n1.ToString()+n2.ToString()+dt.ToString();
while(store.ContainsKey(键)){
n1=rnd.下一个(1,50);
n2=下一个(1,50)rnd;
dt=随机日();
key=n1.ToString()+n2.ToString()+dt.ToString();
}
添加(键,新元组(n1,n2,dt));
}
要添加到excel,只需在store.Values上迭代。从我的手机上写,所以我写不了多少。定义一个范围(range=sheet.range(“A1:D20”)),然后为其值指定一个二维数组(range.value=array)。您可以用do-while循环替换while循环,以消除for循环开始时的冗余密钥创建。
public static DateTime RandomDay()
{
DateTime start = new DateTime(2006, 1, 1);
DateTime end = new DateTime(2013, 12, 31);
Random gen = new Random();
int range = (end - start).Days;
return start.AddDays(gen.Next(range));
}
Dictionary<String,Tuple<int,int,DateTime>> store = new Dictionary<String, Tuple<int, int, DateTime>>();
for (int i = 0; i < 500; i++)
{
int n1 = rnd.Next(1,50);
int n2 = rnd.Next(1,50);
DateTime dt = RandomDay();
String key = n1.ToString() + n2.ToString() + dt.ToString();
while (store.ContainsKey(key)) {
n1 = rnd.Next(1,50);
n2 = rnd.Next(1,50);
dt = RandomDay();
key = n1.ToString() + n2.ToString() + dt.ToString();
}
store.Add(key, new Tuple(n1, n2, dt));
}