C#实现把txt文本数据快速读取到excel中

 

今天预实现一功能,将txt中的数据转到excel表中,做为matlab的数据源。搜集一些c#操作excel的程序。步骤如下:

下载一个Microsoft.Office.Interop.Excel.dll   在项目中引用。

编写代码如下:

复制代码
 1 string path = "c://date//xyu.txt";
 2 StreamReader sr = new StreamReader(path);
 3 string strLine = sr.ReadLine();
 4 int rowNum = 1;
 5 object missing = System.Reflection.Missing.Value;
 6  
 7 ApplicationClass app = new ApplicationClass();
 8  
 9 app.Application.Workbooks.Add(true);
10  
11 Workbook book = (Workbook)app.ActiveWorkbook;
12 Worksheet sheet = (Worksheet)book.ActiveSheet;
13 while (!string.IsNullOrEmpty(strLine))
14 {
15   string[] tempArr;
16   tempArr = strLine.Split(',');
17   for (int k = 1; k <= tempArr.Length; k++)
18   {
19     sheet.Cells[rowNum, k] = tempArr[k - 1];
20  
21   }
22   strLine = sr.ReadLine();
23   rowNum++;
24  
25 }
26  
27 //保存excel文件
28 book.SaveCopyAs("D://source.xls");
29 //关闭文件
30 book.Close(false, missing, missing);
31 //退出excel
32 app.Quit();
33 MessageBox.Show("转化成功!");
View Code
复制代码

以上代码可以实现功能,由于txt中的数据有60501行,数据量太大。我估算了一下,用以上代码转到excel要用大约2-3分钟。我一共要转9个txt。一共要用20多分钟。这样作出系统显然是让人难以忍受的。接着找资料,发现用rang方法可以提高速率。只用大约3-4秒钟的时间,提高效率几十倍。代码如下:

复制代码
 1 string path = "c://date//xyu.txt";
 2      StreamReader sr = new StreamReader(path);
 3      string strLine = sr.ReadLine();
 4      int rowNum = 1;
 5      object missing = System.Reflection.Missing.Value;
 6  
 7      ApplicationClass app = new ApplicationClass();
 8  
 9      app.Application.Workbooks.Add(true);
10  
11      Workbook book = (Workbook)app.ActiveWorkbook;
12      Worksheet sheet = (Worksheet)book.ActiveSheet;
13      Range r = sheet.get_Range("A1", "C1");
14  
15      //获取行数
16  
17  
18  
19  
20  
21      object[,] objectData = new object[65535, 3]; 
22      while (!string.IsNullOrEmpty(strLine))
23      {
24        string[] tempArr;
25        tempArr = strLine.Split(',');
26        for (int k = 1; k <= tempArr.Length; k++)
27        {
28           
29          objectData[rowNum-1, k-1] = tempArr[k - 1];
30  
31        }
32        strLine = sr.ReadLine();
33        rowNum++;
34  
35      }
36      r = r.get_Resize(65535, 3);
37      r.Value2 = objectData;
38      r.EntireColumn.AutoFit();
39      //保存excel文件
40      book.SaveCopyAs("D://source.xls");
41      //关闭文件
42      book.Close(false, missing, missing);
43      //退出excel
44      app.Quit();
45      MessageBox.Show("转化成功!");
View Code
复制代码

 

 

//备忘 https://www.jb51.net/article/67256.htm

复制代码
 1 /// <summary> 
 2 /// 日志文件记录 
 3 /// </summary> 
 4 /// <param name="logName">日志描述</param>
 5 /// <param name="msg">写入信息</param> 
 6 public static void WriteMsg(string logName, string msg)
 7 {
 8 try
 9 {
10 string path = Path.Combine("./log");
11 if (!Directory.Exists(path))//判断是否有该文件 
12 Directory.CreateDirectory(path);
13 string logFileName = path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";//生成日志文件 
14 if (!File.Exists(logFileName))//判断日志文件是否为当天
15 {
16 FileStream fs;
17 fs = File.Create(logFileName);//创建文件
18 fs.Close();
19 }
20 StreamWriter writer = File.AppendText(logFileName);//文件中添加文件流
21 
22 writer.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " " + logName + "\r\n" + msg);
23 writer.WriteLine("--------------------------------分割线--------------------------------");
24 writer.Flush();
25 writer.Close();
26 }
27 catch (Exception e)
28 {
29 string path = Path.Combine("./log");
30 if (!Directory.Exists(path))
31 Directory.CreateDirectory(path);
32 string logFileName = path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
33 if (!File.Exists(logFileName))//判断日志文件是否为当天
34 {
35 FileStream fs;
36 fs = File.Create(logFileName);//创建文件
37 fs.Close();
38 }
39 StreamWriter writer = File.AppendText(logFileName);//文件中添加文件流
40 writer.WriteLine(DateTime.Now.ToString("日志记录错误HH:mm:ss") + "\r\n " + e.Message + " " + msg);
41 writer.WriteLine("--------------------------------分割线--------------------------------");
42 writer.Flush();
43 writer.Close();
44 }
45 
46 }
复制代码

 

/*****第二种*******/

复制代码
 1 /// <summary>
 2 /// 
 3 /// </summary>
 4 /// <param name="logtype">日志类型</param>
 5 /// <param name="source">来源</param>
 6 /// <param name="message">结果</param>
 7 /// <param name="detail">详细信息</param>
 8 public static void Write(string logtype, string source, string message, string detail)
 9 {
10 try
11 {
12 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs");
13 Directory.CreateDirectory(path);
14 string str2 = Path.Combine(path, DateTime.Today.ToString("yyyyMMdd") + ".log");
15 string str3 = "********************************" + DateTime.Now.ToString() + "********************************";
16 using (FileStream stream = new FileStream(str2, FileMode.Append, FileAccess.Write, FileShare.Read))
17 {
18 using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
19 {
20 writer.WriteLine(str3);
21 writer.WriteLine("Type: " + logtype);
22 writer.WriteLine("Source: " + source);
23 writer.WriteLine("Message: " + message);
24 writer.WriteLine("Detail: " + detail);
25 string str4 = "";
26 writer.WriteLine(str4.PadLeft(str3.Length, '*'));
27 writer.WriteLine();
28 writer.Flush();
29 }
30 }
31 }
32 catch
33 {
34 }
复制代码

 

记录自己的成长,也希望能帮助别人成长,高手勿喷,有不足的地方非常感谢你的指导

 

posted @   firespeed  阅读(2468)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起