我认为有两个部分,一个是csv的拆分操作,其他回答者已经提到了,我认为这不是必要的,但我会包含在内。另一个更重要的部分是写入Excel文件,我已经成功实现了,但只适用于特定情况,并且很难完成。
CSV非常简单,如果需要可以使用string.split按逗号分隔符进行分割。然而,这种方法存在严重缺陷,尽管我承认我自己也使用过,主要是因为我也控制着源数据,并且知道不会出现引号或转义字符。我包含了一篇关于正确解析csv的文章链接,但我从未测试过源代码或完全审查过代码本身。我已经成功地使用了同一作者的其他代码。
http://www.boyet.com/articles/csvparser.html
第二部分要复杂得多,对我来说非常困难。我采用的方法是使用Jet驱动程序将Excel文件视为数据库,然后运行SQL查询。有一些限制可能导致这不适用于您的目标。我想使用预建的Excel文件模板来显示数据和一些预设的函数和图形。为了实现这一点,我有几个报告数据选项卡,以及一个原始数据选项卡。我的程序写入原始数据选项卡,而所有其他选项卡的计算都指向此表中的单元格。在代码之后,我会解释一些这种行为的原因:
首先,是导入(不一定需要所有导入,这是从一个更大的类文件中提取的,我没有正确注释哪个是哪个):
using System.IO;
using System.Diagnostics;
using System.Data.Common;
using System.Globalization;
接下来,我们需要定义连接字符串。在这一点上,我的类已经有了一个FileInfo引用,指向我想要使用的文件,所以我会传递这个引用。可以在Google上搜索所有参数的含义,但基本上使用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();
下一步,我们需要实际的数据库插入逻辑。基本上,将查询语句放入循环中或者按照您的逻辑,逐行插入数据。
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行,这样当您在Jet驱动程序中加载文件时,它可以检测到正确的类型并使用它们。然后,我指向CSV表格的所有公式都将正常运行,因为值的类型是正确的。如果您的目标与我的类似,并且要使用已指向此数据的模板(从第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
请注意,第一行是我在SQL查询中引用的列名。我认为您可以不需要这个,但这将需要更多的研究。通过已经在Excel文件中拥有这些数据,somenum列将被检测为数字,并且插入的任何数据都将被正确处理。
另一个需要注意的地方是Jet驱动程序仅支持32位,因此在我的情况下,由于我有一个显式的64位程序,我无法直接执行此操作。所以我使用了一个恶心的hack,写入一个文件,然后启动一个程序,将文件中的数据插入到我的Excel模板中。
总的来说,我认为这个解决方案相当糟糕,但不幸的是到目前为止还没有找到更好的方法来解决这个问题。祝你好运!