none
String Format com 0 a esquerda RRS feed

  • Pergunta

  • Bom Dia!

    Tenho um relatório que exporto para excel, mas não estou conseguindo formatar o campo em c# para aparecer 0 a esquerda.

    Meu código :

     // escrevendo os registros
                                    writer.WriteLine(Convert.ToString(reader["SUP.Nome"]) + ";" + Convert.ToString(reader["Num_Contrato"]) + ";" + Convert.ToString(reader["Mes_Referencia"]) + ";" + string.Format("{0:dd/MM/yyyy}",(reader["Data"])) + ";" + Convert.ToString(reader["Num_Diario"]) + "-" + Convert.ToString(reader["SequenciaItem"]) + "/" + Convert.ToString(reader["Qtd_Itens"])
                                        + ";" + string.format("{0:0000}"),(reader["Numero"])) + ";" + Convert.ToString(reader["Descricao"]) 

    Preciso formatar esse campo. Ele possui 4 números. Ex: 0006 ou 0050 , la no excel so aparece 6 ou 50.

    Já tentei outros string format mas não funciona.

    sexta-feira, 21 de março de 2014 12:36

Respostas

  • só por ventura de teste.

    tente por um ' aspas simples antes do numero.

    ( "'" + reader["Numero"].ToString()).ToString();

    • Marcado como Resposta LetíciaF sexta-feira, 21 de março de 2014 14:41
    sexta-feira, 21 de março de 2014 13:04
  • takiupaliu

    Que select MOSTRUOSO É ESSE?

    Printei até porque fique com medo.

    Mas vamos ao problema.

    Não vou nem tentar resolver esse problema diretamente pois vou ficar 100 anos analisando o select.

    Porem pelo que analisei vc não está percorrendo o datatable do seu resultado, ou seja, vc está apenas colocando o valor da primeira liinha do seu datatable no segundo que vai apresentar os dados.

    Faça o seguinte

                 /// dtb é um datatable que tenho no codigo, seria equivalete a sua datatable query
                DataTable dt = new DataTable();
                dt.Columns.Add("Contrato", typeof(string));
                dt.Columns.Add("Item", typeof(string));
    
                foreach (DataRow row in dtb.Rows)
                {
                    dt.Rows.Add(row[0].ToString(), row[1].ToString());
                }

    Coloquei row[0] e 1 apenas para exemplo, mas coloque o nome da coluna como boa pratica de programação.

    Esse foreach deve rodar todos os registro e preencher os dados do outro datatable que vc vai mandar para a classe do excel

    • Marcado como Resposta LetíciaF terça-feira, 25 de março de 2014 13:05
    terça-feira, 25 de março de 2014 12:37

Todas as Respostas

  • só por ventura de teste.

    tente por um ' aspas simples antes do numero.

    ( "'" + reader["Numero"].ToString()).ToString();

    • Marcado como Resposta LetíciaF sexta-feira, 21 de março de 2014 14:41
    sexta-feira, 21 de março de 2014 13:04
  • LetíciaF,

    O valor do seu Campo numero pode estar em String , faça a conversão para int e veja se funciona !!!

    Fica assim:

    + ";" + string.format("{0:0000}",Int32.Parse(reader["Numero"])) +



    Diego Almeida Barreto
    System Analyst / Software Developer

    sexta-feira, 21 de março de 2014 14:15
  • Dietrich_Prg obrigadaaaa!

    Funcionou, porém ele fica com essa aspas simples la no excel, assim: '0016 tem como retirar?

    sexta-feira, 21 de março de 2014 14:44
  • Diego esse int32.Parse deu erro la, não consegui fazer dessa forma não.
    sexta-feira, 21 de março de 2014 14:45
  • Leticia,

    Q erro Deu ?????? da um print a tela ai se poder !!!!!!!!!!!!



    Diego Almeida Barreto
    System Analyst / Software Developer

    sexta-feira, 21 de março de 2014 14:58
  • sexta-feira, 21 de março de 2014 15:09
  • LetíciaF,

    Ao invés de Perse Vamos usar o convert , veja se funciona:

    +";" + string.format("{0:0000}", Convert.ToInt32(reader["Numero"])) +



    Diego Almeida Barreto
    System Analyst / Software Developer

    sexta-feira, 21 de março de 2014 15:20
  • não ocorre erro, mas também não formata.
    sexta-feira, 21 de março de 2014 15:25
  • Fiz uma classe para vc.

    Crie um datatable com os headers certinho e todos os dados e deixa a classe se virar ;-)

    apenas coloca a primeira coluna do datatable como o codigo, seus headers e todos os dados.

    fazendo isso passe o datatable pra classe e veja a magia acontecer.

    public class Cls_Excel
        {
    
            public void gerar_a_partir_de_datatable(DataTable dtb)
            {
                Microsoft.Office.Interop.Excel.Application ex = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Workbook wk = ex.Workbooks.Add(Type.Missing);
                Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wk.Worksheets[1];
    
                for (int i = 0; i < dtb.Columns.Count; i++)
                {
                    Microsoft.Office.Interop.Excel.Range rg = (ws.Cells[1, i + 1] as Microsoft.Office.Interop.Excel.Range); // primeiro linha segundo coluna, no dtb começa 0 execel começa 1
                    rg.Value2 = dtb.Columns[i].ColumnName.ToString();
                }
    
                for (int i = 2; i < dtb.Rows.Count + 2; i++)
                {
                    DataRow row = dtb.Rows[i - 2]; // excel funciona no 1 e dtb no 0 então subtrai um para igualar os 2
                    for (int i2 = 1; i2 < dtb.Columns.Count + 1; i2++)
                    {
                        try
                        {
                            Microsoft.Office.Interop.Excel.Range rg = (ws.Cells[i, i2] as Microsoft.Office.Interop.Excel.Range); // primeiro linha segundo coluna, no dtb começa 0 execel começa 1
                            if (i2 == 1)
                            {
                                rg.NumberFormat = "@";
                            }
                            rg.Value2 = row[i2 - 1].ToString();
                        }
                        catch
                        {
                        }
    
                    }
                }
                ex.Visible = true;
            }
        }

    sexta-feira, 21 de março de 2014 16:28
  •  criei um datatable e coloquei minha consulta.

    DataTable query = db.ExecutarSelect("SELECT C.Num_Contrato, SUP.Nome, Mun.Cidade AS Município, IB.Numero, IB.Descricao, UM.Sigla AS UnidadeMedida,mid(A.Nome,5,2) as AMO,TS.Nome as SM,TA.Nome AS Apropriação, UNV.Sigla AS UC, Conta.Num_Conta_Contabil AS Conta, null AS NúmeroCC, P.Numero AS Projeto,TP.Sigla as Tarefa, Dis.Nome AS TipoDispêndio, NAV.Num_Vale AS OrgDispêndio, IB.Fisico_Estimado AS FísicoContrato, IB.Valor_Unitario, IB.Valor_Total AS TotalContratado," +
                                " Sum(ID.QuantidadeTotal) AS FisicoMedicao, (FisicoMedicao*Valor_Unitario) AS FinanceiroMedicao, (IB.Fisico_Estimado-FisicoMedicao) AS TotalQuantidade, (IB.Valor_Total-FinanceiroMedicao) AS TotalFinanceiro FROM (((((((((((((((((((Itens_Diario AS ID INNER JOIN Locais_Servico AS LS ON ID.Cod_Loc_Serv=LS.Cod_Loc_Serv) INNER JOIN Municipio AS Mun ON LS.Cod_Municipio=Mun.Cod_Municipio) INNER JOIN Itens_Boletim AS IB ON ID.Cod_ItemBoletim=IB.Cod_ItemBoletim)" +
                                " INNER JOIN TipoServico as TS on TS.Cod_TipoServico = IB.Cod_TipoServico) INNER JOIN Boletim AS B ON IB.Cod_Boletim=B.Cod_Boletim) INNER JOIN Contrato AS C ON B.Cod_Contrato=C.Cod_Contrato) INNER JOIN Cabecalho ON B.Cod_Cabecalho=Cabecalho.Cod_Cabecalho) INNER JOIN Supervisao AS SUP ON Cabecalho.Cod_Supervisao=SUP.Cod_Supervisao) INNER JOIN UnidadeControleVale AS UNV ON Cabecalho.Cod_UC=UNV.Cod_UC) INNER JOIN NomeAtualVale AS NAV ON Cabecalho.Cod_Vale=NAV.Cod_Vale)" +
                                " INNER JOIN UnidadeMedida AS UM ON IB.Cod_UnidadeMedida=UM.Cod_UnidadeMedida) INNER JOIN Diarios AS D ON ID.Cod_Diario=D.Cod_Diario) INNER JOIN Equipe AS E ON D.Cod_Equipe=[E].Cod_Equipe) INNER JOIN Medicao AS M ON D.Cod_Medicao=M.Cod_Medicao) LEFT JOIN Tarefa_Projeto AS TP ON IB.Cod_Tarefa=TP.Cod_Tarefa) LEFT JOIN Projeto AS P ON TP.Cod_Projeto=P.Cod_Projeto) LEFT JOIN Tipo_Aplicacao AS TA ON P.Cod_Tipo_Aplicacao=TA.Cod_Tipo_Aplicacao) LEFT JOIN Conta_Contabil AS Conta ON P.Cod_Contabil=Conta.Cod_Contabil)" +
                                " LEFT JOIN Dispendio AS Dis ON TP.Cod_Dispendio=Dis.Cod_Dispendio) INNER JOIN Almoxerifado AS A ON Mun.Cod_Almoxerifado=A.Cod_Almoxerifado" +
                                " WHERE D.Cod_Medicao = " + CodMedicao + " and P.Numero <> null " +
                                " GROUP BY C.Num_Contrato, SUP.Nome, Mun.Cidade, IB.Numero, IB.Descricao, UM.Sigla,TS.Nome, TA.Nome, UNV.Sigla, Conta.Num_Conta_Contabil, P.Numero, TP.Sigla, Dis.Nome, NAV.Num_Vale, IB.Fisico_Estimado, IB.Valor_Unitario, IB.Valor_Total,A.Nome;" +

                               " UNION (SELECT C.Num_Contrato, SUP.Nome, Mun.Cidade AS Município, IB.Numero, IB.Descricao, UM.Sigla AS UnidadeMedida,mid(A.Nome,5,2) as AMO,TS.Nome as SM,TA.Nome AS Apropriação, UNV.Sigla AS UC, Conta.Num_Conta_Contabil AS Conta,CC.Numero_CC as NúmeroCC,null AS Projeto,null as Tarefa, Null AS TipoDispêndio, NAV.Num_Vale AS OrgDispêndio, IB.Fisico_Estimado AS FísicoContrato, IB.Valor_Unitario, IB.Valor_Total AS TotalContratado, Sum(ID.QuantidadeTotal) AS FisicoMedicao, (FisicoMedicao*Valor_Unitario) AS FinanceiroMedicao," +
                               " (IB.Fisico_Estimado-FisicoMedicao) AS TotalQuantidade, (IB.Valor_Total-FinanceiroMedicao) AS TotalFinanceiro FROM (((((((((((((((((Itens_Diario AS ID INNER JOIN Locais_Servico AS LS ON ID.Cod_Loc_Serv=LS.Cod_Loc_Serv) INNER JOIN Municipio AS Mun ON LS.Cod_Municipio=Mun.Cod_Municipio) INNER JOIN Itens_Boletim AS IB ON ID.Cod_ItemBoletim=IB.Cod_ItemBoletim)INNER JOIN TipoServico as TS on TS.Cod_TipoServico = IB.Cod_TipoServico) INNER JOIN Boletim AS B ON IB.Cod_Boletim=B.Cod_Boletim) INNER JOIN Contrato AS C ON B.Cod_Contrato=C.Cod_Contrato)" +
                               " INNER JOIN Cabecalho ON B.Cod_Cabecalho=Cabecalho.Cod_Cabecalho) INNER JOIN Supervisao AS SUP ON Cabecalho.Cod_Supervisao=SUP.Cod_Supervisao) INNER JOIN UnidadeControleVale AS UNV ON Cabecalho.Cod_UC=UNV.Cod_UC) INNER JOIN NomeAtualVale AS NAV ON Cabecalho.Cod_Vale=NAV.Cod_Vale) INNER JOIN UnidadeMedida AS UM ON IB.Cod_UnidadeMedida=UM.Cod_UnidadeMedida) INNER JOIN Diarios AS D ON ID.Cod_Diario=D.Cod_Diario) INNER JOIN Equipe AS E ON D.Cod_Equipe=[E].Cod_Equipe) INNER JOIN Medicao AS M ON D.Cod_Medicao=M.Cod_Medicao)" +
                               " INNER JOIN Centro_Custo AS CC ON CC.Cod_CC=IB.Cod_CC) INNER JOIN Tipo_Aplicacao AS TA ON CC.Cod_Tipo_Aplicacao=TA.Cod_Tipo_Aplicacao) INNER JOIN Conta_Contabil AS Conta ON CC.Cod_Contabil=Conta.Cod_Contabil) INNER JOIN Almoxerifado AS A ON Mun.Cod_Almoxerifado=A.Cod_Almoxerifado " +
                                " WHERE D.Cod_Medicao = " + CodMedicao + " and CC.Numero_CC <> null " +
                               " GROUP BY C.Num_Contrato, SUP.Nome, Mun.Cidade, IB.Numero, IB.Descricao, UM.Sigla,TS.Nome, TA.Nome, UNV.Sigla, Conta.Num_Conta_Contabil, CC.Numero_CC,NAV.Num_Vale, IB.Fisico_Estimado, IB.Valor_Unitario, IB.Valor_Total,A.Nome;)" +
                               " order by IB.Numero"); ;

    e criei outro datatable para receber os dados

                           DataTable dt = new DataTable();

                             dt.Columns.Add("Contrato", typeof(string));
                            dt.Columns.Add("Item", typeof(string)); 

      dt.Rows.Add(query.Rows[0]["Num_Contrato"], ("'" + query.Rows[0]["Numero"].ToString()).ToString());

     gerar_a_partir_de_datatable(dt);

    funcionou a formatação mas ele só pega o primeiro registro. O que tenho q fazer?

    terça-feira, 25 de março de 2014 12:09
  • takiupaliu

    Que select MOSTRUOSO É ESSE?

    Printei até porque fique com medo.

    Mas vamos ao problema.

    Não vou nem tentar resolver esse problema diretamente pois vou ficar 100 anos analisando o select.

    Porem pelo que analisei vc não está percorrendo o datatable do seu resultado, ou seja, vc está apenas colocando o valor da primeira liinha do seu datatable no segundo que vai apresentar os dados.

    Faça o seguinte

                 /// dtb é um datatable que tenho no codigo, seria equivalete a sua datatable query
                DataTable dt = new DataTable();
                dt.Columns.Add("Contrato", typeof(string));
                dt.Columns.Add("Item", typeof(string));
    
                foreach (DataRow row in dtb.Rows)
                {
                    dt.Rows.Add(row[0].ToString(), row[1].ToString());
                }

    Coloquei row[0] e 1 apenas para exemplo, mas coloque o nome da coluna como boa pratica de programação.

    Esse foreach deve rodar todos os registro e preencher os dados do outro datatable que vc vai mandar para a classe do excel

    • Marcado como Resposta LetíciaF terça-feira, 25 de março de 2014 13:05
    terça-feira, 25 de março de 2014 12:37
  • Muitooooooo Obrigadaaaaaaaa!


    terça-feira, 25 de março de 2014 13:05
  • Tem como destinar um local para salvar esse  relatorio? e colocar um nome tambem?
    terça-feira, 25 de março de 2014 13:15
  • Ter até tem, mas ai vou deixar vc pesquisar um pouquinho.

    Salvar, nomear e etc são coisas que se encontra facilmente no google, te ajudei com a parte tecnica.

    Da para salvar em pdf, xls, xlxs, mas pesquisa um pouquinho agora Leticia

    Se hoje escrevi o codigo para vc, foi porque me matei para aprender porque esse codigo não se encontra em lugar algum.

    terça-feira, 25 de março de 2014 13:58
  •       public void gerar_a_partir_de_datatable(DataTable dtb)
            {
                Microsoft.Office.Interop.Excel.Application ex = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Workbook wk = ex.Workbooks.Add(Type.Missing);
                Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wk.Worksheets[1];

                for (int i = 0; i < dtb.Columns.Count; i++)
                {
                    Microsoft.Office.Interop.Excel.Range rg = (ws.Cells[1, i + 1] as Microsoft.Office.Interop.Excel.Range); // primeiro linha segundo coluna, no dtb começa 0 execel começa 1
                    rg.Value2 = dtb.Columns[i].ColumnName.ToString();
                }

                for (int i = 2; i < dtb.Rows.Count + 2; i++)
                {
                    DataRow row = dtb.Rows[i - 2]; // excel funciona no 1 e dtb no 0 então subtrai um para igualar os 2
                    for (int i2 = 1; i2 < dtb.Columns.Count + 1; i2++)
                    {
                        try
                        {
                            Microsoft.Office.Interop.Excel.Range rg = (ws.Cells[i, i2] as Microsoft.Office.Interop.Excel.Range); // primeiro linha segundo coluna, no dtb começa 0 execel começa 1
                            if (i2 == 1)
                            {
                                rg.NumberFormat = "@";
                            }
                            rg.Value2 = row[i2 - 1].ToString();

                        }
                        catch
                        {
                        }
                    }          

                }
                SaveFileDialog salvar = new SaveFileDialog();
                salvar.Title = "Exportar Excel";
                salvar.Filter = "Arquivo do Excel *.xls | *.xls";
                salvar.ShowDialog(); // mostra 


                // salva o arquivo 
                wk.SaveAs(salvar.FileName, MsExcel.XlFileFormat.xlWorkbookNormal, null, null, null, null,

                MsExcel.XlSaveAsAccessMode.xlExclusive, null, null, null, null, null);

                wk.Close(true, null, null);
                ex.Quit(); // encerra o excel 

                MessageBox.Show("Exportado com sucesso!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);

    }

    Consegui achar a solução!

    Obrigada pela ajuda!

                                                     
    quarta-feira, 26 de março de 2014 10:13