我相信有两个部分,一个是另一个响应者已经接受的 csv 的拆分操作,我认为这不是必需的,但无论如何我都会包括在内。最重要的是写入 excel 文件,我能够开始工作,但在特定情况下,完成起来很痛苦。
CSV 非常简单,您可以根据需要在逗号分隔符上执行 string.split。但是,这种方法非常糟糕,尽管我承认我自己也使用过,主要是因为我也可以控制源数据,并且知道不会出现引号或转义字符。我已经包含了一篇关于正确 csv 解析的文章的链接,但是,我自己从未测试过源代码或完全审核过代码。我成功地使用了同一作者的其他代码。 http://www.boyet.com/articles/csvparser.html
第二部分要复杂得多,对我来说是一个巨大的痛苦。我采用的方法是使用 jet 驱动程序将 excel 文件视为数据库,然后对其运行 SQL 查询。有一些限制,这可能会导致这不符合您的目标。我一直在寻找使用预建的 excel 文件模板来基本上显示数据和一些预设函数和图表。为此,我有几个报告数据选项卡,一个是 raw_data 选项卡。我的程序写入 raw_data 选项卡,所有其他选项卡计算都指向此表中的单元格。我将在代码之后讨论这种行为的一些原因:
首先,导入(可能不是全部都需要,这是从一个更大的类文件中提取的,我没有正确评论什么是什么):
using System.IO;
using System.Diagnostics;
using System.Data.Common;
using System.Globalization;
接下来我们需要定义连接字符串,此时我的类已经有一个指向我要使用的文件的 FileInfo 引用,所以这就是我传递的内容。可以在 google 上搜索所有参数的用途,但基本上使用 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);
现在让我们打开与 DB 的连接,并准备在 DB 上运行命令:
DbProviderFactory 工厂 = 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 选项卡可能看起来像这样:
相关id 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 列将被检测为数字,并且插入的任何数据都将被正确处理。
另一个让这很烦人的注意事项是,Jet 驱动程序只有 32 位,所以在我有一个明确的 64 位程序的情况下,我无法直接执行它。所以我有一个讨厌的 hack 写入文件,然后启动一个程序,将文件中的数据插入到我的 excel 模板中。
总而言之,我认为解决方案非常糟糕,但遗憾的是到目前为止还没有找到更好的方法来解决这个问题。祝你好运!