2013-03-20 5 views
1

У меня есть небольшая программа, которая генерирует несколько динамических меток в flowLayoutPanel1. Я пытаюсь экспортировать текст этих меток в Excel, но все, что я получаю, - это значение последней метки.Экспорт текста динамической метки в 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

ответ

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--; 

} 
+0

Спасибо за решение очень хорошее – Tacit

+0

Смотрите комментарий Ор, в том, что это имеет значение, он получил сообщение, и теперь он знает и, надеюсь, он никогда не совершит ту же ошибку. –

2

Вы каждый раз создаете новую метку вокруг цикла for в методе create() и назначаете эту метку тому же полю (lbl). Когда вы закончите, lbl - это последний ярлык, который вы создали. Вместо этого вы можете добавить ярлыки в список или передать flowLayoutPanel1.Controls в метод go(), если вы можете быть уверены, что будут содержать только метки, которые вы хотите экспортировать.

Это немного неуклюжий TBH, и, в зависимости от того, насколько сильно механика пользовательского интерфейса не рекомендуется, вам будет намного лучше с хорошо продуманной моделью, с которой ваш пользовательский интерфейс связан с данными, но если вы хочу просто сделать это, это твоя проблема.

+0

Как вы привязываете данные в Excel к объектной модели в VSTO или Winform? –

+0

Я думал больше о том, что вы привязываете свой пользовательский интерфейс к своей модели и запрашиваете модель для работы с Excel ... – dotcomslashnet

+1

+1 для спортивного мастерства, вы правы, выглядит как OP после быстрого и грязного решения, Nikola & Я обязуюсь :) –

3

Вы всегда добавляете текст последней созданной метки, потому что вы передаете ее только ссылку. Вместо этого вы должны передать список со всеми метками, которые свойства Text вы хотели бы экспортировать в Excel. Изменение этих методов:

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]); 
     } 
    }