我相信这里有很多关于此事的讨论。 但我读了所有帖子并尝试但它从未与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 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 :(得分:36)
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。
<强>更新强>
另一种选择是自己将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,对三种产品的性能进行一些测试。
答案 1 :(得分:0)
如果要继续使用OpenXML,则可以按照此操作。
安装nuget软件包
<VirtualHost *:80>
DocumentRoot C:/xampp/htdocs
ServerName localhost
<Directory C:/xampp/htdocs/LaravelApp/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Alias /laravel C:/xampp/htdocs/LaravelApp/public
以文本文件形式自己读取CSV文件(上述答案中的示例):
Install-Package DocumentFormat.OpenXml -Version 2.11.3
OpenXML代码:
private IEnumerable<string[]> ReadCsv(string fileName, char delimiter = ';')
{
var lines = System.IO.File.ReadAllLines(fileName, Encoding.UTF8).Select(a => a.Split(delimiter));
return (lines);
}
答案 2 :(得分:-1)
在文件顶部插入以下行:
using Microsoft.Office.Interop.Excel;
这将包括使用XlFileFormat和XlSaveAsAccessMode类所需的命名空间。 如果这不起作用,您可能还需要将此DLL的引用添加到项目中。
Close方法接受以下参数:
该文档为here。
希望有所帮助。