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

我相信这里有很多关于这个问题的讨论。 但我阅读所有post,并尝试,但它从来没有与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(); 

这里有很多错误。 修改代码是在下面,现在我只使用MS.office.interop.excel和MS.office.interop.core在我的参考。 它看起来像我需要使用另一个DLL文件。 无论如何,我确实按照该代码,并作出新的代码。 它减less了错误,但我不知道这是正确的做法。 下面是我现在尝试的。

  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文件。 没有人有其他的解决scheme,因为这个答案是不是在我的电脑工作。 (C#)

COM Interop并不是最好的解决scheme,特别是如果您打算在服务器环境中运行您的代码。

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

另一种方法是使用适合于此目的的组件。
我已经使用EEplus ,这是肮脏的工作。 它有一个LGPL许可证,但作者似乎并不担心你在你的商业产品中使用它。

只需安装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(); } } 

您可以使用ExcelTextFormatconfigurationCVS的结构。

我用从这里取得的一些数据对它进行了testing。

可以在这里find更多的样本。

更新:

另一种select是将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); } 

并使用其他开源项目,如NPOI或ClosedXML 。 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); } 

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上有一个示例项目 ,并比较这三个产品的性能testing。

在文件顶部插入以下行:

 using Microsoft.Office.Interop.Excel; 

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

Close方法接受以下参数:

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

这里的文档就在这里 。

希望有所帮助。