בעיה בפתיחת קובץ CSV באקסל
-
אני מאפשר לייצא קובץ עם נתונים של התוכנה לפורמט CSV לקריאה באקסל.
כאשר אני מגדיר לתכנה לשמור אותו עם ".csv" בסוף אז זה נפתח אוט' באקסל, אבל הבעיה שכל הנתונים נמצאים בתא אחד והוא לא מזהה שהוא צריך לחלק אותם לעמודות לפי הפסיקים.
כאשר אני לא מגדיר את הסיומת של הקובץ, אז המחשב לא יודע דרך איזה תכנה לפתוח אותו, וכאשר אני בוחר באקסל ועושה שם המרה מפורשת אז הכל מצויין.
מישהו יודע האקסל לא יודע לזהות אותו בצורה אוט', או מה עושים כדי שזה יעבוד אוט'?תודה רבה!
פורסם במקור בפורום CODE613 ב16/08/2015 22:15 (+03:00)
-
הם מופרדות עם פסיק.
אם אני לא כותב בסיומת .csv ואח"כ אני פותח אותו דרך אקסל (כמובן הוא לא מכיר אותו ואני עושה המרה, ובוחר להפריד עמודות לפי פסיקים..) אז התוצאה מצויינת.. הבעיה היא שאני לא יכול לצפות שהלקוח יעשה את כל זה..השתמשתי במחלקה הבאה ליצירת CSV (מצאתי אותה ב"גלישת מחסנית" :lol:)
public class CsvExport<T> where T : class { public List<T> Objects; public CsvExport(List<T> objects) { Objects = objects; } public string Export() { return Export(true); } public string Export(bool includeHeaderLine) { StringBuilder sb = new StringBuilder(); //Get properties using reflection. IList<PropertyInfo> propertyInfos = typeof(T).GetProperties(); if (includeHeaderLine) { //add header line. foreach (PropertyInfo propertyInfo in propertyInfos) { sb.Append(propertyInfo.Name).Append(","); } sb.Remove(sb.Length - 1, 1).AppendLine(); } //add value for each property. foreach (T obj in Objects) { foreach (PropertyInfo propertyInfo in propertyInfos) { sb.Append(MakeValueCsvFriendly(propertyInfo.GetValue(obj, null))).Append(","); } sb.Remove(sb.Length - 1, 1).AppendLine(); } return sb.ToString(); } //export to a file. public void ExportToFile(string path) { File.WriteAllText(path,Export(),Encoding.Unicode); } //export as binary data. public byte[] ExportToBytes() { return Encoding.UTF8.GetBytes(Export()); } //get the csv value for field. private string MakeValueCsvFriendly(object value) { if (value == null) return ""; if (value is Nullable && ((INullable)value).IsNull) return ""; if (value is DateTime) { if (((DateTime)value).TimeOfDay.TotalSeconds == 0) return ((DateTime)value).ToString("yyyy-MM-dd"); return ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"); } string output = value.ToString(); if (output.Contains(",") || output.Contains("\"")) output = '"' + output.Replace("\"", "\"\"") + '"'; return output; } }
פורסם במקור בפורום CODE613 ב16/08/2015 22:27 (+03:00)
-
כן
הנהדוגמא1.csv
את ההוא שהוא בלי סיומת CSV האתר לא נותן לי להעלות :lol:
(כנראה מטעמי אבטחה??)
תודה רבהפורסם במקור בפורום CODE613 ב16/08/2015 23:15 (+03:00)