C# 将 csv 转换为 xls(使用现有的 csv 文件)
Posted
技术标签:
【中文标题】C# 将 csv 转换为 xls(使用现有的 csv 文件)【英文标题】:C# convert csv to xls (using existing csv file) 【发布时间】:2014-12-26 05:41:17 【问题描述】:我相信这里有很多关于这个问题的讨论。 但我阅读了所有帖子并尝试过,但它从不与 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();
这里是错误信息
Error 3 The name 'XlFileFormat' does not exist in the current 上下文 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 528 142 DC_Test 错误 4 方法 'Close' 没有重载需要 '0' 参数 C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 525 13 DC_Test
我的目标只是获取现有的 csv 文件,然后更改为 excel 文件。 有没有人有其他解决方案,因为那个答案在我的电脑上不起作用。 (c#)
【问题讨论】:
请发布您遇到的实际错误 是的,我在我的问题中添加了更多细节,还添加了错误消息...... 您可以使用链接到的问题中的库。或者你可以试试这个问题的答案中使用的方法***.com/questions/4781478/convert-csv-into-xls 【参考方案1】:COM 互操作不是最佳解决方案,尤其是当您计划在 server environment 中运行代码时。
微软目前不推荐也不支持, 无人值守的 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找到。
更新:
另一种选择是自己将 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。
NPOI 和 ClosedXML 无法读取 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,上面有一些比较三种产品的性能测试。
【讨论】:
很好,它有效。但它是免费的吗?因为我打算在我的公司使用它。我下载 EPPlus 3.1.3.zip。这是免费软件吗?我可以在我的公司使用它吗? 它是LGPL。你可以阅读这个thread。作者说你可以在你的商业项目中使用它。 @ChoiJoseph:我很高兴。不要忘记接受答案。这就是 SO 的工作方式。干杯。 我对 TypeConverter.TryConvert 有疑问。它说 TypeConverter System.ComponentModel.dll 中没有这样的方法。是自己定义的吗? @user585440:这是TypeConverter。【参考方案2】:如果您想继续使用 OpenXML,那么您可以按照此操作。
安装 nuget 包
Install-Package DocumentFormat.OpenXml -Version 2.11.3
自己将 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);
OpenXML 代码:
private bool ConvertWithOpenXml(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
if (csvLines == null || csvLines.Count() == 0)
return (false);
using (SpreadsheetDocument package = SpreadsheetDocument.Create(excelFileName, SpreadsheetDocumentType.Workbook, true))
package.AddWorkbookPart();
package.WorkbookPart.Workbook = new Workbook();
package.WorkbookPart.AddNewPart<WorksheetPart>();
SheetData xlSheetData = new SheetData();
foreach (var line in csvLines)
Row xlRow = new Row();
foreach (var col in line)
Cell xlCell = new Cell(new InlineString(new Text(col.ToString()))) DataType = CellValues.InlineString ;
xlRow.Append(xlCell);
xlSheetData.Append(xlRow);
package.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet(xlSheetData);
package.WorkbookPart.WorksheetParts.First().Worksheet.Save();
// create the worksheet to workbook relation
package.WorkbookPart.Workbook.AppendChild(new Sheets());
package.WorkbookPart.Workbook.GetFirstChild<Sheets>().AppendChild(new Sheet()
Id = package.WorkbookPart.GetIdOfPart(package.WorkbookPart.WorksheetParts.First()),
SheetId = 1,
Name = worksheetName
);
package.WorkbookPart.Workbook.Save();
return (true);
【讨论】:
【参考方案3】:在文件顶部插入以下行:
using Microsoft.Office.Interop.Excel;
这将包括使用 XlFileFormat 和 XlSaveAsAccessMode 类所需的命名空间。 如果这不起作用,您可能还需要将此 DLL 的引用添加到您的项目中。
Close 方法接受以下参数:
-
保存更改
文件名
路线工作簿
相关文档是here。
希望对您有所帮助。
【讨论】:
以上是关于C# 将 csv 转换为 xls(使用现有的 csv 文件)的主要内容,如果未能解决你的问题,请参考以下文章
csv格式转换到excel(将大容量的csv文件转为xls)
使用 Google AppS 脚本将 .csv 文件转换为 .xls