将多个列表框中的数据写入c#中的excel列

时间:2014-11-16 02:59:07

标签: c# excel winforms csv file-writing

我在c#中有一个Windows窗体应用程序,其中有多个列表框中的数据列表(每个列表框中大约56个)。 这是一个例子:

  1. listbox1包含学生姓名数据
  2. listbox2包含学生地址数据
  3. listbox3包含学生百分比。
  4. 列表继续学生数据。 现在我需要在按钮单击事件中打印excel中的数据。 数据应按顺序排列。

    我尝试使用CSV帮助程序但它只帮助我获得了一组列表框,我需要从多个列表框中发送数据。

    var sw = new StreamWriter(@"output.csv");
    var csvWriter = new CsvHelper.CsvWriter(sw);
    
    foreach (var Name in lbx.Items)
    {
        csvWriter.WriteField(Name);
        csvWriter.NextRecord();
    }
    foreach (var Address in ptr.Items)
    {
        csvWriter.WriteField(Address);
    }
    sw.Flush();
    

    然而,这并没有解决问题。有关解决此问题的任何帮助都会有所帮助。 解决问题的任何其他方法都会很棒。

1 个答案:

答案 0 :(得分:0)

我很难确定您的配置的完整详细信息,但如果它就像您为其编写值的两个ListBox控件一样简单,那么您很容易做类似以下的事情:

var sw = new StreamWriter(@"output.csv");
var csvWriter = new CsvHelper.CsvWriter(sw);
int lbxCount = lbx.Items.Count;
int ptrCount = ptr.Items.Count;
for (int i = 0; i < Math.Max(lbx.Items.Count, ptr.Items.Count); i++)
{
    object lbxValue = lbxCount > i ? lbx.Items[i] : String.Empty;
    object ptrValue = ptrCount > i ? ptr.Items[i] : String.Empty;
    csvWriter.WriteField(lbxValue);
    csvWriter.WriteField(ptrValue);
    csvWriter.NextRecord();
}
sw.Flush();
sw.Close();

根据最大Math.Max(lbx.Items.Count, ptr.Items.Count确定要写入的最大记录数(ListBox.Items.Count

通过将循环更改为单个循环,您现在可以正确使用WriteField方法。如果ListBox lbx不包含特定记录的值,则使用String.Empty作为该记录的值。同样,如果ListBox ptr中有更多项目,lbx也会如此。

如果您在单个表单上有多个ListBox控件并希望每个控件都有,那么您可以通过遍历所有ListBox控件并获取各自的Item.Count来确定总体最大项数值如下:

var sw = new StreamWriter(@"output.csv");
var csvWriter = new CsvHelper.CsvWriter(sw);
int maxRecords = 0;
List<ListBox> listBoxes = new List<ListBox>();

// Add all ListBox controls to list
// Determine maximum number of items (in all ListBox controls)
foreach (Control control in Controls)
{
    if (control.GetType() == typeof(ListBox))
    {
        ListBox currentListBox = (ListBox)control;
        listBoxes.Add(currentListBox);
        if (currentListBox.Items.Count > maxRecords)
            maxRecords = currentListBox.Items.Count;
    }
}

// Write fields for each ListBox
for (int i = 0; i < maxRecords; i++)
{
    foreach (ListBox currentListBox in listBoxes)
    {
        if (currentListBox.Items.Count > i)
            csvWriter.WriteField(currentListBox.Items[i]);
        else
            csvWriter.WriteField(String.Empty);
    }
    csvWriter.NextRecord();
}
sw.Flush();
sw.Close();