異世界


2014年7月12日 星期六

使用List<T>做為資料實體,XML 或 bin file 作為資料檔案

 

不使用資料庫一樣能完成資料存取,並使用 dataGridView、bindingNavigator 來瀏覽資料。

使用 List<T> 做為資料實體,XML 或 bin file 作為資料檔案。

1. 建立List<T>擴充方法

2. 使用 NPOI 實現Excel 檔案操作 (c# NPOI 教程(目錄),存取 Excel 檔案的利器:NPOI Library )

3. 2014/12/25 加註=> NPOI 已經可以產生  xlsx : http://www.dotblogs.com.tw/mis2000lab/archive/2014/07/02/npoi-20-for-aspnet_20140703.aspx

以下程式碼來自網路並經修改

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Data;
   6: using System.Reflection;
   7: using System.Windows.Forms;
   8: using System.IO;
   9: using System.Runtime.Serialization.Formatters.Binary;
  10: using System.Xml;
  11: using System.Xml.Serialization;
  12: using System.Resources;
  13:  
  14: using NPOI;
  15: using NPOI.HPSF;
  16: using NPOI.HSSF;
  17: using NPOI.HSSF.UserModel;
  18: using NPOI.POIFS;
  19: using NPOI.POIFS.FileSystem;
  20: using NPOI.SS.UserModel;
  21: using NPOI.Util;
  22: using System.ComponentModel;
  23:  
  24:  
  25: namespace Laser5Axis.Extension
  26: {
  27:     /// <summary>
  28:     /// 原資訊來自:http://www.dotblogs.com.tw/gelis/archive/2012/04/15/71535.aspx
  29:     /// 已經部分增刪修改
  30:     /// </summary>
  31:     /// 
  32:     /// 擴充方法必須定義為靜態方法,但使用執行個體方法語法進行呼叫。 
  33:     /// 擴充方法的第一個參數指定方法進行作業的型別,而這個參數的前面需加上 this 修飾詞 (Modifier)。 
  34:     /// 使用 using 指示詞,將命名空間 (Namespace) 明確匯入至原始程式碼時,擴充方法才會進入範圍中。 
  35:     /// 
  36:     public static class ListExtensionMethod
  37:     {
  38:         public static void getComboBoxColumn<T>(this List<T> list, string key, string name, ref DataGridViewComboBoxColumn ComboBoxColumn)
  39:         {
  40:             if (list.Count <= 0) { return; }
  41:  
  42:             //DataGridViewComboBoxColumn ComboBoxColumn = new DataGridViewComboBoxColumn();
  43:             {
  44:                 ComboBoxColumn.DataPropertyName = name;
  45:                 ComboBoxColumn.HeaderText = name;
  46:                 ComboBoxColumn.DropDownWidth = 160;
  47:                 ComboBoxColumn.Width = 90;
  48:                 ComboBoxColumn.MaxDropDownItems = 5;
  49:                 ComboBoxColumn.FlatStyle = FlatStyle.Flat;
  50:  
  51:                 foreach (var p in list)
  52:                 {
  53:                     PropertyInfo[] pPty = p.GetType().GetProperties();
  54:  
  55:                     foreach (PropertyInfo pp in pPty)
  56:                     {
  57:                         if (pp.MemberType == MemberTypes.Property)
  58:                         {
  59:                             if (pp.Name == key)
  60:                             {
  61:                                 ComboBoxColumn.Items.Add(pp.GetValue(p, null));
  62:                             }
  63:                         }
  64:                     }
  65:                 }
  66:             }
  67:  
  68:             //return ComboBoxColumn;
  69:         }
  70:         //public static DataTable getTable<T>(this List<T> list, ref DataTable subTable)
  71:         //{
  72:         //    DataTable dt = new DataTable();
  73:         //    if (list.Count > 0)
  74:         //    {
  75:         //        Type obj = list.Take(1).Single().GetType();     //若有資料,
  76:         //        PropertyInfo[] pInfo = obj.GetProperties();
  77:         //        dt.TableName = obj.Name;
  78:  
  79:         //        foreach (PropertyInfo info in pInfo)
  80:         //        {
  81:         //            if (info.MemberType == MemberTypes.Property)
  82:         //            {
  83:         //                //.. List<BitMapping>
  84:         //                if (info.PropertyType == typeof(List<nmsBit>)) { }
  85:         //                dt.Columns.Add(new DataColumn(info.Name));
  86:         //            }
  87:         //        }
  88:         //    }
  89:  
  90:         //    foreach (var p in list)
  91:         //    {
  92:         //        PropertyInfo[] pPty = p.GetType().GetProperties();
  93:  
  94:         //        DataRow dr = dt.NewRow();
  95:  
  96:         //        foreach (PropertyInfo pp in pPty)
  97:         //        {
  98:         //            if (pp.MemberType == MemberTypes.Property)
  99:         //            {
 100:         //                //if (pp.Name == "Mappings") { }
 101:         //                dr[pp.Name] = pp.GetValue(p, null);
 102:         //            }
 103:         //        }
 104:         //        dt.Rows.Add(dr);
 105:         //    }
 106:  
 107:         //    return dt;
 108:         //}
 109:         public static DataTable getTable<T>(this List<T> list)
 110:         {
 111:             DataTable dt = new DataTable();
 112:             if (list.Count > 0)
 113:             {
 114:                 Type obj = list.Take(1).Single().GetType();     //若有資料,
 115:                 PropertyInfo[] pInfo = obj.GetProperties();
 116:                 dt.TableName = obj.Name;
 117:  
 118:                 foreach (PropertyInfo info in pInfo)
 119:                 {
 120:                     if (info.MemberType == MemberTypes.Property)
 121:                     {
 122:                         dt.Columns.Add(new DataColumn(info.Name));
 123:                     }
 124:                 }
 125:             }
 126:  
 127:             foreach (var p in list)
 128:             {
 129:                 PropertyInfo[] pPty = p.GetType().GetProperties();
 130:  
 131:                 DataRow dr = dt.NewRow();
 132:  
 133:                 foreach (PropertyInfo pp in pPty)
 134:                 {
 135:                     if (pp.MemberType == MemberTypes.Property)
 136:                     {
 137:                         dr[pp.Name] = pp.GetValue(p, null);
 138:                     }
 139:                 }
 140:                 dt.Rows.Add(dr);
 141:             }
 142:  
 143:             return dt;
 144:         }
 145:         public static DataTable ListToDataTable<T>(this IEnumerable<T> list) where T : class, new()
 146:         {
 147:             //建立一個回傳用的 DataTable
 148:             DataTable dt = new DataTable();
 149:  
 150:             //取得映射型別
 151:             Type type = typeof(T);
 152:  
 153:             //宣告一個 PropertyInfo 陣列,來接取 Type 所有的共用屬性
 154:             PropertyInfo[] PI_List = null;
 155:  
 156:             foreach (var item in list)
 157:             {
 158:                 //判斷 DataTable 是否已經定義欄位名稱與型態
 159:                 if (dt.Columns.Count == 0)
 160:                 {
 161:                     //取得 Type 所有的共用屬性
 162:                     PI_List = item.GetType().GetProperties();
 163:  
 164:                     //將 List 中的 名稱 與 型別,定義 DataTable 中的欄位 名稱 與 型別
 165:                     foreach (var item1 in PI_List)
 166:                     {
 167:                         dt.Columns.Add(item1.Name, item1.PropertyType);
 168:                     }
 169:                 }
 170:  
 171:                 //在 DataTable 中建立一個新的列
 172:                 DataRow dr = dt.NewRow();
 173:  
 174:                 //將資料逐筆新增到 DataTable 中
 175:                 foreach (var item2 in PI_List)
 176:                 {
 177:                     dr[item2.Name] = item2.GetValue(item, null);
 178:                 }
 179:  
 180:                 dt.Rows.Add(dr);
 181:             }
 182:  
 183:             dt.AcceptChanges();
 184:  
 185:             return dt;
 186:         }
 187:         public static List<T> DataTableToList<T>(this DataTable dt) where T : class, new()
 188:         {
 189:             //建立一個回傳用的 List<TResult>
 190:             List<T> list = new List<T>();
 191:  
 192:             //取得映射型別
 193:             Type type = typeof(T);
 194:  
 195:             //儲存 DataTable 的欄位名稱
 196:             List<PropertyInfo> pr_List = new List<PropertyInfo>();
 197:  
 198:             foreach (PropertyInfo item in type.GetProperties())
 199:             {
 200:                 if (dt.Columns.IndexOf(item.Name) != -1)
 201:                     pr_List.Add(item);
 202:             }
 203:  
 204:             //逐筆將 DataTable 的值新增到 List<T> 中
 205:             foreach (DataRow item in dt.Rows)
 206:             {
 207:                 T tr = new T();
 208:  
 209:                 foreach (PropertyInfo item1 in pr_List)
 210:                 {
 211:                     if (item[item1.Name] != DBNull.Value)
 212:                         item1.SetValue(tr, item[item1.Name], null);  //資料型態不同時 就拋出例外(如何轉型 ???)
 213:                 }
 214:  
 215:                 list.Add(tr);
 216:             }
 217:  
 218:             return list;
 219:         }
 220:  
 221:  
 222:         /// <summary>
 223:         /// 將 List<T> 轉換為 DataSet 並存為XML檔案.
 224:         /// </summary>
 225:         /// <typeparam name="T"></typeparam>
 226:         /// <param name="list"></param>
 227:         public static int SaveToDisk<T>(this List<T> list, string XmlPath)
 228:         {
 229:             int result = 0;
 230:             DataTable dt = new DataTable();
 231:             if (list.Count > 0)
 232:             {
 233:                 Type obj = list.Take(1).Single().GetType();     //若有資料,
 234:                 PropertyInfo[] pInfo = obj.GetProperties();
 235:                 dt.TableName = obj.Name;
 236:  
 237:                 foreach (PropertyInfo info in pInfo)
 238:                 {
 239:                     if (info.MemberType == MemberTypes.Property)
 240:                     {
 241:                         dt.Columns.Add(new DataColumn(info.Name));
 242:                     }
 243:                 }
 244:             }
 245:             else
 246:                 return result;
 247:  
 248:             foreach (var p in list)
 249:             {
 250:                 PropertyInfo[] pPty = p.GetType().GetProperties();
 251:  
 252:                 DataRow dr = dt.NewRow();
 253:  
 254:                 foreach (PropertyInfo pp in pPty)
 255:                 {
 256:                     if (pp.MemberType == MemberTypes.Property)
 257:                     {
 258:                         dr[pp.Name] = pp.GetValue(p, null);
 259:                     }
 260:                 }
 261:                 dt.Rows.Add(dr);
 262:                 result++;
 263:             }
 264:             dt.WriteXml(XmlPath);
 265:  
 266:             return result;
 267:         }
 268:         /// <summary>
 269:         /// 從磁碟讀取 DataSet 的 XML 檔案.
 270:         /// </summary>
 271:         /// <typeparam name="T"></typeparam>
 272:         /// <param name="list"></param>
 273:         public static List<T> LoadFromDisk<T>(this List<T> list, string XmlPath)
 274:         {
 275:             List<T> t = new List<T>();
 276:  
 277:             DataSet ds = new DataSet();
 278:             ds.ReadXml(XmlPath);
 279:             DataTable dt = ds.Tables["ATable"];
 280:             //dt.ReadXml(XmlPath);
 281:             foreach (DataRow dr in dt.Rows)
 282:             {
 283:                 T p = Activator.CreateInstance<T>();
 284:                 foreach (DataColumn col in dt.Columns)
 285:                 {
 286:                     Type pType = p.GetType();
 287:                     PropertyInfo pInfo = pType.GetProperty(col.ColumnName);
 288:                     if (pInfo.PropertyType == typeof(System.Int32))
 289:                     {
 290:                         pInfo.SetValue(p, Convert.ToInt32(dr[col.ColumnName]), null);
 291:                     }
 292:                     else
 293:                     {
 294:                         pInfo.SetValue(p, dr[col.ColumnName], null);
 295:                     }
 296:                 }
 297:                 t.Add(p);
 298:             }
 299:             return t;
 300:         }
 301:         /// <summary>
 302:         /// 將 List<T> Bin 序列化後存檔 
 303:         /// </summary>
 304:         /// <typeparam name="T"></typeparam>
 305:         /// <param name="list"></param>
 306:         /// <param name="XmlPath"></param>
 307:         /// <returns></returns>
 308:         public static int binSaveToDisk<T>(this List<T> list, string BinPath)
 309:         {
 310:             try
 311:             {
 312:                 using (Stream stream = File.Open(BinPath, FileMode.Create))
 313:                 {
 314:                     BinaryFormatter bin = new BinaryFormatter();
 315:                     bin.Serialize(stream, list);
 316:                     return list.Count;
 317:                 }
 318:             }
 319:             catch (IOException)
 320:             {
 321:                 return -1;
 322:             }
 323:         }
 324:         /// <summary>
 325:         /// 讀取序列化 Bin 檔案到 List<T>
 326:         /// </summary>
 327:         /// <typeparam name="T"></typeparam>
 328:         /// <param name="list"></param>
 329:         /// <param name="XmlPath"></param>
 330:         /// <returns></returns>
 331:         public static List<T> binLoadFromDisk<T>(this List<T> list, string BinPath)
 332:         {
 333:             try
 334:             {
 335:                 using (Stream stream = File.Open(BinPath, FileMode.Open))
 336:                 {
 337:                     BinaryFormatter bin = new BinaryFormatter();
 338:  
 339:                     list = (List<T>)bin.Deserialize(stream);
 340:                     return list;
 341:                 }
 342:             }
 343:             catch (IOException)
 344:             {
 345:                 return list;
 346:             }
 347:         }
 348:  
 349:  
 350:         #region < 還不能用 >
 351:         /// <summary>
 352:         /// 將 List<T> XML 序列化後存檔 
 353:         /// </summary>
 354:         /// <typeparam name="T"></typeparam>
 355:         /// <param name="list"></param>
 356:         /// <param name="BinPath"></param>
 357:         /// <returns></returns>+
 358:         public static int xmlSaveToDisk<T>(this List<T> list, string XmlPath)
 359:         {
 360:             System.Type t = typeof(List<T>);
 361:             XmlSerializer x = new XmlSerializer(t);
 362:             TextWriter writer = new StreamWriter(XmlPath);
 363:             x.Serialize(writer, list);
 364:             return list.Count;
 365:         }
 366:         /// <summary>
 367:         /// 讀取序列化 XML 檔案到 List<T>
 368:         /// </summary>
 369:         /// <typeparam name="T"></typeparam>
 370:         /// <param name="list"></param>
 371:         /// <param name="XmlPath"></param>
 372:         /// <returns></returns>
 373:         public static List<T> xmlLoadFromDisk<T>(this List<T> list, string XmlPath)
 374:         {
 375:             return list;
 376:         }
 377:         #endregion
 378:  
 379:         /* for Excel */
 380:         /// <summary>
 381:         /// ExportExcel : 用來匯出Excel檔案
 382:         /// GetDisplayName : 取得DisplayNameAttribute中所設定的名稱
 383:         /// GetPropertyDisplayNames : 取得Property的顯示名稱,用來當作標題
 384:         /// GetPropertyValues : 取得Property的值
 385:         /// <summary>
 386:         public static void ExportExcel<T>(this List<T> dataList, string fileName, string SheetName)
 387:         {
 388:             //int result = 0;
 389:             var datatype = typeof(T);
 390:  
 391:             //Create workbook
 392:             HSSFWorkbook hssfworkbook = new HSSFWorkbook();
 393:             ISheet sheet = hssfworkbook.CreateSheet(string.Format("{0}", datatype.GetDisplayName()));
 394:             hssfworkbook.SetSheetName(0, SheetName); // 修改 Sheet Name.
 395:  
 396:             //Insert titles
 397:             var row = sheet.CreateRow(0);
 398:             var titleList = datatype.GetPropertyDisplayNames();
 399:             for (int i = 0; i < titleList.Count; i++)
 400:             {
 401:                 row.CreateCell(i).SetCellValue(titleList[i]);
 402:             }
 403:  
 404:             //Insert data values
 405:             for (int i = 1; i < dataList.Count() + 1; i++)
 406:             {
 407:                 var tmpRow = sheet.CreateRow(i);
 408:                 var valueList = dataList.ElementAt(i - 1).GetPropertyValues();
 409:  
 410:                 for (int j = 0; j < valueList.Count; j++)
 411:                 {
 412:                     tmpRow.CreateCell(j).SetCellValue(valueList[j]);
 413:                 }
 414:             }
 415:  
 416:             //Save file
 417:             FileStream file = new FileStream(fileName, FileMode.Create);
 418:             hssfworkbook.Write(file);
 419:             file.Close();
 420:         }
 421:         public static string GetDisplayName(this MemberInfo memberInfo)
 422:         {
 423:             var titleName = string.Empty;
 424:  
 425:             //Try get DisplayName
 426:             var attribute = memberInfo.GetCustomAttributes(typeof(DisplayNameAttribute), false).FirstOrDefault();
 427:             if (attribute != null)
 428:             {
 429:                 titleName = (attribute as DisplayNameAttribute).DisplayName;
 430:             }
 431:             //If no DisplayName
 432:             else
 433:             {
 434:                 titleName = memberInfo.Name;
 435:             }
 436:  
 437:             return titleName;
 438:         }
 439:         public static List<string> GetPropertyDisplayNames(this Type type)
 440:         {
 441:             var titleList = new List<string>();
 442:             var propertyInfos = type.GetProperties();
 443:  
 444:             foreach (var propertyInfo in propertyInfos)
 445:             {
 446:                 var titleName = propertyInfo.GetDisplayName();
 447:  
 448:                 titleList.Add(titleName);
 449:             }
 450:  
 451:             return titleList;
 452:         }
 453:         /// <summary>
 454:         /// 該方法已經將 List<T> 的所有數據均轉成 string 傳回。故存入Excel的都是 string
 455:         /// </summary>
 456:         public static List<string> GetPropertyValues<T>(this T data)
 457:         {
 458:             var propertyValues = new List<string>();
 459:             var propertyInfos = data.GetType().GetProperties();
 460:  
 461:             foreach (var propertyInfo in propertyInfos)
 462:             {
 463:                 propertyValues.Add(propertyInfo.GetValue(data, null).ToString());
 464:             }
 465:  
 466:             return propertyValues;
 467:         }
 468:         /// <summary>
 469:         /// 要將 Excel 轉到 List<T> 還有問題未解決。
 470:         /// Excel 載入的全是 string 除非我使用 List<string> 否則會出錯 ?????
 471:         /// </summary>
 472:         public static List<T> ImportExcel<T>(this List<T> list, string ExcelFileName, string SheetName) where T : class, new()
 473:         {
 474:             DataTable table = new DataTable();
 475:  
 476:             using (FileStream fs = new FileStream(ExcelFileName, FileMode.Open))
 477:             {
 478:                 //DataTable dt = RenderDataTableFromExcel(fs, 0, 0);
 479:                 table = jExcel.RenderDataTableFromExcel(fs, SheetName, 0);
 480:             }
 481:  
 482:             List<T> L = new List<T>();
 483:             L = DataTableToList<T>(table);
 484:             return list;
 485:         }
 486:     }
 487:  
 488:     public static class jExcel
 489:     {
 490:         public static Stream RenderDataTableToExcel(DataTable SourceTable)
 491:         {
 492:             HSSFWorkbook hssfworkbook = new HSSFWorkbook();
 493:             MemoryStream ms = new MemoryStream();
 494:             ISheet sheet = hssfworkbook.CreateSheet();
 495:             IRow headerRow = sheet.CreateRow(0);
 496:  
 497:             // handling header.
 498:             foreach (DataColumn column in SourceTable.Columns)
 499:                 headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
 500:  
 501:             // handling value.
 502:             int rowIndex = 1;
 503:  
 504:             foreach (DataRow row in SourceTable.Rows)
 505:             {
 506:                 IRow dataRow = sheet.CreateRow(rowIndex);
 507:  
 508:                 foreach (DataColumn column in SourceTable.Columns)
 509:                 {
 510:                     dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
 511:                 }
 512:  
 513:                 rowIndex++;
 514:             }
 515:  
 516:             hssfworkbook.Write(ms);
 517:             ms.Flush();
 518:             ms.Position = 0;
 519:  
 520:             sheet = null;
 521:             headerRow = null;
 522:             hssfworkbook = null;
 523:  
 524:             return ms;
 525:         }
 526:         public static void RenderDataTableToExcel(DataTable SourceTable, string FileName)
 527:         {
 528:             MemoryStream ms = RenderDataTableToExcel(SourceTable) as MemoryStream;
 529:             FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
 530:             //FileStream fs = new FileStream(FileName, FileMode.Append, FileAccess.Write); //..在檔案存在時開啟它並搜尋至檔案末端,或建立新檔案
 531:  
 532:             byte[] data = ms.ToArray();
 533:  
 534:             fs.Write(data, 0, data.Length);
 535:             fs.Flush();
 536:             fs.Close();
 537:  
 538:             data = null;
 539:             ms = null;
 540:             fs = null;
 541:         }
 542:         public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex)
 543:         {
 544:             HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);
 545:             ISheet sheet = workbook.GetSheet(SheetName);
 546:             return RenderDataTableFromExcelMethod(ExcelFileStream, HeaderRowIndex, ref workbook, ref sheet);
 547:         }
 548:         public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex)
 549:         {
 550:             HSSFWorkbook workbook = new HSSFWorkbook(ExcelFileStream);
 551:             ISheet sheet = workbook.GetSheetAt(SheetIndex);
 552:             return RenderDataTableFromExcelMethod(ExcelFileStream, HeaderRowIndex, ref workbook, ref sheet);
 553:         }
 554:         private static DataTable RenderDataTableFromExcelMethod(Stream ExcelFileStream, int HeaderRowIndex, ref HSSFWorkbook workbook, ref ISheet sheet)
 555:         {
 556:             //要求公式重算結果 //..2014/03/26
 557:             sheet.ForceFormulaRecalculation = true;
 558:  
 559:             DataTable table = new DataTable();
 560:  
 561:             IRow headerRow = sheet.GetRow(HeaderRowIndex);
 562:             int cellCount = headerRow.LastCellNum;
 563:  
 564:             #region 取得資料欄位名稱
 565:             for (int i = headerRow.FirstCellNum; i < cellCount; i++)
 566:             {
 567:                 DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
 568:                 table.Columns.Add(column);
 569:             }
 570:             #endregion
 571:  
 572:             #region 取得資料內容
 573:             int rowCount = sheet.LastRowNum;
 574:             for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
 575:             {
 576:                 IRow row = sheet.GetRow(i);
 577:                 DataRow dataRow = table.NewRow();
 578:  
 579:                 for (int j = row.FirstCellNum; j < cellCount; j++)
 580:                 {
 581:                     if (row.GetCell(j) != null)
 582:                     {
 583:                         #region..2014/03/26  處理公式
 584:                         if (row.GetCell(j).CellType == CellType.FORMULA)
 585:                         {
 586:                             switch (row.GetCell(j).CachedFormulaResultType)
 587:                             {
 588:                                 case CellType.BLANK:
 589:                                     dataRow[j] = "BLANK";
 590:                                     break;
 591:                                 case CellType.BOOLEAN:
 592:                                     dataRow[j] = row.GetCell(j).StringCellValue;
 593:                                     break;
 594:                                 case CellType.ERROR:
 595:                                     dataRow[j] = "ERROR";
 596:                                     break;
 597:                                 case CellType.FORMULA:
 598:                                     dataRow[j] = row.GetCell(j).RichStringCellValue.ToString();
 599:                                     break;
 600:                                 case CellType.NUMERIC:
 601:                                     dataRow[j] = row.GetCell(j).NumericCellValue.ToString();
 602:                                     break;
 603:                                 case CellType.STRING:
 604:                                     dataRow[j] = row.GetCell(j).StringCellValue;
 605:                                     break;
 606:                                 case CellType.Unknown:
 607:                                     dataRow[j] = "Unknown";
 608:                                     break;
 609:                                 default:
 610:                                     break;
 611:                             }
 612:                         #endregion..2014/03/26  處理公式
 613:                         }
 614:                         else
 615:                         {
 616:                             dataRow[j] = row.GetCell(j).ToString();
 617:                         }
 618:                     }
 619:                 }
 620:  
 621:                 table.Rows.Add(dataRow);
 622:             }
 623:             #endregion
 624:  
 625:             ExcelFileStream.Close();
 626:             workbook = null;
 627:             sheet = null;
 628:             return table;
 629:         }
 630:  
 631:         //-----<< 擴充可寫入多個 SHEET 並修改SHEET NAME >>----
 632:         public static Stream RenderDataTableToExcel(List<SheetTable> SourceTables)
 633:         {
 634:             HSSFWorkbook hssfworkbook = new HSSFWorkbook();
 635:             MemoryStream ms = new MemoryStream();
 636:             List<ISheet> sheets = new List<ISheet>();
 637:             for (int k = 0; k < SourceTables.Count(); k++)
 638:             {
 639:                 ISheet sheet = hssfworkbook.CreateSheet();
 640:                 sheets.Add(sheet);
 641:             }
 642:             IRow headerRow;
 643:  
 644:  
 645:             for (int i = 0; i < SourceTables.Count(); i++)
 646:             {
 647:                 SheetTable Source = SourceTables[i];
 648:                 hssfworkbook.SetSheetName(i, Source.TableName); // 修改 Sheet Name.
 649:  
 650:                 #region ==[handling header]==
 651:                 headerRow = sheets[i].CreateRow(0);
 652:                 foreach (DataColumn column in Source.SourceTable.Columns)
 653:                 {
 654:                     headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
 655:                 }
 656:                 #endregion
 657:  
 658:                 #region ==[handling value]==
 659:                 int rowIndex = 1;
 660:  
 661:                 foreach (DataRow row in Source.SourceTable.Rows)
 662:                 {
 663:                     IRow dataRow = sheets[i].CreateRow(rowIndex);
 664:  
 665:                     foreach (DataColumn column in Source.SourceTable.Columns)
 666:                     {
 667:                         dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
 668:                     }
 669:  
 670:                     rowIndex++;
 671:                 }
 672:                 #endregion
 673:             }
 674:  
 675:             hssfworkbook.Write(ms);
 676:             ms.Flush();
 677:             ms.Position = 0;
 678:  
 679:             //sheet = null;
 680:             headerRow = null;
 681:             hssfworkbook = null;
 682:  
 683:             return ms;
 684:         }
 685:         public static void RenderDataTableToExcel(List<SheetTable> SourceTables, string FileName)
 686:         {
 687:             MemoryStream ms = RenderDataTableToExcel(SourceTables) as MemoryStream;
 688:             FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write);
 689:             //FileStream fs = new FileStream(FileName, FileMode.Append, FileAccess.Write); //..在檔案存在時開啟它並搜尋至檔案末端,或建立新檔案
 690:  
 691:             byte[] data = ms.ToArray();
 692:  
 693:             fs.Write(data, 0, data.Length);
 694:             fs.Flush();
 695:             fs.Close();
 696:  
 697:             data = null;
 698:             ms = null;
 699:             fs = null;
 700:         }
 701:     }
 702:  
 703:     public class SheetTable
 704:     {
 705:         public SheetTable() { }
 706:         public SheetTable(DataTable table, string name)
 707:         {
 708:             SourceTable = table;
 709:             TableName = name;
 710:         }
 711:  
 712:         public DataTable SourceTable;
 713:         public string TableName;
 714:     }
 715: }



具體實現





 

 

 

   1: using System;
   2: using System.Collections;
   3: using System.Collections.Generic;
   4: using System.ComponentModel;
   5: using System.Data;
   6: using System.Drawing;
   7: using System.Linq;
   8: using System.Text;
   9:  
  10: using System.Windows.Forms;
  11: using System.IO.Ports;
  12: using System.IO;
  13: using System.Threading;
  14: using System.Diagnostics;//記得using
  15: using System.Reflection;//記得using
  16:  
  17: using Laser5Axis.Extension;
  18:  
  19:  
  20: namespace Laser5Axis.Test
  21: {
  22:     class test
  23:     {
  24:         List<RunData> RunDatas = new List<RunData>();
  25:  
  26:         public void Test()
  27:         {
  28:             //.. Save to File
  29:             RunData.SaveToFile(ref RunDatas, "test.bin");
  30:             RunData.SaveToXML(ref RunDatas, "test.xml");
  31:             RunData.ExportExcel(ref RunDatas, "test.xls", "sheet1");
  32:  
  33:             //.. Load from File
  34:             RunData.LoadFromFile(ref RunDatas, "test.bin");
  35:             RunData.LoadFromXML(ref RunDatas, "test.xml");
  36:             RunData.ImportExcel(ref RunDatas, "test.xls", "sheet1");
  37:         }
  38:  
  39:     }
  40:  
  41:  
  42:     [Serializable()]
  43:     public class RunData
  44:     {
  45:         /* 方法 */
  46:         public string getString()
  47:         {
  48:             string strRunLaser = RunLaser ? "1" : "0";
  49:             string Result = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12}",
  50:                 X_Axis_Pos, X_Axis_Speed,
  51:                 Y_Axis_Pos, Y_Axis_Speed,
  52:                 Z_Axis_Pos, Z_Axis_Speed,
  53:                 S1_Axis_Pos, S1_Axis_Speed,
  54:                 S2_Axis_Pos, S2_Axis_Speed,
  55:                 Z_SafePos, strRunLaser,
  56:                 SelectCAD
  57:                  );
  58:             return Result;
  59:         }
  60:         public static void LoadFromFile(ref List<RunData> list, string FileName)
  61:         {
  62:             list = list.binLoadFromDisk(FileName);
  63:         }
  64:         public static void SaveToFile(ref List<RunData> list, string FileName)
  65:         {
  66:             list.binSaveToDisk(FileName);
  67:         }
  68:         public static void LoadFromXML(ref List<RunData> list, string FileName)
  69:         {
  70:             list = list.xmlLoadFromDisk(FileName);
  71:         }
  72:         public static void SaveToXML(ref List<RunData> list, string FileName)
  73:         {
  74:             list.xmlSaveToDisk(FileName);
  75:         }
  76:         public static void ExportExcel(ref List<RunData> list, string FileName, string sheetName)
  77:         {
  78:             list.ExportExcel(FileName, sheetName);
  79:         }
  80:         public static void ImportExcel(ref List<RunData> list, string FileName, string SheetName)
  81:         {
  82:             list = list.ImportExcel(FileName, SheetName); //尚有轉型問題
  83:         }
  84:  
  85:  
  86:         /* 屬性 */
  87:         public int Z_SafePos { get; set; }
  88:  
  89:         public int X_Axis_Pos { get; set; }
  90:         public int Y_Axis_Pos { get; set; }
  91:         public int Z_Axis_Pos { get; set; }
  92:         public int S1_Axis_Pos { get; set; }
  93:         public int S2_Axis_Pos { get; set; }
  94:  
  95:         public int X_Axis_Speed { get; set; }
  96:         public int Y_Axis_Speed { get; set; }
  97:         public int Z_Axis_Speed { get; set; }
  98:         public int S1_Axis_Speed { get; set; }
  99:         public int S2_Axis_Speed { get; set; }
 100:  
 101:         public bool RunLaser { get; set; }
 102:         public string SelectCAD { get; set; }
 103:     }
 104:  
 105: }