C#读取excel文件时,报“外部表不是预期的格式”

文章描述了在尝试读取一个可以用记事本打开且非标准Excel格式的文件时遇到的问题。通过尝试各种通用的读取方法如OleDB和NOPI失败后,作者发现文件实际上是CSV格式。最终解决方案是将文件转换为.txt格式并使用读取文本文件的方法进行处理。此外,还提供了读写CSV文件的示例代码。
摘要由CSDN通过智能技术生成

记录

读取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);
                    }
                }
            }

        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值