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

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

问题描述:

我相信这里有很多关于这个问题的讨论。 但我阅读所有帖子并尝试,但它从来没有与C#工作。 我的目标很简单,我有现有的csv文件。 只是想转换exel文件并完成。很多人都说使用spire.xls但我相信MS。office.interop.excel可以处理它。C#将csv转换为xls(使用现有的csv文件)

Converting Excel File From .csv To .xlsx

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

目前即时通讯使用库作为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(); 

,这里是错误消息

// 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 

我的目标是只要抓住存在的csv文件,只是更改为Excel文件。 没有人有其他解决方案,因为该答案不适用于我的电脑。 (C#)

+0

请发布您收到的实际错误 – 5uperdan 2014-10-30 08:57:03

+0

是的,我在我的问题中添加更多详细信息并添加错误消息.... – 2014-10-30 09:09:32

+0

您可以使用您链接到的问题的库。或者你可以尝试在这个问题的答案中使用的方法http://*.com/questions/4781478/convert-csv-into-xls – 5uperdan 2014-10-30 09:20:14

COM Interop不是最好的解决方案,特别是如果您打算在server environment中运行代码。

微软目前并不提倡,不支持, 自动化的Microsoft Office应用程序从任何无人值守, 非交互式客户端应用程序或组件(包括ASP,ASP.NET ,DCOM和NT Service) ,因为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

+0

伟大的,它的作品。但它是免费的东西?因为我打算在我的公司使用这个。我下载EPPlus 3.1.3.zip。这是免费软件吗?我可以在我的公司使用这个吗? – 2014-10-30 10:28:53

+0

这是[LGPL](http://choosealicense.com/licenses/)。你可以阅读这个[线程](https://epplus.codeplex.com/discussions/208363)。作者说你可以在你的商业项目中使用它。 – LeftyX 2014-10-30 10:46:48

+0

谢谢....在我的公司使用它看起来没问题。很好,乐于助人。 – 2014-10-30 11:10:01

在你的文件的顶部插入以下行:

using Microsoft.Office.Interop.Excel; 

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

Close方法发生在以下参数:

  1. 的SaveChanges
  2. 文件名
  3. RouteWorkbook

该文档是here

希望有所帮助。