我使用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());
}
}
}
答案 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获得了这些片段。