View Full Version : نمایش نام شیت های اکسل در کمبوباکس
safari_m4
چهارشنبه 30 خرداد 1403, 07:45 صبح
سلام و وقت بخیر دوستان چگونه تعداد نام های شیت یک اکسل را داخل کمبوباکس نماش بدهم مثلا اگر سربرگ یک اکسل دارای چند شیت باشد نام آنها را داخل کمبوباکس قرار دهم با تشکر و سپاس
mazoolagh
پنج شنبه 31 خرداد 1403, 10:22 صبح
سلام و روز خوش
خب اول باید بتونین خود فایل اکسل رو باز کنین.
یک راه این هست که از کتابخانه 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();
mazoolagh
پنج شنبه 31 خرداد 1403, 10:55 صبح
کتابخانه های دیگه هم هست: مثل LinqToExcel (https://github.com/paulyoder/LinqToExcel)
using LinqToExcel;
string PATH = "path to excel file";
using (ExcelQueryFactory EQF = new ExcelQueryFactory(path))
{
IEnumerable <string> SheetNames = EQF.GetWorksheetNames();
comboBox1.DataSource = SheetNames.ToList();
}
safari_m4
جمعه 01 تیر 1403, 10:30 صبح
کتابخانه های دیگه هم هست: مثل LinqToExcel (https://github.com/paulyoder/LinqToExcel)
using LinqToExcel;
string PATH = "path to excel file";
using (ExcelQueryFactory EQF = new ExcelQueryFactory(path))
{
IEnumerable <string> SheetNames = EQF.GetWorksheetNames();
comboBox1.DataSource = SheetNames.ToList();
}
با تشکر و سپاس فراوان
یک سوالی بعد از اینکه بارگذاری کردیم و داخل دیتاگریدویو بارگذاری کردیم حالا در صورت انصراف چگونه دیتاگریدویو را خالی کنیم بدون اینکه خطا نده با تشکر و سپاس فراوان
safari_m4
جمعه 01 تیر 1403, 12:46 عصر
یک سوالی بعد از اینکه بارگذاری کردیم و داخل دیتاگریدویو هم بارگذاری کردیم حالا چطوری حافظه را خالی کنم چون وقتی بارگذاری انجام میشه و داخل دیتابیس ذخیره می کنم اگر مجدد فایلی دیگری را حتی در مسیری غیر از اولی بخوام بارگذاری کنم خطا می دهد که فایلی با این نام توسط کاربری دیگر در حال استفاده است در صورتی نام فایل دیگر با اولی کاملا متفاوت است با تشکر و سپاس فراوان
mazoolagh
شنبه 02 تیر 1403, 12:02 عصر
یک سوالی بعد از اینکه بارگذاری کردیم و داخل دیتاگریدویو هم بارگذاری کردیم حالا چطوری حافظه را خالی کنم چون وقتی بارگذاری انجام میشه و داخل دیتابیس ذخیره می کنم اگر مجدد فایلی دیگری را حتی در مسیری غیر از اولی بخوام بارگذاری کنم خطا می دهد که فایلی با این نام توسط کاربری دیگر در حال استفاده است در صورتی نام فایل دیگر با اولی کاملا متفاوت است با تشکر و سپاس فراوان
الان مشخص نیست که با چه روشی دیتا اکسل رو خوندین و گرید رو پر کردین،
و چه جوری بستین.
مهم هست که از چه کتابخانه ای استفاده میکنین؛
مثلا در office.interop.excel باید حتما هر object که باز میکنین (sheet و ...) ببندین،
کتابخانه هایی که connection به فایل اکسل میزنن دردسر کمتری دارن.
safari_m4
شنبه 02 تیر 1403, 21:32 عصر
الان مشخص نیست که با چه روشی دیتا اکسل رو خوندین و گرید رو پر کردین،
و چه جوری بستین.
مهم هست که از چه کتابخانه ای استفاده میکنین؛
مثلا در office.interop.excel باید حتما هر object که باز میکنین (sheet و ...) ببندین،
کتابخانه هایی که connection به فایل اکسل میزنن دردسر کمتری دارن.
با تشکر و سپاس از پاسختان
من از روش office.interop.excel استفاده کردم من آمدم در پوشه اصلی برنامه دیابک یک فایل اکسل از قبل طراحی کردم و موقع خواندن اون فایل اکسل را باز می کنم و بعد از پر کردن اطلاعات اونو داخل گریدویو فراخوانی و می ریزم بعد در دیتابیس ذخیره می کنم
میشه کمی در مورد این کتابخانه connection با مثال توضیح بدهید با تشکر و سپاس
mazoolagh
یک شنبه 03 تیر 1403, 12:49 عصر
من از روش office.interop.excel استفاده کردم من آمدم در پوشه اصلی برنامه دیابک یک فایل اکسل از قبل طراحی کردم و موقع خواندن اون فایل اکسل را باز می کنم و بعد از پر کردن اطلاعات اونو داخل گریدویو فراخوانی و می ریزم بعد در دیتابیس ذخیره می کنم
نیاز هست که بیشتر و دقیق توضیح بدین که چی کار دارین میکنین و خواسته واقعی چی هست.
الان شما در اکسل data entry میکنین، بعد در برنامه اون رو میخونین و در گرید نمایش میدین و از گرید در یک دیتابیس (منظور اکسس یا sql هست؟) میریزین؟ چرا؟
سناریو اصلی رو شرح بدین.
و برای پیدا کردن مشکل کد باید اونها رو پیوست کنین (حتما در تگ csharp یا code)
میشه کمی در مورد این کتابخانه connection با مثال توضیح بدهید
همچین کتابخانه ای نداریم!
نوشتم که بعضی از کتابخانه ها به اکسل کانکشن میزنن،
یعنی مثل office.interop اون رو باز نمیکنن که نیاز باشه در بستن آبجکت ها و quit دقت کنین.
مثل همین نمونه دوم (LinqToExcel) که از oledbconnection استفاده میکنه،
یا کتابخانه epplusکه از openxml استفاده میکنه و در این دو آبجکتها disposable هست.
safari_m4
دوشنبه 04 تیر 1403, 07:34 صبح
نیاز هست که بیشتر و دقیق توضیح بدین که چی کار دارین میکنین و خواسته واقعی چی هست.
الان شما در اکسل 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; }
}
ضمنا ما اگر خواسته باشیم فایل اکسل را که در پنجره دیباک هست را خذف کنیم اجازه حذف نمی ده و می گوید فایل باز و در حال استفاده است بخاطر همین پیامی که تصویر آن را ارسال کردم
mazoolagh
دوشنبه 04 تیر 1403, 09:32 صبح
سلام دوباره
موارد رو یکی یکی بررسی میکنیم و جلو میریم.
ولی قبل از هر چیز:
من آمدم اطلاعات دفتر تلفن را که داخل یک فایل اکسل می باشد را داخل دیتاگریدویو فراخوانی می کنم و بعد فراخوانی آن را داخل دیتابیس ذخیره می کنم
این رو نگفتین چرا از اکسل میخونین و در گرید میریزین و بعد از گرید میخونین و در دیتابیس اضافه میکنین؟
مستقیم هم میشه، با console app هم میشه، حتی از داخل خود اکسل هم میشه (بدون نیاز به این برنامه).
کلا هدف نهایی رو هنوز نگفتین چی هست تا روش مناسب پیدا بشه.
mazoolagh
دوشنبه 04 تیر 1403, 09:41 صبح
قرار بود کدها رو در تگ مناسب بذارین تا خوانا باشه:
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; }
}
mazoolagh
دوشنبه 04 تیر 1403, 09:53 صبح
1- شما به نمونه کد پست شماره 2 و
توضیحات پست های بعدی درباره بستن آبجکت ها و quit کردن excel application باز شده
وقتی از office.interop استفاده میکنین، دقت نکردین!
APP = null فایل باز رو نمیبنده و هنوز فایل در محیط اکسل باز هست!
mazoolagh
دوشنبه 04 تیر 1403, 10:43 صبح
2- برای خوندن شیت به فایل اکسل کانکشن زدین که نیازی نیست،
وقتی فایل اکسل رو با office.interop باز کردین دیگه خوندن شیت ها رو هم میتونین با اون انجام بدین.
و اگر قرار هست کانکشن بزنین دیگه لازم نیست از office.interop استفاده کنین،
مستقیم هم میتونستین اسم شیت ها رو بخونین:
StringBuilder ConnectionString = new StringBuilder();
ConnectionString.Append("Provider=Microsoft.ACE.OLEDB.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 کنین.
mazoolagh
دوشنبه 04 تیر 1403, 11:15 صبح
3 - برای خوندن شیت ها اینجور عمل کنین (از using استفاده کنین تا آبجکتها خودکار dispose بشن):
StringBuilder ConnectionString = new StringBuilder();
ConnectionString.Append("Provider=Microsoft.ACE.OLEDB.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;
}
}
safari_m4
دوشنبه 04 تیر 1403, 13:05 عصر
2- برای خوندن شیت به فایل اکسل کانکشن زدین که نیازی نیست،
وقتی فایل اکسل رو با office.interop باز کردین دیگه خوندن شیت ها رو هم میتونین با اون انجام بدین.
و اگر قرار هست کانکشن بزنین دیگه لازم نیست از office.interop استفاده کنین،
مستقیم هم میتونستین اسم شیت ها رو بخونین:
StringBuilder ConnectionString = new StringBuilder();
ConnectionString.Append("Provider=Microsoft.ACE.OLEDB.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 کنین.
ببخشید اینجا وقتی می خواهد conn.open انجام بشه خطا می دهد که جدول خارجی در قالب مورد انتظار نیست External table is not in the expected format
گفته بودید که فایل اکسل برای چیست می خواهم اطلاعات تلفن هام را که در اکسل از قبل ثبت دارم از طریق شودیالوک انتخاب کند- و از طریق گریدویو هم چنانچه خواست ویرایش کند داخل سلول گرید انجام دهم و بعد ذخیره کند در کل می خوام این روش را درست و خوب یاد بگیرم ضمنا چگونه باید dispose کنم چون تمام موارد را انجام دادم ولی به خطا می خوردم با تشکر و سپاس فراوان از اینکه وقت حوصله می کنید
mazoolagh
چهارشنبه 06 تیر 1403, 20:35 عصر
وقتی می خواهد 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 بذاریم.
تمام موارد را انجام دادم ولی به خطا می خوردم
برداشت من این هست که تکه های کد از جاهای مختلف رو کنار هم گذاشتین و اینها درست پیاده نشدن و ناسازگار هستن.
برای پاسخ دقیق به همه کدی که استفاده کردین نیاز هست،
یا پیوست کل پروژه.
با تشکر و سپاس فراوان از اینکه وقت حوصله می کنید
نظر لطف شماست،
امیدوارم تونسته باشم کمک کنم.
safari_m4
چهارشنبه 06 تیر 1403, 22:42 عصر
155845
این کد تست شده است.
قبل از اجرای این کد، کد دیگه ای اجرا نشده که فایل اکسل رو باز کرده و تغییر داده باشه؟
خب، الان قضیه روشنتر شد.
اگر این اکسپورت از اکسل به sql فقط یک بار انجام میشه،
میتونین اول اکسپورت ها رو انجام بدین (به هر روشی که راحتترین) و فایل های اکسل رو بگذارین کنار.
بعد از اون برای خوندن/ویرایش/آپدیت هم فقط با sql سروکار دارین.
این که کی و چجوری آبجکتها و ریسورس ها رو dispose کنیم مبحثی نیست که در این تاپیک بگنجه،
و شما باید با مفاهیم garbage collector و dispose و finilize و native resource و managed/unmanaged code آشنا باشین.
ولی خیلی ساده اگر بگیم:
در دات نت فریمورک آزاد کردن حافظه از آبجکتهای managed (منظور بومی خود دات نت یا native) ،
به طور خودکارتوسط garbage collector انجام میشه و نیازی نیست نگران اون باشیم.
ولی یک سری آبجکتها/منابع هستن که کدهای اونا unmanaged هست،
و اینها رو باید خودتون بلافاصله بعد از این که دیگه نیازی بهشون نیست dispose کنین (تا حافظه تخصیص داده شده به اونها آزاد بشه).
موارد مربوط به فایل و دیتابیس از این دسته ان.
پس کانکشن به دیتابیس رو خودمون باید dispose کنیم،
حالا این میتونه با اجرای متد dispose باشه (مثلا conn.dispose) یا بهتر اینکه در بلوک using بذاریم.
برداشت من این هست که تکه های کد از جاهای مختلف رو کنار هم گذاشتین و اینها درست پیاده نشدن و ناسازگار هستن.
برای پاسخ دقیق به همه کدی که استفاده کردین نیاز هست،
یا پیوست کل پروژه.
نظر لطف شماست،
امیدوارم تونسته باشم کمک کنم.
]قبل از اجرای این کد، کد دیگه ای اجرا نشده که فایل اکسل رو باز کرده و تغییر داده باشه؟[/COLOR]
با سلام خسته نباشید و تشکر اولا کمک خیلی عالی کردید
در پاسخ به این سوالات من آمد کلیه کدها را غیر فعال کردم و کد شما را مستقیما داخل یک باتن اجرا کردم که خطای پیوست می دهد و عین کدها را ارسال می کنم
private void loadsheet()
{
//---------------------------------------------
StringBuilder ConnectionString = new StringBuilder();
ConnectionString.Append("Provider=Microsoft.Jet.OLEDB.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.OLEDB.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.OLEDB.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.OLEDB.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";
}
vahidmasoudi1391
پنج شنبه 07 تیر 1403, 10:24 صبح
سلام به همه دوستان
می تونید از لینک زیر هم کمک بگیرید.
امیدوارم بدردتون بخوره
https://stackoverflow.com/questions/62551230/how-can-i-create-a-combobox-dropdown-list-that-shows-excel-sheets-names-which-i
Alex_Cobe
پنج شنبه 07 تیر 1403, 16:59 عصر
سلام! برای این منظور می توانید از فرمول ها و Power Query نیز استفاده کنید. اگر کار با فرمول ها راحت تر است، می توانم با مثال کمک کنم.به همین ترتیب، برای ردیابی داده ها در بازی های آنلاین مانند https://aviator-jeux.com ، فرمول ها و ابزارهای Power Query می توانند در تجزیه و تحلیل و خودکارسازی مجموعه داده های تجربه کاربر و معیارهای عملکرد بازی مفید باشند."
safari_m4
پنج شنبه 07 تیر 1403, 17:56 عصر
سلام به همه دوستانمی تونید از لینک زیر هم کمک بگیرید.امیدوارم بدردتون بخورهhttps://stackoverflow.com/questions/62551230/how-can-i-create-a-combobox-dropdown-list-that-shows-excel-sheets-names-which-i
با تشکر و سپاس فراوان
در حال حاضر از همین روش استفاده می کنم .من می خواستم اگر بشه خواندن و پر کردن نام شیت ها را همانند کد های پر کردن کریدویو انجام بدهم که با خطا مواجه می شوم با تشکر
safari_m4
پنج شنبه 07 تیر 1403, 18:05 عصر
سلام! برای این منظور می توانید از فرمول ها و Power Query نیز استفاده کنید. اگر کار با فرمول ها راحت تر است، می توانم با مثال کمک کنم.
با تشکر اگر امکانش هست لطفا یک مثال بزنید
mazoolagh
شنبه 09 تیر 1403, 12:41 عصر
من آمد کلیه کدها را غیر فعال کردم و کد شما را مستقیما داخل یک باتن اجرا کردم که خطای پیوست می دهد و عین کدها را ارسال می کنم
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 کپی میکنین حواستون باشه که کد پاسخ باشه و نه کد پرسش (که مشخصا کار نمیکنه!)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.