如何使用DataTable连接Excel文件?

时间:2017-08-02 19:04:27

标签: c# epplus

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

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

目前,数据将在选中此框时主动记录,但不会连接。我已经尝试了很多搜索,并为此探索了很多方法,但我还没能完全适应我的需求。

相关代码将包含在下方。感谢任何帮助。谢谢。

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

此代码是通过DAQmx生成的DataTable:

    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());

            }
        }
    }

2 个答案:

答案 0 :(得分:0)

由于您提到它不必是Excel,它可以是CSV,然后您可以使用CSV代码,但将File.WriteAllText行更改为File.AppendAllText,这将添加文本而不是替换现有文件。如果文件不存在,AppendAllText将创建该文件。

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

答案 1 :(得分:0)

您确定使用的是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。如果您跳过to DataTable转换,您将加快速度。 EPPlus有LoadFromCollection,可能只适用于您的AnalogWaveform<double>

无耻的广告:我从blog post about EPPlus获得了这些片段。