C#将csv转换为xls(使用现有的csv文件)

Cho*_*eph 14 .net c# csv excel converter

我相信这里有很多关于此事的讨论.但我读了所有帖子并尝试但它从未与c#一起工作.我的目标很简单,我有现有的csv文件.只想转换exel文件并完成.很多人说使用spire.xls,但我相信MS .office.interop.excel可以处理它.

将Excel文件从.csv转换为.xlsx

我读了上面的问题,这跟我的问题一样.但上面的代码不能在我的电脑上工作..我需要导入其他DLL才能使用它.我只是从该网站复制代码.再次复制下面......

目前我使用Lib作为MS.office.interop.excel和MS.office.interop.core

Application app = new Application();
Workbook wb = app.Workbooks.Open(@"C:\testcsv.csv", Type.Missing, Type.Missing,               Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.SaveAs(@"C:\testcsv.xlsx", XlFileFormat.xlOpenXMLWorkbook, Type.Missing,    Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.Close();
app.Quit();
Run Code Online (Sandbox Code Playgroud)

这里有很多错误.修改代码在下面,现在我只在我的参考中使用MS.office.interop.excel和MS.office.interop.core.看起来我需要使用另一个dll文件.无论如何,我确实遵循该代码并制作新代码.它减少了错误,但我不知道这是正确的方法.以下是我现在尝试的.

        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
        System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);

        xlWorkBook = xlApp.Workbooks.Open(@"C:\testcsv.csv", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        xlWorkBook.SaveAs(@"C:\testcsv.xlsx",    XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        xlWorkBook.Close(); 
Run Code Online (Sandbox Code Playgroud)

这是错误信息

   //  Error     3  The name 'XlFileFormat' does not exist in the current context   C:\Users\jochoi\Desktop\joseph_BT_??_code\DC_Test - ver01\DC_Test\DC.cs 528 54  DC_Test
   //   Error   4   The name 'XlSaveAsAccessMode' does not exist in the current context C:\Users\jochoi\Desktop\joseph_BT_??_code\DC_Test - ver01\DC_Test\DC.cs 528 142 DC_Test
   //   Error   4   No overload for method 'Close' takes '0' arguments  C:\Users\jochoi\Desktop\joseph_BT_??_code\DC_Test - ver01\DC_Test\DC.cs 525 13  DC_Test
Run Code Online (Sandbox Code Playgroud)

我的目标只是抓住存在的csv文件,只需更改为excel文件.有没有人有其他解决方案,因为这个答案在我的电脑上不起作用.(C#)

Lef*_*tyX 42

COM Interop不是最佳解决方案,特别是如果您计划在服务器环境中运行代码.

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office可能会出现不稳定的行为和/或Office在此环境中运行时出现死锁或死锁.

另一种方法是使用适合该目的的组件.
我使用过EEplus,它的工作很糟糕.它有LGPL许可证,但作者似乎并不担心您在商业产品中使用它.

只需安装nuget包:

Install-Package EPPlus
Run Code Online (Sandbox Code Playgroud)

并使用此代码:

using System.IO;
using OfficeOpenXml;

class Program
{
    static void Main(string[] args)
    {
        string csvFileName = @"FL_insurance_sample.csv";
        string excelFileName = @"FL_insurance_sample.xls";

        string worksheetsName = "TEST";

        bool firstRowIsHeader = false;

        var format = new ExcelTextFormat();
        format.Delimiter = ',';
        format.EOL = "\r";              // DEFAULT IS "\r\n";
        // format.TextQualifier = '"';

        using (ExcelPackage package = new ExcelPackage(new FileInfo(excelFileName)))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(worksheetsName);
            worksheet.Cells["A1"].LoadFromText(new FileInfo(csvFileName), format, OfficeOpenXml.Table.TableStyles.Medium27, firstRowIsHeader);
            package.Save();
        }

        Console.WriteLine("Finished!");
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用配置CVS的结构ExcelTextFormat.

我用这里的一些数据对它进行了测试.

这里可以找到更多样品.

更新:

另一种选择是自己将CSV文件作为文本文件读取:

private IEnumerable<string[]> ReadCsv(string fileName, char delimiter = ';')
{
    var lines = System.IO.File.ReadAllLines(fileName, Encoding.UTF8).Select(a => a.Split(delimiter));
    return (lines);
}
Run Code Online (Sandbox Code Playgroud)

并使用其他开源项目,如NPOIClosedXML. NPOIClosedXML无法读取CSV并进行转换,但使用该功能ReadCsv可以自己完成.

这两个项目都有许可证.

NPOI转换:

private static bool ConvertWithNPOI(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
    if (csvLines == null || csvLines.Count() == 0)
    {
    return (false);
    }

    int rowCount = 0;
    int colCount = 0;

    IWorkbook workbook = new XSSFWorkbook();
    ISheet worksheet = workbook.CreateSheet(worksheetName);

    foreach (var line in csvLines)
    {
    IRow row = worksheet.CreateRow(rowCount);

    colCount = 0;
    foreach (var col in line)
    {
        row.CreateCell(colCount).SetCellValue(TypeConverter.TryConvert(col));
        colCount++;
    }
    rowCount++;
    }

    using (FileStream fileWriter = File.Create(excelFileName))
    {
       workbook.Write(fileWriter);
       fileWriter.Close();
    }

    worksheet = null;
    workbook = null;

    return (true);
}
Run Code Online (Sandbox Code Playgroud)

ClosedXML转换:

private static bool ConvertWithClosedXml(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
    if (csvLines == null || csvLines.Count() == 0)
    {
    return (false);
    }

    int rowCount = 0;
    int colCount = 0;

    using (var workbook = new XLWorkbook())
    {
    using (var worksheet = workbook.Worksheets.Add(worksheetName))
    {
        rowCount = 1;
        foreach (var line in csvLines)
        {
        colCount = 1;
        foreach (var col in line)
        {
            worksheet.Cell(rowCount, colCount).Value = TypeConverter.TryConvert(col);
            colCount++;
        }
        rowCount++;
        }

    }
    workbook.SaveAs(excelFileName);
    }

    return (true);
}
Run Code Online (Sandbox Code Playgroud)

如果有人感兴趣,那么github上有一个示例项目,对三种产品的性能进行了一些测试.

  • 我对TypeConverter.TryConvert有问题。它说在TypeConverter System.ComponentModel.dll中没有这样的方法。它是自定义的吗? (2认同)
  • @ user585440:这是[TypeConverter](https://github.com/Leftyx/ConvertCsvToExcel/blob/master/ConvertCsvToExcel/TypeConverter.cs)。 (2认同)