C# 用C语言在Excel文件中记录数据#

C# 用C语言在Excel文件中记录数据#,c#,excel,logging,C#,Excel,Logging,我需要在Excel文件中记录来自多个接口的数据范围 因此,我可以打开一个excel工作表,并将数据保存在excel工作表的不同工作表中,这些工作表来自多个界面,不同界面的迭代周期大约为40到100毫秒 我曾尝试使用EPPlus库并能够推送数据,但我只是整理数据,然后将其推送到Excel工作表中。我找不到任何方法可以在多个工作表中并行写入数据 我尝试使用一种方法进行互操作,但我不确定这个工作文件中的高速数据是否来自多个接口,是否需要填写在一个或多个工作表中 任何人都可以提出这样做的最佳方法?您实际

我需要在Excel文件中记录来自多个接口的数据范围

因此,我可以打开一个excel工作表,并将数据保存在excel工作表的不同工作表中,这些工作表来自多个界面,不同界面的迭代周期大约为40到100毫秒

我曾尝试使用EPPlus库并能够推送数据,但我只是整理数据,然后将其推送到Excel工作表中。我找不到任何方法可以在多个工作表中并行写入数据

我尝试使用一种方法进行互操作,但我不确定这个工作文件中的高速数据是否来自多个接口,是否需要填写在一个或多个工作表中


任何人都可以提出这样做的最佳方法?

您实际上在这里描述了两种功能—日志记录和报告

Excel文件决不是实时数据存储。它适用于报告,但不适用于日志记录

我建议在其他地方积累数据,例如在关系数据库中或仅在csv文件中,这取决于您的可靠性和可伸缩性需求,并在关闭的时间段内聚合excel文件,例如:每天、每小时、每分钟

如果您确实需要在运行时将许多项添加到不同的excel工作表中,则可以使用Microsoft OleDb驱动程序:

        const string connectionString =
             @"Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 XML;Data Source=C:\source\MyExcel.xlsx;";
        using (var conn = new OleDbConnection(connectionString))
        {
            conn.Open();

            foreach (var sheet in new[] { "sheet1", "sheet2", "sheet3" })
            {
                using (var cmd = new OleDbCommand())
                {
                    cmd.Connection = conn;

                    try
                    {
                        cmd.CommandText = "CREATE TABLE [" + sheet + "] (id INT, datecol DATE );";
                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception) // TODO: find better way to determine existing sheet
                    {
                        Console.WriteLine("Can't create {0}", sheet);
                    }
                }

                for (var i = 0; i < 1000; i++)
                {
                    using (var cmd = new OleDbCommand())
                    {
                        cmd.Connection = conn;
                        var datecol = DateTime.Now;
                        var id =  i;
                        cmd.CommandText = "INSERT INTO [" + sheet + "](id, datecol) VALUES(@id,@datecol);";
                        cmd.Parameters.Add("@id", OleDbType.Integer).Value = id;
                        cmd.Parameters.Add("@datecol", OleDbType.Date).Value = datecol;
                        cmd.ExecuteNonQuery();
                    }
                }
            }
            conn.Close();
        }
常量字符串连接字符串=
@“Provider=Microsoft.ACE.OLEDB.12.0;扩展属性=excel12.0xml;数据源=C:\Source\MyExcel.xlsx;”;
使用(var conn=新的OLEDB连接(connectionString))
{
conn.Open();
foreach(新[]{“sheet1”、“sheet2”、“sheet3”}中的var表)
{
使用(var cmd=new OleDbCommand())
{
cmd.Connection=conn;
尝试
{
cmd.CommandText=“创建表格[“+工作表+”](id INT,datecol DATE);”;
cmd.ExecuteNonQuery();
}
catch(异常)//TODO:找到更好的方法来确定现有工作表
{
WriteLine(“无法创建{0}”,工作表);
}
}
对于(变量i=0;i<1000;i++)
{
使用(var cmd=new OleDbCommand())
{
cmd.Connection=conn;
var datecol=DateTime.Now;
var id=i;
cmd.CommandText=“插入[“+sheet+”](id,datecol)值(@id,@datecol);”;
cmd.Parameters.Add(“@id”,OleDbType.Integer).Value=id;
cmd.Parameters.Add(“@datecol”,OleDbType.Date).Value=datecol;
cmd.ExecuteNonQuery();
}
}
}
康涅狄格州关闭();
}

这不会有什么帮助,但这是纯粹的日志设计。日志应该在数据库中完成。excel中的一些问题如果您想在日志中搜索,您没有任何好的解决方案,而且xls的最大行数是67k,因为xlsx是100万,填写完这些记录后您将做什么。如果登录数据库的主要问题是数据库将充满无用的日志,则可以删除创建日期大于30天的日志以执行。我也不确定你的问题是否有解决办法!事实上,我正在考虑使用过滤器和日志级别来管理日志行,并且我还计划根据文件大小或其他情况进行日志轮换,因此,如果达到该大小,应用程序需要再次制作类似的excel并开始登录。使用excel,您将限制自己进行将来的增强<在我看来,code>XML是一个更好的设计决策,因为它将为您提供更多的控制和自由来增强功能。而
XML
可以随时导入Excel(甚至数据库)。与成熟的数据库相比,这是一个更好的折衷方案。XML非常冗长。这是一个日志,您不希望文件结构有80%的开销。纯UTF-8编码文本!回答OP问题:缓冲。即使没有Excel,您也很少希望实时推送日志(特别是如果您经常登录)。将日志保存在内存中,并每隔(比如)一秒钟写入日志。只是别忘了处理…未处理的异常(刷新日志)。是的,纯文本值很好,因为XML需要与字段和值正确对齐,如果大小变大,将其推送到excel会很麻烦。缓冲是一种方式,但问题在于有多少缓冲区以及这些缓冲区的并行工作,就好像一个缓冲区正在填充excel一样,另一个缓冲区应该不断累积数据,还需要同步,因为所有数据都有时间限制,即500个值固定在一个时间戳上。我同意这一点,即CSV应该是最好的方式,但客户要求在excel中实时存储数据。因此,我所看到的最好的方法是将数据累积到不同的缓冲区中,然后将这些缓冲区逐个推送到现有的excel中。它就像一个缓冲池。我不确定这种方法是否有效。