Jump to content
joaomago

Exportar para Excel

Recommended Posts

joaomago

Boas pessoal, estou com um problema a exportar dados de uma listview para o excel.

É o seguinte, consigo exportar quase tudo, mas quando chega a uma das ultimas colunas dá erro e não consigo exportar o resto. Já fiz testes e se terminar o for antes de chegar a essa coluna o programa exporta tudo corretamente.

O código é o seguinte:

public static void ExportToExcel(ListView lv, string prmBookName, string prmPath)
	{
		try
		{
			if (lv.Items.Count == 0)
			{
				MessageBox.Show("No items to export",
					"System Information", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				return;
			}

			string[] st = new string[lv.Columns.Count];
			DirectoryInfo di = new DirectoryInfo(prmPath);
			if (di.Exists == false) di.Create();
			StreamWriter sw = new StreamWriter(prmPath + prmBookName + ".xls", false);
			sw.AutoFlush = true;
			for (int col = 0; col < lv.Columns.Count; col++)
			{
				sw.Write("\t" + lv.Columns[col].Text.ToString());
			}
			int rowIndex = 1; int row = 0;
			string st1 = "";
			for (row = 0; row < lv.Items.Count; row++)
			{
				if (rowIndex <= lv.Items.Count)
					rowIndex++;
				if (row == 0) st1 = "\n";
				else st1 = "";
				for (int col = 0; col < lv.Columns.Count; col++)
				{
					st1 = st1 + "\t" + "" + lv.Items[row].SubItems[col].Text.ToString();
				}
				sw.WriteLine(st1);
			}
			sw.Close();
			FileInfo fil = new FileInfo(prmPath + prmBookName + ".xls");
			if (fil.Exists == true)
				MessageBox.Show("Finished!\n" +
					"File Name: " + prmPath + prmBookName,
					"Export to Excel",
					MessageBoxButtons.OK, MessageBoxIcon.Information);
		}
		catch (Exception ex)
		{
			MessageBox.Show(ex.Message);
		}
	}

Alguém sabe onde pode estar o problema?

Edited by joaomago

Share this post


Link to post
Share on other sites
bioshock

Então é normal. Significa que não há uma 13º coluna na Listview.

Deixo uma dica: em programação, o número '0' é levado muito a sério..sendo que o índice de qualquer array começa em '0'.

Share this post


Link to post
Share on other sites
bioshock

Estive a replicar o teu problema, e isso acontece porque não tens conteúdo na célula onde te dá erro.

Edit: Quando digo que 'não tens conteúdo', significa que não tens um Subitem na X linha, na Y coluna.

Resumindo, 10 colunas equivale a:

1 ListviewItem

9 ListviewSubItem

Edited by bioshock

Share this post


Link to post
Share on other sites
joaomago

Sim bioshock, eu percebo o que me estás a dizer e tens toda a razão, mas não é esse o problema na minha aplicação.

Eu tenho 15 colunas, ou seja:

1 ListviewItem

14 ListviewSubItem

logo é impossível dizer-me que não tenho conteudo na posição 13 e 14 ..

Share this post


Link to post
Share on other sites
bioshock

Já experimentaste fazer step-debug?

Também podes verificar os valores via código.

foreach (ListViewItem itemRow in this.listView1.Items)
		{
			for (int i = 0; i < itemRow.SubItems.Count; i++)
			{
				MessageBox.Show("Coluna: " + i.ToString() +
								Environment.NewLine +
								"Linha: " + itemRow.Index.ToString() + Environment.NewLine +
								"Valor: " + itemRow.SubItems[i].Text);
			}
		}

Share this post


Link to post
Share on other sites
joaomago

Sim já fiz e dá-me o tal erro que o valor é inválido, quando a listView.Count é igual a 15, e ainda estava no valor 13 ...

Estive a verificar os valores e quando chega à coluna 12 passa automaticamente para a linha seguinte, não compreendo.

Edited by joaomago

Share this post


Link to post
Share on other sites
bioshock

O que podes fazer é criar um projecto novo de teste, e tentas replicar o erro. E experimenta fazer aquilo que te disse no penúltimo post.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.