PDA

View Full Version : دسترسی و انجام عملیات، بر روی داده های ذخیره شده در Excel


Behrouz_Rad
دوشنبه 13 تیر 1384, 11:55 بعد از ظهر
صورت مسئله:
دسترسی و انجام عملیات، بر روی داده های ذخیره شده در بانک Excel:
<hr>

اصول کار:
استفاده از پرووایدر OLE DB Jet به منظور دسترسی، ایجاد و اصلاح داده های ذخیره شده در بانک Excel.

توضیحات مثال:
مثال زیر شامل دو روال می باشد:

Form.Load
ایجاد یک شی OleDbDataAdapter که از پرووایدر OLE DB به منظور دسترسی و ایجاد عملیات بر روی بانک Excel استفاده می کند.

Button.Click
از شی DataAdapter ایجاد شده در روال Form.Load، به منظور اعمال تغییرات انجام شده بر روی فایل Excel استفاده می کند.

مثال نمونه:

using System;
using System.Configuration;
using System.Data;

private OleDbDataAdapter da;
private DataTable dt;

// . . .

private void ExcelForm_Load(object sender, System.EventArgs e)
{
da = new OleDbDataAdapter("SELECT * FROM [Sheet1$]",
ConfigurationSettings.AppSettings["Excel_ConnectString"]);

String insertSql = "INSERT INTO [Sheet1$] " +
"(CategoryID, CategoryName, Description) " +
"VALUES (?, ?, ?)";
da.InsertCommand =
new OleDbCommand(insertSql, da.SelectCommand.Connection);
da.InsertCommand.Parameters.Add("@CategoryID", OleDbType.Integer, 0,
"CategoryID");
da.InsertCommand.Parameters.Add("@CategoryName", OleDbType.Char, 15,
"CategoryName");
da.InsertCommand.Parameters.Add("@Description", OleDbType.VarChar, 100,
"Description");

String updateSql = "UPDATE [Sheet1$] " +
"SET CategoryName=?, Description=? " +
"WHERE CategoryID=?";
da.UpdateCommand =
new OleDbCommand(updateSql, da.SelectCommand.Connection);
da.UpdateCommand.Parameters.Add("@CategoryName", OleDbType.Char, 15,
"CategoryName");
da.UpdateCommand.Parameters.Add("@Description", OleDbType.VarChar, 100,
"Description");
da.UpdateCommand.Parameters.Add("@CategoryID", OleDbType.Integer, 0,
"CategoryID");

dt = new DataTable( );
da.Fill(dt);

dt.PrimaryKey = new DataColumn[] {dt.Columns[0]};

dt.DefaultView.AllowDelete = false;
dt.DefaultView.AllowEdit = true;
dt.DefaultView.AllowNew = true;

dataGrid.DataSource = dt.DefaultView;
}
private void updateButton_Click(object sender, System.EventArgs e)
{
da.Update(dt);
}


توضیحات:
به منظور ایجاد ارتباط با یک بانک Excel، از پرووایدر Jet OLE DB استفاده می شود.
موتور پرووایدر Jet یا همان Jet Engine، قادر به برقراری ارتباط با فرمت های دیگر بانک های اطلاعاتی نیز می باشد.
این ارتباط، با تعیین نوع درایور بانک مربوطه – که به آن اصطلاحا ISAM یا متد دسترسی ترتیبی شاخص گذاری شده گفته می شود – در خاصیت Extended Properties کانکشن استرینگ، انجام می پذیرد.
برای استفاده از بانک های Excel نسخه 2000 به بالا، مقدار Extended Properties باید به Excel 8.0 تنظیم گردد.
مثال:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=myFile.xls;
Extended Properties="Excel 8.0;HDR=YES";

خاصیت HDR مشخص می کند که آیا در مقادیر بازیابی شونده، نام فیلدها در اولین ردیف رکوردها وجود دارد یا خیر.

توجه مهم: در Excel، مفهوم WorkSheet به جدول و مفهوم WorkBook به بانک اطلاعاتی یا همان فایل Excel اطلاق می شود.

بازیابی داده ها از WorkSheet:
روش های مختلفی به منظور بازیابی داده های ذخیره شده در فایل Excel وجود دارد.
دو روشی که بیشترین مورد استفاده را دارند عبارتند از:
1) تعیین نام Worksheet به همراه یک علامت $ در انتهای آن، به منظور انتخاب تمامی رکوردها:

SELECT * FROM [MySheet$]

2) تعیین محدوده ای از داده ها، همانند سینتکسی شبیه زیر:

SELECT * FROM [MySheet$A1:E5]


دستور اس کیو ال فوق، داده های سلول های A1 تا E5 را انتخاب می کند.

ایجاد WorkSheet در بانک Excel:
با استفاده از فرمان اس کیو ال CREATE TABLE، قادر به ایجاد یک WorkSheet جدید در بانک Excel هستید.
مثال:

CREATE TABLE MySheet (Field1 char(10), Field2 float, Field3 date)


اضافه کردن داده ها به WorkSheet:
با استفاده از دستور اس کیو ال INSERT (استاتیک یا پارامتری) می توان داده ها را به فایل Excel یا محدوده ای از سلول های WorkSheet، اضافه کرد:
مثال:

INSERT INTO [MySheet$] (Field1, Field2, Field3)
VALUES ('myData', 1.234, '09/28/1979');


اعمال تغییرات بر روی داده ها:
با استفاده از دستور اس کیو ال UPDATE (استاتیک یا پارامتری) می توان داده ها را در فایل Excel یا محدوده ای از سلول های WorkSheet، اصلاح کرد:
مثال:

UPDATE [MySheet$]
SET Field2 = '2.345',
Field3 = '10/18/1964'
WHERE
Field1 = 'myData'


حذف داده ها:
استفاده از دستور اس کیو ال DELETE به منظور حذف رکوردها، منجر به بروز یک خطای منطقی خواهد شد.
تنها راه حذف رکورد یا رکوردها، جایگزینی مقدار آنها با مقدار null یا خالی است.
<hr>
موفق باشید.

Farhad-Csharp
دوشنبه 10 مرداد 1384, 12:02 بعد از ظهر
آقا خدا رفتگانتو بیامرزه ، شدید.

Constantine
دوشنبه 22 خرداد 1385, 11:10 قبل از ظهر
بابا تو دیکه کی هستی؟ مسعود

محمد میرمصطفی
دوشنبه 22 خرداد 1385, 10:55 بعد از ظهر
آقا جدا لطف فرمودید. البته من دیدم که راه حل مایکروسافت یک کم با این فرق داره. با این وجود ممنون

bahman.net
یک شنبه 18 تیر 1385, 01:19 قبل از ظهر
خیلی ممنون

SRS534
دوشنبه 19 تیر 1385, 08:23 قبل از ظهر
مرسی استاد

rtech
یک شنبه 26 فروردین 1386, 12:40 قبل از ظهر
من اگه بخوام داده های ستونهای A,B,C,D رو فقط بازیابی کنم از چه دستوری باید استفاده کنم ؟

golihaghighi
چهارشنبه 10 مرداد 1386, 11:10 قبل از ظهر
واقعا ممنون

Mohammadreza Heidari
جمعه 19 مرداد 1386, 02:27 قبل از ظهر
مقاله جالبی بود خیلی ممنون

Hossein Bazyan
جمعه 09 فروردین 1387, 07:03 بعد از ظهر
سلام
دست شما جناب راد درد نکنه ، یکی از زحمتکشان قسمت asp.net بی شک شما هستید.
من موارد فوق را انجام میدم ( فایل اکسل را در دیتابیس اکسس ذخیره میکنم و اطلاعات را هم ویرایش میکنم) اما نکته مهم اینه که همیشه Sheetها نامشان Sheet نیست . من برنامه ای تحت وب نوشتم که فایل اکسل را از کاربر میگیره و در بانک ذخیره میکنه و بعد از یکسری تغییرات در فایل دوم ذخیره و برای مشتری میفرستد. اما مشکلی که دارم اینه که کاربران معمولا همیشه نام Sheet ها را تغییر میدهند. من دنبال روشی هستم که بتوانم فایل اکسل را که خوندم نام Sheet های آنرا استخراج کنم . آیا راهی هست ؟