1. 程式人生 > >C#合併多個包含資料的TXT檔案到指定XLSX檔案

C#合併多個包含資料的TXT檔案到指定XLSX檔案

該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++;
                }
            }
        }