将动态标签文本导出到Excel

时间:2013-03-20 23:07:12

标签: c# winforms visual-studio-2010 excel export-to-excel

我有一个小程序,在flowLayoutPanel1中生成一些动态标签我试图将这些标签的文本导出到Excel,但我得到的只是最后一个标签的值。

这是我的导出类:

 class Export
    {

        public Export(bool defaultBackgroundIsWhite)
        {
            this.defaultBackgroundIsWhite = defaultBackgroundIsWhite;

            app = new Application();
            app.Visible = true;
            workbook = app.Workbooks.Add(1);
            worksheet = (Worksheet)workbook.Sheets[1];
        }

        public void Do(string excelName, System.Windows.Forms.Label names)
        {
            for (int i = 0; i <= 5; i++)
            {
                    AddNames(i,0,names);
            }
        }

        private void AddNames(int row, int col, System.Windows.Forms.Label lbls)
        {
            if (lbls == null) return;
            row++;
            col++;
            Range range = worksheet.Cells[row + 2, col + 2];
            range.NumberFormat = "";
            worksheet.Cells[row + 2, col + 2] = lbls.Text;
            row--;
            col--;

        }
        private Application app = null;
        private Workbook workbook = null;
        private Worksheet worksheet = null;
        private bool defaultBackgroundIsWhite;
    }

表单类代码:

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        create();
    }

    Label lbl;
    private void create()
    {
        flowLayoutPanel1.Controls.Clear();
        //int length = ds.Tables[0].Rows.Count;
        for (int i = 0; i < 5; i++)
        {
            lbl = new Label();
            lbl.Name = i.ToString();
            lbl.Text = "Label "+i;
            lbl.Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
            lbl.SetBounds(0, 20, 100, 25);
            lbl.BorderStyle = BorderStyle.FixedSingle;
            flowLayoutPanel1.Controls.Add(lbl);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Export ep = new Export(true);
        ep.Do("test.xsl", lbl);
    }

我的结果:

enter image description here

3 个答案:

答案 0 :(得分:3)

您始终会添加上次创建的标签的文本,因为您只传递其引用。您应该使用所有要导出到Excel的Text属性的标签的引用来传递List。改变这些方法:

    List<Label> lbls;
    private void create()
    {
        flowLayoutPanel1.Controls.Clear();
        //int length = ds.Tables[0].Rows.Count;
        lbls = new List<Labels>();
        for (int i = 0; i < 5; i++)
        {
            Label lbl = new Label();
            lbl.Name = i.ToString();
            lbl.Text = "Label "+i;
            lbl.Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
            lbl.SetBounds(0, 20, 100, 25);
            lbl.BorderStyle = BorderStyle.FixedSingle;
            flowLayoutPanel1.Controls.Add(lbl);
            lbls.Add(lbl);
        }
    }

同时更改Do课程中的方法Export以接受List<Label>代替Label

    public void Do(string excelName, List<Label> names)
    {
        for (int i = 0; i <= names.Count; i++)
        {
                AddNames(i,0,names[i]);
        }
    }

答案 1 :(得分:2)

List<Label> lbls = new List<Label>();
private void create()
{
    flowLayoutPanel1.Controls.Clear();
    //int length = ds.Tables[0].Rows.Count;
    for (int i = 0; i < 5; i++)
    {
        lbl = new Label();
        lbl.Name = i.ToString();
        lbl.Text = "Label "+i;
        lbl.Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular);
        lbl.SetBounds(0, 20, 100, 25);
        lbl.BorderStyle = BorderStyle.FixedSingle;
        lbls.Add(lbl);   //< -- add the label to the local list of Labels
        flowLayoutPanel1.Controls.Add(lbl);

    }
}

private void button1_Click(object sender, EventArgs e)
{
    int i = 0;
    Export ep = new Export(true);
    foreach(var lbl in lbls)
    {
        i++;
        ep.AddNames(i,0,lbl);
    }
}

public void AddNames(int row, int col, System.Windows.Forms.Label lbl)
{
if (lbl == null) return;
row++;
col++;
Range range = worksheet.Cells[row + 2, col + 2];
range.NumberFormat = "";
worksheet.Cells[row + 2, col + 2] = lbl.Text;
row--;
col--;

}

答案 2 :(得分:2)

每次围绕create()方法中的for循环构建一个新标签,并将该标签分配给同一个字段(lbl)。当你完成时,lbl是你创建的最后一个标签。您可以改为将标签添加到List中,或者将flowLayoutPanel1.Controls传递给go()方法,如果您可以确定它只包含您要导出的标签。

这有点笨重的TBH,并且非常依赖于UI的机制,不建议这样做 - 你会更好地使用经过深思熟虑的UI,你的UI是数据绑定的,但如果你想要的话要完成它,这就是你的问题。