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

问题描述 投票:15回答:2

我相信这里有很多关于这个问题的讨论。但我阅读了所有文章并尝试使用,但它永远无法与C#一起使用。我的目标很简单,我已经有一个csv文件。只想转换exel文件并完成。许多人说使用spire.xls可以,但是我相信MS .office.interop.excel可以处理。

Converting Excel File From .csv To .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();

这里有很多错误。修改代码在下面,现在我仅在参考中使用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(); 

这里是错误消息

错误3名称'XlFileFormat'在当前不存在上下文C:\ Users \ jochoi \ Desktop \ joseph_BT_전류_code \ DC_Test-ver01 \ DC_Test \ DC.cs 528 54 DC_Test错误4名称'XlSaveAsAccessMode'在当前不存在上下文C:\ Users \ jochoi \ Desktop \ joseph_BT_전류_code \ DC_Test-ver01 \ DC_Test \ DC.cs 528142 DC_Test错误4方法“关闭”没有重载为“ 0”参数C:\ Users \ jochoi \ Desktop \ joseph_BT_전류_code \ DC_Test-ver01 \ DC_Test \ DC.cs 525 13 DC_Test

我的目标是只获取存在的csv文件,然后更改为excel文件。没有人有其他解决方案,因为该答案不适用于我的电脑。 (c#)

c# .net excel csv converters
2个回答
43
投票

COM Interop不是最佳解决方案,尤其是如果您打算在server environment中运行代码。

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

另一种方法是使用适合该目的的组件。我用过EEplus,它确实很脏。它具有LGPL许可证,但作者似乎并不愿意worried您在商业产品中使用它。

只需安装nuget包:

Install-Package EPPlus

并使用此代码:

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();
    }
}

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

我已经使用here中的一些数据对其进行了测试。

可以找到更多样本here

UPDATE:

另一个选择是自己将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);
}

并使用其他开源项目,例如NPOIClosedXMLNPOIClosedXML无法读取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);
}

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

[如果有人感兴趣,可以在github上找到sample project,并进行一些测试来比较这三种产品的性能。


-1
投票

在文件顶部插入以下行:

using Microsoft.Office.Interop.Excel;

这将包括使用XlFileFormat和XlSaveAsAccessMode类所需的名称空间。如果这不起作用,则可能还需要在项目中添加对此DLL的引用。

Close方法采用以下参数:

  1. 保存更改
  2. 文件名
  3. RouteWorkbook

该文档为here

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.