我如何使用C#CSV文件导入Excel中的数据? 其实,我想实现的是类似于我们在Excel做的,你去到Data选项卡,然后选择从文本选项,然后使用文本分列选项,然后选择CSV和它的魔力,和所有的东西。 我想自动化。
如果你能拦住了我的方向是正确的,我真的很感激。
编辑:我想我没有很好地解释。 我想要做的是一样的东西
Excel.Application excelApp;
Excel.Workbook excelWorkbook;
// open excel
excelApp = new Excel.Application();
// something like
excelWorkbook.ImportFromTextFile(); // is what I need
我想这些数据导入到Excel中,而不是我自己的应用程序。 据我所知,我不认为我会解析CSV自己,然后在Excel中插入。 Excel中会替我们 。 我只需要知道如何自动执行该过程。
你可以打开Excel,开始录制宏,你想要什么,然后看看录制的内容的宏。 这应该告诉你哪些对象使用和如何使用它们。
我认为你是在复杂的事情。 Excel会自动用逗号分隔符,如果它是一个CSV文件分割数据成列。 所以你应该需要做的是确保您的分机是CSV。
我只是想快速打开Excel中的一个文件,它工作正常。 所以,你真正需要的仅仅是调用Workbook.Open()与一个CSV扩展名的文件。
我beleive有两个部分,一个是,其他响应者已经拿起放在CSV,我不认为这是必要的,但我会反正包括拆分操作。 而大的一个是写入Excel文件,我能得到工作,但在特定情况下,它是完成一个痛苦。
CSV是非常简单的,你可以,如果你想在一个逗号分隔符做string.split。 但是,这种方法是可怕的坏了,尽管我承认我已经用它自己,主要是因为我也有过源数据的控制,并且知道这将不会出现不带引号或转义字符。 我已经包含了链接到正确的CSV解析的文章,但是,我从来没有测试的源或完全审核的代码自己。 我已经成功了同一作者使用的其他代码。 http://www.boyet.com/articles/csvparser.html
第二部分是很多更复杂,对我来说是一个巨大的痛苦。 我采取的方法是使用喷气驱动程序来对待像一个数据库中的Excel文件,然后运行SQL查询反对。 有一些限制,这可能会导致这种情况不适合你的目标。 我一直在寻找使用预excel文件模板基本显示的数据和一些预置功能和图表。 要做到这一点我有报表数据,以及一个标签是raw_data的几个选项卡。 我的程序写入raw_data标签,所有其他选项卡计算指向细胞在此表中。 我会去到一些推理的代码之后此行为:
首先,进口(并非所有可能需要的,这是从一个更大的类文件拉和我没有正确意见究竟是什么东西):
using System.IO;
using System.Diagnostics;
using System.Data.Common;
using System.Globalization;
接下来,我们需要定义连接字符串,我的课已经在这一点上我想使用的文件一个FileInfo参考,所以这就是我传递。 这是可能的在谷歌搜索什么的所有参数都是,但basicaly使用Jet驱动程序(应该可以在任何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工厂= 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驱动程序会自动检测你插入前柱的类型,所以即使你通过一个适当的整数值,如果Excel认为列类型为文本,它会插入所有你的数字为文本,这是很难得到这个像一些处理。 因此,EXCEL必须已经列类型为数字。 为了做到这一点,我的模板文件我填写的第10行与虚拟数据,这样,当你加载文件中的喷气驱动程序,它可以检测到正确的类型和使用它们。 然后,因为这些值是正确类型的所有我forumals指向我的CSV表将正常运行。 这可能会为你工作,如果你的目标是与我相似,并使用已经指向这个数据模板(刚开始在第10行,而不是排2)。
正因为如此,在Excel中我raw_aaa标签可能是这个样子:IPADDR的correlationID ABCDEF somenum 5 1.1.1.1 1.1.1.1 ABCDEF 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注意,使这恼人的,喷气驱动程序只有32位,所以在我的情况,我有一个明确的64位程序,我无法直接执行此操作。 因此,我不得不写一个文件,然后启动会在文件中插入数据到我的Excel模板程序的黑客讨厌。
总而言之,我认为解决的办法是非常讨厌的,但迄今为止还没有找到更好的办法来不幸的是做到这一点。 祝好运!
你可以看看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()
函数来任何输入到CSV转换太:
var outfile = new StreamWriter("AllData.csv");
sheet.Serialize(outfile);
如果你喜欢用逗号,而不是在你的CSV文件中的默认分号分隔的,这样做:
sheet.Serialize(outfile, ',');
是的,还有一个ToString()
函数太...
该套餐适用于过的NuGet,只是看看TakeIo.Spreadsheet 。
您可以使用ADO.NET
http://vbadud.blogspot.com/2008/09/opening-comma-separate-file-csv-through.html
那么从CSV导入不应该是一个大问题。 我觉得最根本的方法是使用字符串操作来做到这一点。 你可以建立使用简单的分割()命令,并获得在阵列中的东西相当精细解析器。