记录
读取Excel文件时报错
比较全面的问题汇总:转自https://blog.csdn.net/question00/article/details/51445663
最后发现我的excel文件的格式不是标准的Excel格式,能用记事本打开并且不是乱码,所以网上通用的读取Excel文件的办法都不行,例如:OleDB,NOPI,但是文件单独另存为.xls,.xlsx文件后用这些方法可以读取。显然,读取大量文件时不能这样操作。
按照链接里博主的代码“xml转换为excel标准格式”失败。
最后解决:将文件复制到一个临时文件夹,更改文件后缀名为txt,用读txt的办法去读取这个excel文件。我是txt读取到DataTable里面,这个网上就有很多办法了。
附上改文件后缀的代码:
/// <summary>
/// 更改文件后缀名
/// </summary>
/// <param name="path">文件夹路径</param>
/// <param name="sourcefileformat">源文件后缀名</param>
/// <param name="newfileformat">需要的后缀名</param>
public void ChangeFileType(string path, string sourcefileformat, string newfileformat)
{
try
{
DirectoryInfo mydir = new DirectoryInfo(path);
FileInfo[] fileInfo = mydir.GetFiles();
//遍历文件夹里的文件
foreach (FileSystemInfo fsi in mydir.GetFileSystemInfos())
{
if (fsi is FileInfo)
{
FileInfo fi = (FileInfo)fsi;
if (fi.Extension.ToUpper() == $".{sourcefileformat.ToUpper()}")
{
fi.MoveTo(Path.ChangeExtension(fi.FullName, newfileformat)); //更改文件类型为txt
}
}
}
}
catch
{
throw;
}
}
//调用
//ChangeFileType("D:\temp", "xls", "txt");
萌新,这个问题卡了好久,记录一下。
更新:还是犯蠢了,不是excel的格式,检查了是csv格式,可以直接用读写csv文件的方式读写该文件,上面改文件格式的方法会经常出现该文件被占用的提示。
/// <summary>
/// 写入csv
/// </summary>
/// <param name="result">写入内容</param>
public static void WriteCsv(string result)
{
string fileName = "D:\\新建文件夹\\2023-1-1.csv";//文件路径
string path = Path.GetDirectoryName(fileName);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (!File.Exists(fileName))
{
StreamWriter sw = new StreamWriter(fileName, true, Encoding.UTF8);
string str1 = "条码" + "," + "时间" + "," + "结果" + "\t\n"; //Header,可自己随意创建,以逗号隔开是为了在excel里面打开时是一个个单元格的形式
sw.Write(str1);
sw.Close();
}
StreamWriter swl = new StreamWriter(fileName, true, Encoding.UTF8);
string str = "20230101" + "," + "2023-01-01" + "," + "PASS" + "\t\n";
//string str = $"{result}\t\n" ;
swl.Write(str);
swl.Close();
}
/// <summary>
/// 读取csv
/// </summary>
/// <param name="path">完整路径</param>
/// <param name="data">引入一个数据列表</param>
public static void ReadCsv(string path, out List<string> data)
{
StreamReader sr;
data = new List<string>();
try
{
using (sr = new StreamReader(path, Encoding.GetEncoding("GB2312")))
{
string str = "";
while ((str = sr.ReadLine()) != null)
{
data.Add(str);
}
}
}
catch (Exception ex)
{
foreach (Process process in Process.GetProcesses())
{
if (process.ProcessName.ToUpper().Equals("EXCEL"))
process.Kill();
}
GC.Collect();
Thread.Sleep(10);
Console.WriteLine(ex.StackTrace);
using (sr = new StreamReader(path, Encoding.GetEncoding("GB2312")))
{
string str = "";
while ((str = sr.ReadLine()) != null)
{
data.Add(str);
}
}
}
}