如何使用 DataTable 连接 Excel 文件?

How to Concatenate an Excel File Using a DataTable?

我有一个使用 C# NI DAQmx 代码生成的数据表。我想在选中 CheckBox 时获取此 DataTable 并将其放入 excel 文件中。 DAQmx 代码一次记录此数据 'x' 个样本。当这个数字很高时,程序很慢,但它仍然有效。我想一次记录少量样本,然后将这些数据保存到 excel 文件中。

在我当前的代码中,excel 文件中的数据不断被覆盖。这是不可取的,因为我需要所有记录的数据。

目前勾选后数据会主动记录,但不会拼接。为此,我尝试了许多搜索并探索了许多方法,但我还不能完全适应我的需要。

下面将包含相关代码。感谢任何帮助,谢谢。

注意:数据不必是 .xlsx 文件。它可以是一个 .csv

此代码是通过 DAQmx 生成数据表:

    private void DataToDataTable(AnalogWaveform<double>[] sourceArray, ref DataTable dataTable)
    {
        // Iterate over channels
        int currentLineIndex = 0;
        string test = currentLineIndex.ToString();

        foreach (AnalogWaveform<double> waveform in sourceArray)
        {
            for (int sample = 0; sample < waveform.Samples.Count; ++sample)
            {
                if (sample == 50)
                    break;

                dataTable.Rows[sample][currentLineIndex] = waveform.Samples[sample].Value;
            }
            currentLineIndex++;       
        }
    }

    public void InitializeDataTable(AIChannelCollection channelCollection, ref DataTable data)
    {
        int numOfChannels = channelCollection.Count;
        data.Rows.Clear();
        data.Columns.Clear();
        dataColumn = new DataColumn[numOfChannels];
        int numOfRows = 50;

        for (int currentChannelIndex = 0; currentChannelIndex < numOfChannels; currentChannelIndex++)
        {
            dataColumn[currentChannelIndex] = new DataColumn()
            {
                DataType = typeof(double),
                ColumnName = channelCollection[currentChannelIndex].PhysicalName
            };
        }

        data.Columns.AddRange(dataColumn);

        for (int currentDataIndex = 0; currentDataIndex < numOfRows ; currentDataIndex++) 
        {
            object[] rowArr = new object[numOfChannels];
            data.Rows.Add(rowArr);
        }
    }

这是我目前保存到 Excel 文件的方法:

        private void Excel_cap_CheckedChanged(object sender, EventArgs e)
    {

                   int i = 0;
        for (excel_cap.Checked = true; excel_cap.Checked == true; i ++) {

            {
                StringBuilder sb = new StringBuilder();

                IEnumerable<string> columnNames = dataTable.Columns.Cast<DataColumn>().
                                                  Select(column => column.ColumnName);
                sb.AppendLine(string.Join(",", columnNames));

                foreach (DataRow row in dataTable.Rows)
                {
                    IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
                    sb.AppendLine(string.Join(",", fields));
                }

                File.AppendAllText(filename_box.Text, sb.ToString());

            }
        }
    }

既然你提到它不一定是 Excel,它可以是 CSV,那么你可以使用你的 CSV 代码,但将 File.WriteAllText 行更改为 File.AppendAllText 这将附加文本而不是替换现有文件。 AppendAllText 如果文件不存在,将创建该文件。

File.AppendAllText("test.csv", sb.ToString());

您确定使用的是 EPPlus 吗?这个 CreateExcelFile 看起来像是 a copied code snippet.

使用 EPPlus,这就像

一样简单
using (var package = new ExcelPackage(new FileInfo(@"a.xslx")))
{
    if (!package.Workbook.Worksheets.Any())
        package.Workbook.Worksheets.Add("sheet");
    var sheet = package.Workbook.Worksheets.First();
    var appendRow = (sheet.Dimension?.Rows ?? 0) + 1;
    sheet.Cells[appendRow, 1].LoadFromDataTable(new DataTable(), false);
    package.SaveAs(new FileInfo(@"a.xslx"));
}

看起来你有一些对象,然后将它们转换为DataTable,然后将它们写入Excel/CSV。如果您跳过到 DataTable 的转换,您将加快速度。 EPPlus 有 LoadFromCollection,它可能只适用于您的 AnalogWaveform<double>

无耻的广告:我从 blog post about EPPlus.

那里得到了这些片段