سلام و وقت بخیر دوستان چگونه تعداد نام های شیت یک اکسل را داخل کمبوباکس نماش بدهم مثلا اگر سربرگ یک اکسل دارای چند شیت باشد نام آنها را داخل کمبوباکس قرار دهم با تشکر و سپاس
سلام و وقت بخیر دوستان چگونه تعداد نام های شیت یک اکسل را داخل کمبوباکس نماش بدهم مثلا اگر سربرگ یک اکسل دارای چند شیت باشد نام آنها را داخل کمبوباکس قرار دهم با تشکر و سپاس
سلام و روز خوش
خب اول باید بتونین خود فایل اکسل رو باز کنین.
یک راه این هست که از کتابخانه office.interop.excel استفاده کنین (کافی هست از nuget manager نصبش کنین)
using EXCEL= microsoft.office.interop.excel;
string PATH= "path to excel file";
EXCEL.application APP= new EXCEL.application();
APP.visible= false;
EXCEL.workbook WB = APP.workbooks.open(PATH);
for (int i=1 ; i <= WB.worksheets.count ; i++)
{
combobox.items.add(WB.worksheets[i].name);
}
APP.workbooks.close();
APP.quit();
کتابخانه های دیگه هم هست: مثل LinqToExcel
using LinqToExcel;
string PATH = "path to excel file";
using (ExcelQueryFactory EQF = new ExcelQueryFactory(path))
{
IEnumerable <string> SheetNames = EQF.GetWorksheetNames();
comboBox1.DataSource = SheetNames.ToList();
}
یک سوالی بعد از اینکه بارگذاری کردیم و داخل دیتاگریدویو هم بارگذاری کردیم حالا چطوری حافظه را خالی کنم چون وقتی بارگذاری انجام میشه و داخل دیتابیس ذخیره می کنم اگر مجدد فایلی دیگری را حتی در مسیری غیر از اولی بخوام بارگذاری کنم خطا می دهد که فایلی با این نام توسط کاربری دیگر در حال استفاده است در صورتی نام فایل دیگر با اولی کاملا متفاوت است با تشکر و سپاس فراوان
الان مشخص نیست که با چه روشی دیتا اکسل رو خوندین و گرید رو پر کردین،
و چه جوری بستین.
مهم هست که از چه کتابخانه ای استفاده میکنین؛
مثلا در office.interop.excel باید حتما هر object که باز میکنین (sheet و ...) ببندین،
کتابخانه هایی که connection به فایل اکسل میزنن دردسر کمتری دارن.
با تشکر و سپاس از پاسختان
من از روش office.interop.excel استفاده کردم من آمدم در پوشه اصلی برنامه دیابک یک فایل اکسل از قبل طراحی کردم و موقع خواندن اون فایل اکسل را باز می کنم و بعد از پر کردن اطلاعات اونو داخل گریدویو فراخوانی و می ریزم بعد در دیتابیس ذخیره می کنم
میشه کمی در مورد این کتابخانه connection با مثال توضیح بدهید با تشکر و سپاس
نیاز هست که بیشتر و دقیق توضیح بدین که چی کار دارین میکنین و خواسته واقعی چی هست.
الان شما در اکسل data entry میکنین، بعد در برنامه اون رو میخونین و در گرید نمایش میدین و از گرید در یک دیتابیس (منظور اکسس یا sql هست؟) میریزین؟ چرا؟
سناریو اصلی رو شرح بدین.
و برای پیدا کردن مشکل کد باید اونها رو پیوست کنین (حتما در تگ csharp یا code)
همچین کتابخانه ای نداریم!
نوشتم که بعضی از کتابخانه ها به اکسل کانکشن میزنن،
یعنی مثل office.interop اون رو باز نمیکنن که نیاز باشه در بستن آبجکت ها و quit دقت کنین.
مثل همین نمونه دوم (LinqToExcel) که از oledbconnection استفاده میکنه،
یا کتابخانه epplusکه از openxml استفاده میکنه و در این دو آبجکتها disposable هست.
با سلام تشکر
از دیتابیس اسکیوال استفاده می کنم
من آمدم اطلاعات دفتر تلفن را که داخل یک فایل اکسل می باشد را داخل دیتاگریدویو فراخوانی می کنم و بعد فراخوانی آن را داخل دیتابیس ذخیره می کنم
در اینجا یک پنجره ای باز می شه که همون کار ار مشکل می کنه - تمام مراحل را هم تست کردم - طبق تصویر ارسالی
اینجا فراخوانی مسیر فایل
private void BtnRedFile_Click(object sender, EventArgs e)
{
APP = null;
PATH = string.Empty;
APP = new Excel.Application();
OpenFileDialog op = new OpenFileDialog();
op.Title = "یک فایل اکسل انتخاب کنید";
op.Multiselect = false;
op.FileName = TxtAddress.Text;
op.Filter = "Excel Sheet(*.xlsx;*.xls)|*.xlsx;*.xls";
//op.InitialDirectory = Application.StartupPath + @"\Excels";
//op.RestoreDirectory = true;
if (op.ShowDialog() == DialogResult.OK)
{
ReadExcel(op.FileName, Path.GetExtension(op.FileName));
TxtAddress.Text = op.FileName;
PATH = TxtAddress.Text;
//------------------------------------
CmbSheet.Items.Clear();
WB = APP.Workbooks.Open(PATH);
//-----------------------------------------------------------
for (int i = 1; i <= WB.Worksheets.Count; i++)
{
CmbSheet.Items.Add(WB.Worksheets[i].name);
}
//------------------------------------------------------
APP = null;
//------------------------------------
}
//************************************************** ******
}
در اینجا هم بعد اینکه ااخل کمبوباکس نام شیتها را خواند با توجه به انتخاب نام شیت اطلاعات را داخل گریدویو می ریزم
private void CmbSheet_SelectedIndexChanged(object sender, EventArgs e)
{
dt_excel = null;
if (CmbSheet.SelectedIndex != -1)
{
OleDbConnection con = new OleDbConnection(Adress);
OleDbDataAdapter adp = new OleDbDataAdapter("SELECT * FROM [" + CmbSheet.Text.Trim() + "$]", con);
dt_excel = new DataTable();
adp.Fill(dt_excel);
DgvExele.DataSource = dt_excel;
dt_excel = null;
APP = null;
}
else
{
dt_excel = null;
APP = null;
if (DgvExele.Rows.Count != 0)
{
DgvExele.DataSource = null;
}
}
}
در آخر هم ذخیره می کنم داخل دینابیس
foreach (DataGridViewRow row in DgvExele.Rows)
{
if (row.Cells[1].Value.ToString() != "" && row.Cells[3].Value.ToString() != "")
{
string[] parameter = new string[] { row.Cells[1].Value.ToString(), row.Cells[2].Value.ToString(), row.Cells[3].Value.ToString(), row.Cells[4].Value.ToString() };
q.QueryInsert("TB_NumberPish_Tell", " Name_Ostan, Name_M_Ostan, Number_Pish, Name_Sayt", parameter);
}
else { return; }
}
ضمنا ما اگر خواسته باشیم فایل اکسل را که در پنجره دیباک هست را خذف کنیم اجازه حذف نمی ده و می گوید فایل باز و در حال استفاده است بخاطر همین پیامی که تصویر آن را ارسال کردم
آخرین ویرایش به وسیله safari_m4 : دوشنبه 04 تیر 1403 در 09:01 صبح
سلام دوباره
موارد رو یکی یکی بررسی میکنیم و جلو میریم.
ولی قبل از هر چیز:
این رو نگفتین چرا از اکسل میخونین و در گرید میریزین و بعد از گرید میخونین و در دیتابیس اضافه میکنین؟من آمدم اطلاعات دفتر تلفن را که داخل یک فایل اکسل می باشد را داخل دیتاگریدویو فراخوانی می کنم و بعد فراخوانی آن را داخل دیتابیس ذخیره می کنم
مستقیم هم میشه، با console app هم میشه، حتی از داخل خود اکسل هم میشه (بدون نیاز به این برنامه).
کلا هدف نهایی رو هنوز نگفتین چی هست تا روش مناسب پیدا بشه.
قرار بود کدها رو در تگ مناسب بذارین تا خوانا باشه:
private void BtnRedFile_Click(object sender, EventArgs e)
{
APP = null;
PATH = string.Empty;
APP = new Excel.Application();
OpenFileDialog op = new OpenFileDialog();
op.Title = "یک فایل اکسل انتخاب کنید";
op.Multiselect = false;
op.FileName = TxtAddress.Text;
op.Filter = "Excel Sheet(*.xlsx;*.xls)|*.xlsx;*.xls";
//op.InitialDirectory = Application.StartupPath + @"\Excels";
//op.RestoreDirectory = true;
if (op.ShowDialog() == DialogResult.OK)
{
ReadExcel(op.FileName, Path.GetExtension(op.FileName));
TxtAddress.Text = op.FileName;
PATH = TxtAddress.Text;
CmbSheet.Items.Clear();
WB = APP.Workbooks.Open(PATH);
for (int i = 1; i <= WB.Worksheets.Count; i++)
{
CmbSheet.Items.Add(WB.Worksheets[i].name);
}
APP = null;
}
}
private void CmbSheet_SelectedIndexChanged(object sender, EventArgs e)
{
dt_excel = null;
if (CmbSheet.SelectedIndex != -1)
{
OleDbConnection con = new OleDbConnection(Adress);
OleDbDataAdapter adp = new OleDbDataAdapter("SELECT * FROM [" + CmbSheet.Text.Trim() + "$]", con);
dt_excel = new DataTable();
adp.Fill(dt_excel);
DgvExele.DataSource = dt_excel;
dt_excel = null;
APP = null;
}
else
{
dt_excel = null;
APP = null;
if (DgvExele.Rows.Count != 0)
{
DgvExele.DataSource = null;
}
}
}
foreach (DataGridViewRow row in DgvExele.Rows){
if (row.Cells[1].Value.ToString() != "" && row.Cells[3].Value.ToString() != "")
{
string[] parameter = new string[] {
row.Cells[1].Value.ToString(),
row.Cells[2].Value.ToString(),
row.Cells[3].Value.ToString(),
row.Cells[4].Value.ToString() };
q.QueryInsert(
"TB_NumberPish_Tell",
" Name_Ostan,
Name_M_Ostan,
Number_Pish,
Name_Sayt",
parameter);
}
else { return; }
}
1- شما به نمونه کد پست شماره 2 و
توضیحات پست های بعدی درباره بستن آبجکت ها و quit کردن excel application باز شده
وقتی از office.interop استفاده میکنین، دقت نکردین!
APP = null فایل باز رو نمیبنده و هنوز فایل در محیط اکسل باز هست!
2- برای خوندن شیت به فایل اکسل کانکشن زدین که نیازی نیست،
وقتی فایل اکسل رو با office.interop باز کردین دیگه خوندن شیت ها رو هم میتونین با اون انجام بدین.
و اگر قرار هست کانکشن بزنین دیگه لازم نیست از office.interop استفاده کنین،
مستقیم هم میتونستین اسم شیت ها رو بخونین:
StringBuilder ConnectionString = new StringBuilder();
ConnectionString.Append("Provider=Microsoft.ACE.OL EDB.12.0;");
ConnectionString.Append($"Data Source={path};");
ConnectionString.Append("Extended Properties="Excel 12.0;HDR=YES";");
using (OleDbConnection CONN = new OleDbConnection(ConnectionString.ToString()))
{
CONN.Open();
DataTable Schema = CONN.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
comboBox1.DataSource = Schema;
comboBox1.DisplayMember = "TABLE_NAME";
}
دقت کنین که برای connection و reader و ... حتما از using استفاده کنین،
وگرنه خودتون باید اونها رو dispose کنین.
3 - برای خوندن شیت ها اینجور عمل کنین (از using استفاده کنین تا آبجکتها خودکار dispose بشن):
StringBuilder ConnectionString = new StringBuilder();
ConnectionString.Append("Provider=Microsoft.ACE.OL EDB.12.0;");
ConnectionString.Append($"Data Source={path};");
ConnectionString.Append("Extended Properties="Excel 12.0;HDR=YES";");
using (OleDbConnection CONN = new OleDbConnection(ConnectionString.ToString()))
{
CONN.Open();
using (OleDbDataAdapter DA = new OleDbDataAdapter($"SELECT * FROM [{comboBox1.Text}]", CONN))
{
sheet = new DataTable();
DA.Fill(sheet);
dataGridView1.DataSource = sheet;
}
}
ببخشید اینجا وقتی می خواهد conn.open انجام بشه خطا می دهد که جدول خارجی در قالب مورد انتظار نیست External table is not in the expected format
گفته بودید که فایل اکسل برای چیست می خواهم اطلاعات تلفن هام را که در اکسل از قبل ثبت دارم از طریق شودیالوک انتخاب کند- و از طریق گریدویو هم چنانچه خواست ویرایش کند داخل سلول گرید انجام دهم و بعد ذخیره کند در کل می خوام این روش را درست و خوب یاد بگیرم ضمنا چگونه باید dispose کنم چون تمام موارد را انجام دادم ولی به خطا می خوردم با تشکر و سپاس فراوان از اینکه وقت حوصله می کنید
آخرین ویرایش به وسیله safari_m4 : سه شنبه 05 تیر 1403 در 09:51 صبح
این کد تست شده است.وقتی می خواهد conn.open انجام بشه خطا می دهد که جدول خارجی در قالب مورد انتظار نیست External table is not in the expected format
قبل از اجرای این کد، کد دیگه ای اجرا نشده که فایل اکسل رو باز کرده و تغییر داده باشه؟
خب، الان قضیه روشنتر شد.گفته بودید که فایل اکسل برای چیست می خواهم اطلاعات تلفن هام را که در اکسل از قبل ثبت دارم از طریق شودیالوک انتخاب کند- و از طریق گریدویو هم چنانچه خواست ویرایش کند داخل سلول گرید انجام دهم
اگر این اکسپورت از اکسل به sql فقط یک بار انجام میشه،
میتونین اول اکسپورت ها رو انجام بدین (به هر روشی که راحتترین) و فایل های اکسل رو بگذارین کنار.
بعد از اون برای خوندن/ویرایش/آپدیت هم فقط با sql سروکار دارین.
این که کی و چجوری آبجکتها و ریسورس ها رو dispose کنیم مبحثی نیست که در این تاپیک بگنجه،ضمنا چگونه باید dispose کنم
و شما باید با مفاهیم garbage collector و dispose و finilize و native resource و managed/unmanaged code آشنا باشین.
ولی خیلی ساده اگر بگیم:
در دات نت فریمورک آزاد کردن حافظه از آبجکتهای managed (منظور بومی خود دات نت یا native) ،
به طور خودکارتوسط garbage collector انجام میشه و نیازی نیست نگران اون باشیم.
ولی یک سری آبجکتها/منابع هستن که کدهای اونا unmanaged هست،
و اینها رو باید خودتون بلافاصله بعد از این که دیگه نیازی بهشون نیست dispose کنین (تا حافظه تخصیص داده شده به اونها آزاد بشه).
موارد مربوط به فایل و دیتابیس از این دسته ان.
پس کانکشن به دیتابیس رو خودمون باید dispose کنیم،
حالا این میتونه با اجرای متد dispose باشه (مثلا conn.dispose) یا بهتر اینکه در بلوک using بذاریم.
برداشت من این هست که تکه های کد از جاهای مختلف رو کنار هم گذاشتین و اینها درست پیاده نشدن و ناسازگار هستن.تمام موارد را انجام دادم ولی به خطا می خوردم
برای پاسخ دقیق به همه کدی که استفاده کردین نیاز هست،
یا پیوست کل پروژه.
نظر لطف شماست،با تشکر و سپاس فراوان از اینکه وقت حوصله می کنید
امیدوارم تونسته باشم کمک کنم.
Untitled2.jpg]قبل از اجرای این کد، کد دیگه ای اجرا نشده که فایل اکسل رو باز کرده و تغییر داده باشه؟[/COLOR]
با سلام خسته نباشید و تشکر اولا کمک خیلی عالی کردید
در پاسخ به این سوالات من آمد کلیه کدها را غیر فعال کردم و کد شما را مستقیما داخل یک باتن اجرا کردم که خطای پیوست می دهد و عین کدها را ارسال می کنم
private void loadsheet()
{
//---------------------------------------------
StringBuilder ConnectionString = new StringBuilder();
ConnectionString.Append("Provider=Microsoft.Jet.OL EDB.4.0;");
ConnectionString.Append($"Data Source={Application.StartupPath + @"\Excels\KodNumberPish_Tell.xlsx"};");
ConnectionString.Append("Extended Properties='Excel 4.0;HRD=Yes;IMEX=1';");
//ConnectionString.Append("provider=Microsoft.Jet.OL EDB.4.0;Data Source=" + (Application.StartupPath + @"\Excels\KodNumberPish_Tell.xlsx" + ";Extended Properties='Excel 8.0;HRD=yes;IMEX=1';"));
using (OleDbConnection CONN = new OleDbConnection(ConnectionString.ToString()))
{
CONN.Open();
DataTable Schema = CONN.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
CmbSheet.DataSource = Schema;
CmbSheet.DisplayMember = "TABLE_NAME";
}
]قبل از اجرای این کد، کد دیگه ای اجرا نشده که فایل اکسل رو باز کرده و تغییر داده باشه؟[/COLOR]
با سلام خسته نباشید و تشکر اولا کمک خیلی عالی کردید
در پاسخ به این سوالات من آمد کلیه کدها را غیر فعال کردم و کد شما را مستقیما داخل یک باتن اجرا کردم که خطای پیوست می دهد و عین کدها را ارسال می کنم
private void loadsheet()
{
//---------------------------------------------
StringBuilder ConnectionString = new StringBuilder();
ConnectionString.Append("Provider=Microsoft.Jet.OL EDB.4.0;");
ConnectionString.Append($"Data Source={Application.StartupPath + @"\Excels\KodNumberPish_Tell.xlsx"};");
ConnectionString.Append("Extended Properties='Excel 4.0;HRD=Yes;IMEX=1';");
//ConnectionString.Append("provider=Microsoft.Jet.OL EDB.4.0;Data Source=" + (Application.StartupPath + @"\Excels\KodNumberPish_Tell.xlsx" + ";Extended Properties='Excel 8.0;HRD=yes;IMEX=1';"));
using (OleDbConnection CONN = new OleDbConnection(ConnectionString.ToString()))
{
CONN.Open();
DataTable Schema = CONN.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
CmbSheet.DataSource = Schema;
CmbSheet.DisplayMember = "TABLE_NAME";
}
سلام به همه دوستان
می تونید از لینک زیر هم کمک بگیرید.
امیدوارم بدردتون بخوره
https://stackoverflow.com/questions/...-names-which-i
سلام! برای این منظور می توانید از فرمول ها و Power Query نیز استفاده کنید. اگر کار با فرمول ها راحت تر است، می توانم با مثال کمک کنم.به همین ترتیب، برای ردیابی داده ها در بازی های آنلاین مانند https://aviator-jeux.com ، فرمول ها و ابزارهای Power Query می توانند در تجزیه و تحلیل و خودکارسازی مجموعه داده های تجربه کاربر و معیارهای عملکرد بازی مفید باشند."
آخرین ویرایش به وسیله Alex_Cobe : پنج شنبه 14 تیر 1403 در 12:57 عصر
ConnectionString.Append("Provider=Microsoft.Jet.OL EDB.4.0;");
ConnectionString.Append("Extended Properties='Excel 4.0;HRD=Yes;IMEX=1';");
این کدی نیست که گذاشته بودم!
چرا provider رو jet گذاشتین؟ و extended properties رو هم تغییر دادین؟
این فقط برای فایلهای خیلی قدیمی اکسل هست (پسوند xls ونه xlsx)،
و ممکنه روی خیلی سیستمها نباشه اصلا.
همون ace رو استفاده کنین!
-----
پ.ن:
وقتی از کدهای stackoverflow کپی میکنین حواستون باشه که کد پاسخ باشه و نه کد پرسش (که مشخصا کار نمیکنه!)