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

本文关键字:记录 数据 文件 Excel 使用 | 更新日期: 2023-09-27 18:25:57

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

因此,我可以打开excel表格,并将数据保存在excel表格的不同工作表中,这些工作表来自多个接口,不同接口的迭代周期为40ms至100ms。

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

我试图在InterOp中使用一种方法,但我不确定这个工作文件中的快速数据是否来自多个接口,是否需要填写在一个或多个工作表中。

有人可以建议最好的方法吗?

使用C#在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();
        }