יבוא נתונים מאקסל
לעיתים אנחנו רוצים להעביר מידע מהאפליקציה שלנו לקובץ חיצוני (יצוא) או ליבא מידע מקובץ חיצוני לאפליקציה. ישנם 3 סוגי קבצים עיקריים כיום - xml , excel ו csv.הטיפול ב xml הוא נרחב ויש לו תמיכה רבה בדוט נט.טיפול ב excel נעשה בשתי שיטות עיקריות, שיטה אחת מסובכת ואיטית, היא להוסיף הפניה לאובייקט קום ואז ניתן ממש לבצע דברים מסובכים באקסל...
השיטה הנפוצה יותר, היא להתייחס לאקסל כמו אל בסיס נתונים ולפנות אליו דרך odbc. נניח ושם הקובץ הוא c:\myproducts.xls
נבנה אובייקט קונקשן לקובץ :
string filename="c:\\myproducts.xls";
string constring = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" + filename+ ";DefaultDir=;";
OdbcConnection con = new OdbcConnection(constring);
נבנה פקודה עם שאילתה :
OdbcCommand com = new OdbcCommand("SELECT top 1 * FROM [import$]", con);
שימו לב ששם הטבלה הוא [import$] שזהו בעצם הגיליון הראשון באקסל ושמו import. בשאילתה אנו בוחרים את כל הנתונים בשורה הראשונה. ומכן ממשיכים כרגיל כמו עם דטה בייס רגיל...* השורה הראשונה צריכה להכיל את שמות העמודות * אם בגיליון יש כל מיני עיצובים ואובייקטים אז המידע יצא קצת דפוק...* ה odbc "מנחש" את סוג העמודה לפי כמה שורות ראשונות, כך שאם יש לכם עמודת טקסט, ובכמה שורות הראשונות יש שם מספרים, הוא יניח שזו עמודה מספרית ואז כל מיני פילטרים (where productname='mouse') לא יעבדודרך מומלצת יותר היא ליבא מקובץ csv, שזהו בעצם קובץ טקסט פשוט עם הפרדה (בדרך כלל פסיקים) בין הנתונים.לגבי יצוא נתונים לאקסל, ישנן מספר דרכים. שוב, הדרך הפשוטה היא להפריד את העמודות בעזרת טאב (מנסיון אני יכול להגיד שבדרך זו יהיו גם הכי פחות בעיות עם עברית או שפות אחרות... וגם השיטה הזאת הכי ליצא נתונים דרך האינטרנט אם הלקוח רוצה להוריד את הקובץ אליו למחשב)נניח שהמידע שלי שמור ב DataTable, אז בניית הקובץ תתבצע כך : קודם נדפיס את העמודות :
StringBuilder sb=new StringBuilder();
string sep="";
foreach (DataColumn dc in dt.Columns)
{
sb.Append(sep+ dc.ColumnName);
sep = "\t";
}
sb.AppendLine();
וכעת נרוץ על כל שורה ושורה, ובתוך כל שורה נרוץ על כל העמודות:
int k;
foreach (DataRow dr in dt.Rows)
{
sep = "";
for (k = 0; k < dt.Columns.Count; k++)
{
sb.Append(sep + dr[k].ToString());
sep = "\t";
}
ואז פשוט ניצור את הקובץ ונשמור בו את המידע הזה
אם הייתי רוצה ליצא למשתמש שלי נתונים דרך האינטרנט, אזי הייתי משתמש באותה שיטה, נמשוך את הנתונים מהדטה בייס, נכין את ה Response שלנו:
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding = Encoding.GetEncoding("windows-1255");
Response.AddHeader("Content-Disposition", "attachment; filename=\"productsData.xls\"");
Response.Charset = "";
this.EnableViewState = false;
string sep = "";
foreach (DataColumn dc in dt.Columns)
{
Response.Write(sep + dc.ColumnName);
sep = "\t";
}
Response.Write("\n");
int k;
foreach (DataRow dr in dt.Rows)
{
sep = "";
for (k = 0; k < dt.Columns.Count; k++)
{
Response.Write(sep + dr[k].ToString());
sep = "\t";
}
Response.Write("\n");
}
Response.End();
ואם אתם ממש רוצים ליצור קובץ בצורה אחרת, אז יש כאן מדריך קצר...להורדת הפרוייקט