C#Excel将数据从CSV导入Excel

如何使用C#从CSV文件导入Excel中的数据? 实际上,我想要达到的目标与我们在Excel中所做的相似,您可以进入“ 数据”选项卡,然后select“ 从文本”选项,然后使用“ 文本到列”选项并selectCSV,并执行魔术和所有这些操作。 我想自动化它。

如果你能把我带到正确的方向,我会非常感激。

编辑:我想我没有解释得很好。 我想要做的是类似的东西

Excel.Application excelApp; Excel.Workbook excelWorkbook; // open excel excelApp = new Excel.Application(); // something like excelWorkbook.ImportFromTextFile(); // is what I need 

我想将这些数据导入到Excel中,而不是我自己的应用程序。 据我所知,我不认为我必须自己parsingCSV,然后将它们插入到Excel中。 Excel为我们做 。 我只需要知道如何自动化这个过程。

你可以打开Excel,开始录制macros,做你想要的,然后看看macroslogging。 这应该告诉你要使用什么对象以及如何使用它们。

我想你已经过了复杂的事情了。 如果是CSV文件,Excel会自动将数据分隔成由逗号分隔符组成的列。 所以你所需要做的就是确保你的扩展名是CSV。

我只是试图在Excel中快速打开一个文件,它工作正常。 所以你真正需要的只是用带有CSV扩展名的文件调用Workbook.Open()。

我相信有两个部分,一个是csv的另一个响应者已经拿起的拆分操作,我不认为这是必要的,但我会包括反正。 最重要的是写入excel文件,我能够工作,但在特定的情况下,这是一个痛苦的事情。

CSV非常简单,如果你愿意,你可以在逗号分隔符处做一个string。 然而,这种方法是可怕的,尽pipe我承认我自己使用它,主要是因为我也控制了源数据,并知道不会有引号或转义字符会出现。 我已经包含了一个关于正确的csvparsing的文章的链接,但是,我从来没有testing过源代码,或者自己完全审核了代码。 我用同一个作者的其他代码成功了。 http://www.boyet.com/articles/csvparser.html

第二部分更复杂,对我来说是一个巨大的痛苦。 我采取的方法是使用jet驱动程序来处理excel文件,如数据库,然后运行SQL查询。 有一些限制,这可能会导致这不适合你的目标。 我正在寻找使用预build的Excel文件模板,基本上显示数据和一些预设的function和graphics。 要做到这一点,我有几个报表数据选项卡,和一个是raw_data选项卡。 我的程序写入raw_data选项卡,所有其他选项卡计算指向此表中的单元格。 在代码之后,我将介绍这种行为的一些原因:

首先,import(不是所有的都可能是必需的,这是从一个更大的class级文件中拉出的,我没有正确评论什么是什么):

 using System.IO; using System.Diagnostics; using System.Data.Common; using System.Globalization; 

接下来,我们需要定义连接string,我的类已经有一个FileInfo引用,在这一点上我想要使用的文件,所以这就是我传递的。 可以在google上search所有的参数,但是基本上使用Jet Driver(应该可以在任何Windows上安装)来打开excel文件,就像你引用的数据库一样。

 string connectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filename};Extended Properties=""Excel 8.0;HDR=YES;IMEX=0"""; connectString = connectString.Replace("{filename}", fi.FullName); 

现在让我们打开与数据库的连接,并准备好在数据库上运行命令:

DbProviderFactory factory = DbProviderFactories.GetFactory(“System.Data.OleDb”);

 using (DbConnection connection = factory.CreateConnection()) { connection.ConnectionString = connectString; using (DbCommand command = connection.CreateCommand()) { connection.Open(); 

接下来我们需要DB插入的实际逻辑。 所以基本上把查询放入一个循环或任何逻辑,并逐行插入数据。

 string query = "INSERT INTO [raw_aaa$] (correlationid, ipaddr, somenum) VALUES (\"abcdef", \"1.1.1.1", 10)"; command.CommandText = query; command.ExecuteNonQuery(); 

现在这里是真正烦人的部分,在插入之前,excel驱动程序试图检测到你是列types,所以即使你传递了一个适当的整数值,如果excel认为列types是文本,它将把你所有的数字作为文本,很难得到这样的待遇像一个数字。 因此,excel必须已经有列types作为数字。 为了做到这一点,对于我的模板文件,我用虚拟数据填写前10行,这样当你在jet driver中加载文件时,它可以检测到正确的types并使用它们。 然后,所有指向我的csv表的forumals将会正常运行,因为这些值是正确的types。 如果你的目标和我的相似,并且使用已经指向这个数据的模板(从第10行开始,而不是第2行),这可能对你有用。

正因为如此,我在excel中的raw_aaa选项卡可能如下所示:correlationid ipaddr somenum abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1 .1.1 5 abcdef 1.1.1.1 5

注意行1是我在我的SQL查询中引用的列名称。 我认为你可以做到这一点,但这需要更多的研究。 通过在excel文件中已经有这个数据,somenum列将被检测为一个数字,插入的任何数据都将被正确处理。

Antoher注意到这让人讨厌,Jet驱动程序只有32位,所以在我的情况下,我有一个明确的64位程序,我无法直接执行此操作。 所以我写了一个文件,然后启动一个程序,将文件中的数据插入到我的Excel模板中。

总而言之,我认为这个解决scheme是非常讨厌的,但是到目前为止,还没有find一个更好的方法来做这个不幸的事情。 祝你好运!

你可以看看TakeIo.Spreadsheet .NET库 。 它接受来自Excel 97-2003,Excel 2007和更新版本以及CSV格式(分号或逗号分隔符)的文件。

例:

 var inputFile = new FileInfo("Book1.csv"); // could be .xls or .xlsx too var sheet = Spreadsheet.Read(inputFile); foreach (var row in sheet) { foreach (var cell in row) { // do something } } 

您可以使用Normalize()函数删除开始和结尾的空行,以及从导入的数据开始和结尾列:

 sheet.Normalize(); 

有时你可以发现你的导入数据在数据之间包含空行,所以你可以使用另一个助手来处理这种情况:

 sheet.RemoveEmptyRows(); 

有一个Serialize()函数可以将任何input转换成CSV:

 var outfile = new StreamWriter("AllData.csv"); sheet.Serialize(outfile); 

如果您想在CSV文件中使用逗号而不是默认的分号分隔符,请执行以下操作:

 sheet.Serialize(outfile, ','); 

是的,还有一个ToString()函数…

这个软件包也可以在NuGet上使用,只需要看看TakeIo.Spreadsheet 。

那么,从CSV导入不应该是一个大问题。 我认为最基本的方法是使用string操作。 你可以使用简单的Split()命令构build一个非常好的parsing器,并获取数组中的东西。