首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有什么简单的方法可以把.xls文件转换成.csv文件?(Excel)

有没有什么简单的方法可以把.xls文件转换成.csv文件?(Excel)
EN

Stack Overflow用户
提问于 2010-03-29 14:44:09
回答 8查看 112.5K关注 0票数 51

有没有什么简单的方法可以把.xls文件转换成.csv文件?(Excel)

在C#代码中?

我的意思是将现有的.xls文件转换成.csv文件

提前感谢

EN

Stack Overflow用户

发布于 2021-11-22 18:16:30

在更新到Visual Studio 2022并测试最相关的答案后,我不得不提出一个混合解决方案。

首先,我们需要安装以下Nuget包:ExcelDataReaderExcelDataReader.DataSetSystem.Text.Encoding.CodePages

然后,为了简洁的架构,继续在相应的名称空间中创建一个单独的类:

代码语言:javascript
运行
复制
using ExcelDataReader;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace YourProjectNameSpace
{
    public class ExcelFileHelper
    {

        /// <summary>
        /// Converts a given XLS into CSV file format.
        /// </summary>
        public static bool SaveAsCsv(string excelFilePath, string destinationCsvFilePath)
        {

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            using (var stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                IExcelDataReader reader = null;
                if (excelFilePath.EndsWith(".xls"))
                {
                    reader = ExcelReaderFactory.CreateBinaryReader(stream);
                }
                else if (excelFilePath.EndsWith(".xlsx"))
                {
                    reader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                }

                if (reader == null)
                    return false;

                var ds = reader.AsDataSet(new ExcelDataSetConfiguration()
                {
                    ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                    {
                        UseHeaderRow = false
                    }
                });

                var csvContent = string.Empty;
                int row_no = 0;
                while (row_no < ds.Tables[0].Rows.Count)
                {
                    var arr = new List<string>();
                    for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                    {
                        arr.Add(ds.Tables[0].Rows[row_no][i].ToString());
                    }
                    row_no++;
                    csvContent += string.Join(",", arr) + "\n";
                }
                StreamWriter csv = new StreamWriter(destinationCsvFilePath, false);
                csv.Write(csvContent);
                csv.Close();
                return true;
            }
        }
    }
}

请注意,我必须在函数的开头包含以下行:

代码语言:javascript
运行
复制
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

如果省略上面的行,您可能会得到以下错误:

NotSupportedException:没有数据可用于编码1252

所以,为了更好的兼容性,请务必使用它。

最后,使用示例:

代码语言:javascript
运行
复制
var execPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)?.Replace("file:\\", "");
    
string FileNameXLS = "\\file.xls";
string FileNameCSV = "\\file.csv";
        
Console.WriteLine("Exporting file to CSV...." + "\n");
ExcelFileHelper.SaveAsCsv(execPath + FileNameXLS, execPath + FileNameCSV);
Console.WriteLine("File exported to CSV!" + "\n");
票数 3
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2536181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档