如何使用 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.
那里得到了这些片段
我有一个使用 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.
那里得到了这些片段