我有一個使用C#NI DAQmx代碼生成的DataTable。我想把這個DataTable放在一個Excel文件中,當選中CheckBox時。 DAQmx代碼一次記錄此數據的「x」個樣本數。當這個數字很高時,程序很慢,但它仍然有效。我想一次錄製少量的樣本,然後將這些數據保存到Excel文件中。如何使用DataTable連接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_cap.Checked = true',我就希望文件不斷地附加新信息。我知道這是一個業餘問題,但任何想法我可以解決這個問題? –
@ScottMyers - 我看過代碼,我想我會遵循你的新問題,但在SO上,如果你需要另一部分/第二個問題的幫助,你需要發佈一個新問題。爲了幫助你指出正確的方向,這聽起來像你有生產者/消費者類型的問題。您應該考慮可能正在研究ConcurrentQueue,並且可能會保持文件的打開狀態,並在隊列中有數據時添加,但不知道更多關於此問題的信息,但很難給出答案。 – pstrjds
啊,好的,謝謝。對不起菜鳥的錯誤。我感謝你的幫助! –