شما می توانید یک جدول به عنوان ضریب ایجاد بکنید و با جدول بدست آمده از فایل اکسل، آن را ادغام کنید. اگر همه کاربران از یک ضریب استفاده می کنند و ضریب ها براساس کاربر تغییر نمی کند select بدون شرط در غیر این صورت کوئری select روی جدول ضریبتون از رو براساس کاربر ایجاد می کنید.
برای نمونه من جدول رو به صورت دستی در برنامه ایجاد کردم که کلید اصلی F1 هست:
f1 : نام شهر (که همنام با ستون فایل اکسل شماست) | factor: ضریب مصرف
private DataTable FillFactor()
{
var dt = new DataTable("MyTown");
dt.Columns.Add("f1", typeof (string));
dt.Columns.Add("Factor", typeof (int));
dt.PrimaryKey = new[] { dt.Columns[0] };
dt.Rows.Add("تهران", 2);
dt.Rows.Add("اصفهان", 3);
dt.Rows.Add("شیراز", 5);
return dt;
}
اول از همه دستور Select رو به شکل زیر تغییر بده تا براساس شهر مقادیر با هم جمع بشوند: string strSQL = "SELECT f1,sum(f2) as [sum] FROM [Sheet1$] group by f1";
f1 و f2 اسم ستون هات هست که با انتخاب فایل و دستور select * در دیتاگرید نشون داد.
f1 رو کلید اصلی قرار میدی.
حالا کاری که باید انجام بشه ادغام دو جدول باهم هست که با دستور زیر انجام می شود:
dTable.Merge(dt);
بدین ترتیب ستون های همنام و کلید (یعنی F1) با هم ادغام می شوند.
حالا شما باید یک ستون محاسباتی ایجاد کنید که از ضرب دو ستون sum و factor به وجود می آید:
dTable.Columns.Add("result", typeof (int));
dTable.Columns["Result"].Expression = "sum * Factor";
در نهایت حاصل جمع سطرها رو بدین ترتیب محاسبه می کنیم:
label1.Text = "امتیاز:"+dTable.Compute("sum(Result)", "").ToString();
که در کل کد button1_Click شما اینجوری میشه:
OpenFileDialog of = new OpenFileDialog();
of.Filter = "Excel 2007 Files|*.xlsx";
of.Title = "Open Excel 2007 Files";
DialogResult dr = new DialogResult();
dr = of.ShowDialog();
if (dr == DialogResult.Cancel)
return;
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source= " + of.FileName +
" ;Extended Properties=\"Excel 12.0;HDR=No;\"";
var dt = FillFactor();
string strSQL = "SELECT f1,sum(f2) as [sum] FROM [Sheet1$] group by f1";
OleDbConnection excelConnection = new OleDbConnection(connectionString);
excelConnection.Open();
OleDbCommand dbCommand = new OleDbCommand(strSQL, excelConnection);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);
DataTable dTable = new DataTable();
dTable.PrimaryKey = new[] { dTable.Columns["f1"] };
dataAdapter.Fill(dTable);
dTable.Merge(dt);
dTable.Columns.Add("result", typeof (int));
dTable.Columns["Result"].Expression = "sum * Factor";
label1.Text = "امتیاز:"+dTable.Compute("sum(Result)", "").ToString();
DataGridView1.DataSource = dTable;
dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();
excelConnection.Close();
excelConnection.Dispose();
}
موفق باشید!