C#合併多個包含資料的TXT檔案到指定XLSX檔案
阿新 • • 發佈:2018-12-13
該Demo實現將多個TXT檔案合併到同一個XLSX檔案同一個SHEET中,相應的對TXT檔案的格式也是有要求的,主要針對需要做資料統計的XLSX檔案,要求TXT檔案中的列相鄰資料之間有明確且統一的分離標識字元,每行資料的列數和列標題個數對應
說明:.NET Framework4.0
/// <summary> /// Txt.Format ChangeTo Excel /// </summary> /// <param name="savepath"></param> excel要存放的完整路徑(X:\xx\xxx\xxxx.xlsx) /// <param name="sheetname"></param> 建立的工作表名稱 /// <param name="Source"></param> 搜尋目錄 /// <param name="flag"></param> txt檔案中的字串分離標識字元 /// <param name="ExcelTittle[]"></param> 列標題字串集合 /// <param name="patterns[]"></param> 要搜尋的指定檔案型別集合"xxx*.txt",“xxx”指檔名中包含的重要字串 public static void TxtToXlsx(string Source,string sheetname, char flag, string[] patterns, string SavePath,string[] ExcelTittle) { int index = 0; foreach (string pattern in patterns) { try { string[] filenames = Directory.GetFiles(Source, pattern, SearchOption.AllDirectories); //下面這句是根據檔名中包含的關鍵字串進行篩選檔案的方法,詳細可以看我的另一篇部落格“C# orderby排序在檔案操作中的應用” /* fileoperation.dateorder filenames_result = fileoperation.FileSelectByName(filenames, Dstart, Dend, 8, 8); */ if (filenames_result.filenames.Length != 0 && !Array.Exists(filenames_result.filenames, string.IsNullOrEmpty)) { string savePath = SavePath + @"\" + Names[index] + filenames_result.date+ ".xlsx"; XSSFWorkbook WorkBook = new XSSFWorkbook(); WorkBook.CreateSheet(sheetname); ISheet sheet = WorkBook.GetSheetAt(0); //sheet.SetColumnWidth(); int StartRow = 0; foreach (string file in filenames_result.filenames) { int RowNumber = 0; int ColumnNmuber = 0; List<string> Contant = new List<string>(); StreamReader sr = new StreamReader(file); string ReadLine = sr.ReadLine(); FileInfo f =new FileInfo(file); string[] p = ReadLine.Split(flag); ColumnNmuber = p.Length; while (ReadLine != null) { RowNumber++; Contant.Add(ReadLine); ReadLine = sr.ReadLine(); } //建立單元格,先行後列 for (int j = StartRow; j < StartRow + RowNumber+1; j++) { sheet.CreateRow(j); XSSFRow Row = (XSSFRow)sheet.GetRow(j); for (int k = 0; k < ColumnNmuber; k++) { Row.CreateCell(k); } } //往單元格寫資料 for (int j = StartRow; j < RowNumber + StartRow+1; j++) { string[] CellValue = Contant[j - StartRow].Split(flag); for (int k = 0; k < ColumnNmuber; k++) { if (j == 0) { sheet.GetRow(j).GetCell(k).SetCellValue(ExcelTittle[k]); } else { if (CellValue[k].Contains(".") && !CellValue[k].Contains("/")) { sheet.GetRow(j).GetCell(k).SetCellValue(Convert.ToDouble(CellValue[k])); } else { sheet.GetRow(j).GetCell(k).SetCellValue(CellValue[k]); } } } } StartRow += RowNumber; } sheet.GetRow(0).CreateCell(sheet.GetRow(0).LastCellNum); sheet.GetRow(0).GetCell(sheet.GetRow(0).LastCellNum - 1).SetCellFormula("CORREL(D:D,F:F)"); sheet.GetRow(0).CreateCell(sheet.GetRow(0).LastCellNum); sheet.GetRow(0).GetCell(sheet.GetRow(0).LastCellNum - 1).SetCellFormula("CORREL(G:G,H:H)"); sheet.GetRow(0).CreateCell(sheet.GetRow(0).LastCellNum); sheet.GetRow(0).GetCell(sheet.GetRow(0).LastCellNum - 1).SetCellFormula("RSQ(F:F,D:D)"); sheet.GetRow(0).CreateCell(sheet.GetRow(0).LastCellNum); sheet.GetRow(0).GetCell(sheet.GetRow(0).LastCellNum - 1).SetCellFormula("RSQ(H:H,G:G)"); //不存在目錄就建立一個 Directory.CreateDirectory(Path.GetDirectoryName(savePath)); FileStream file2007 = new FileStream(savePath, FileMode.Create); WorkBook.Write(file2007); file2007.Close(); WorkBook.Close(); MainView.frm.listBox2.Items.Add(string.Format( "Xlsx儲存成功 '{0}' ", savePath) + "\t" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); } else { //MainView是我的主窗體名稱,在主窗體程式碼中使用瞭如下方式,實現在其他類中對主窗體控制元件的訪問。 /* public static MainView frm; public MainView() { InitializeComponent(); frm = this; }*/ MainView.frm.listBox2.Items.Add( "Xlsx儲存失敗" + "未找到原始檔" + "\t" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); } index++; } catch (Exception ex) { MainView.frm.listBox2.Items.Add( "Xlsx儲存失敗" + ex.Message + "\t" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); index++; } } }