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("转化成功!");
以上代码可以实现功能,由于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("转化成功!");
//备忘 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 }
记录自己的成长,也希望能帮助别人成长,高手勿喷,有不足的地方非常感谢你的指导
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律