¿Cómo exporto una tabla a un doc. excel desde un procedimiento almacenado en C#?

Tengo mi procedimiento que trae una tabla y lo que quiero es que me lo exporte a Excel al presionar un botón.

QUERY: CREATE PROC planilla.USP_T_TIPO_DIA_CONCEPTUAL_HISTORICO_X_TRABAJADOR_LISTAR

@RucE char(11),
@Ejer char(4),
@Prdo char(2),
@Sem char(2),
@IC_TipoPlan char(1),
@Usu nvarchar(20),
@Cd_ModContrato nvarchar(1000)
as
declare
@ConsultaDiasConceptuales varchar(max) = '',
@TipoDiasConceptuales varchar(max) = '',
@SumaDiasConceptuales varchar(max) = '',
@CaseDiasConceptuales varchar(max) = '',
@SelectDiasConceptuales varchar(max) = '',
@GroupByDiasConceptuales varchar(max) = ''

set @Sem= isnull(@Sem,'')

if (@IC_TipoPlan = 'E' and exists (select top 1 * from planilla.T_TIPO_DIA_CONCEPTUAL where C_RUC_EMPRESA=@RucE))
Begin
    select @TipoDiasConceptuales += '''' + C_CODIGO_TIPO_DIA_CONCEPTUAL + ''' as [' + C_CODIGO_TIPO_DIA_CONCEPTUAL + '|' + C_NOMBRE_CORTO + '],',
            @CaseDiasConceptuales += 'case when ([' + C_CODIGO_TIPO_DIA_CONCEPTUAL + '|' + C_NOMBRE_CORTO + ']) = T1.C_CODIGO_TIPO_DIA_CONCEPTUAL then T1.C_CANTIDAD_DIAS else 0.00 end as [' + C_CODIGO_TIPO_DIA_CONCEPTUAL + '|' + C_NOMBRE_CORTO + '],',
            @SumaDiasConceptuales += 'SUM([' + C_CODIGO_TIPO_DIA_CONCEPTUAL + '|' + C_NOMBRE_CORTO + ']) as [' + C_CODIGO_TIPO_DIA_CONCEPTUAL + '|' + C_NOMBRE_CORTO + '],',
            @SelectDiasConceptuales += ',ISNULL([' + C_CODIGO_TIPO_DIA_CONCEPTUAL + '|' + C_NOMBRE_CORTO + '],0.00) as [' + C_CODIGO_TIPO_DIA_CONCEPTUAL + '|' + C_NOMBRE_CORTO + ']',
            @GroupByDiasConceptuales += 'diascpt.[' + C_CODIGO_TIPO_DIA_CONCEPTUAL + '|' + C_NOMBRE_CORTO + '],'
    from planilla.T_TIPO_DIA_CONCEPTUAL
    where C_RUC_EMPRESA=@RucE
    print @SelectDiasConceptuales
    if (LEN(@TipoDiasConceptuales) > 0) set @TipoDiasConceptuales = SUBSTRING(@TipoDiasConceptuales, 1, LEN(@TipoDiasConceptuales) - 1)
    if (LEN(@SumaDiasConceptuales) > 0) set @SumaDiasConceptuales = SUBSTRING(@SumaDiasConceptuales, 1, LEN(@SumaDiasConceptuales) - 1)
    if (LEN(@CaseDiasConceptuales) > 0) set @CaseDiasConceptuales = SUBSTRING(@CaseDiasConceptuales, 1, LEN(@CaseDiasConceptuales) - 1)
    --if (LEN(@SelectDiasConceptuales) > 0) set @SelectDiasConceptuales = SUBSTRING(@SelectDiasConceptuales, 1, LEN(@SelectDiasConceptuales) - 1)
    --if (LEN(@GroupByDiasConceptuales) > 0) set @GroupByDiasConceptuales = SUBSTRING(@GroupByDiasConceptuales, 1, LEN(@GroupByDiasConceptuales) - 1)

    --set @ConsultaDiasConceptuales =

End

exec('select tra.Cd_Trab'+@SelectDiasConceptuales+'
 from Trabajador tra 
    left join
    ( 
        select T2.C_CODIGO_TRABAJADOR,' + @SumaDiasConceptuales + '
        from
        (
            select T1.C_CODIGO_TRABAJADOR,' + @CaseDiasConceptuales + '
            from
            (
                select C_CODIGO_TRABAJADOR,' + @TipoDiasConceptuales + ',C_CODIGO_TIPO_DIA_CONCEPTUAL,C_CANTIDAD_DIAS
                from planilla.T_DIA_CONCEPTUAL_HISTORICO_X_TRABAJADOR
                where C_RUC_EMPRESA=''' + @RucE + ''' and C_EJERCICIO=''' + @Ejer + ''' and C_PERIODO=''' + @Prdo + '''
            ) as T1
        ) as T2
        group by T2.C_CODIGO_TRABAJADOR

    ) as diascpt on tra.Cd_Trab = diascpt.C_CODIGO_TRABAJADOR 
 where tra.RucE = '''+@RucE+''' and tra.IC_TipoPlan='''+@IC_TipoPlan+''' and tra.Cd_Trab in (select Cd_Trab from dbo.fn_SelectTrab2('''+@RucE+''','''+@Ejer+''','''+@Prdo+''','''+@Sem+''','''+@IC_TipoPlan+''','''+@Cd_ModContrato+''',''1'','''+@Usu+'''))') 

aquí está mi DAO

    public ClassResultPV Pln_CargarDiasConceptuales(DtoB dto)
    {
        ClassResultPV cr = new ClassResultPV();
        DtoTareo dtoTareo = (DtoTareo)dto;
        SqlParameter[] pr = new SqlParameter[7];
        try
        {
            pr[0] = new SqlParameter("@RucE", SqlDbType.Char, 11);
            pr[0].Value = dtoTareo.RucE;

            pr[1] = new SqlParameter("@Ejer", SqlDbType.Char, 4);
            pr[1].Value = dtoTareo.Ejer;

            pr[2] = new SqlParameter("@Prdo", SqlDbType.Char, 2);
            pr[2].Value = dtoTareo.Prdo;

            pr[3] = new SqlParameter("@Sem", SqlDbType.Char, 2);
            pr[3].Value = Pv_ValidaPrNull(dtoTareo.Sem);

            pr[4] = new SqlParameter("@IC_TipPlan", SqlDbType.Char, 1);
            pr[4].Value = dtoTareo.TipPlan;

            pr[5] = new SqlParameter("@Usu", SqlDbType.NVarChar, 20);
            pr[5].Value = dtoTareo.Usu;

            pr[6] = new SqlParameter("@Cd_ModContrato", SqlDbType.NVarChar, 1000);
            pr[6].Value = Pv_ValidaPrNull(dtoTareo.Cd_ModContrato);

            cr.DS = SqlHelper.ExecuteDataset(objCn, CommandType.StoredProcedure, "USP_T_TIPO_DIA_CONCEPTUAL_HISTORICO_X_TRABAJADOR_LISTAR", pr);
            cr.DT = cr.DS.Tables.Count > 0 ? cr.DS.Tables[0] : new DataTable();
        }
        catch (Exception ex)
        {
            cr.ErrorMsj = "Error al consultar el tareaje";
            cr.ErrorEx = ex.Message;
            cr.LugarError = ex.StackTrace;
        }
        return cr;
    }

este es mi botón pero me llena separado por ","

    private void btnImportar_Click(object sender, EventArgs e)
    {
        // Crear un objeto SqlConnection, y luego pasar la ConnectionString al constructor.            
        try
        {
            ClassResultPV cr;
            {
                CtrTareo ctr = new CtrTareo();
                cr = ctr.Pln_CargarDiasConceptuales(new DtoTareo()
                {
                    RucE = Globales.RucEmp,
                    Ejer = Globales.EjeEmp,
                    Prdo = Globales.Prdo,
                    TipPlan = Globales.TipoPlanilla == TipPlanilla.Empleados ? "E" : "O",
                    Sem = Globales.TipoPlanilla == TipPlanilla.Empleados ? null : Globales.Semana,
                    Usu = Globales.UsuActual,
                    Cd_ModContrato = chkModContrato.Visible == true ? HelpPV.ObtenerCodidoStr_CheckedComboBoxEdit(chkModContrato, ',') : null
                });
                dtdc = cr.DT;
            }

            try
            {
                //open file
                StreamWriter sw = new StreamWriter(@"D:\\Import_Dias_Conceptuales.xls");
                // First we will write the headers.
                //DataTable dt = m_dsProducts.Tables[0];
                int iColCount = dtdc.Columns.Count;
                for (int i = 0; i < iColCount; i++)
                {
                    sw.Write(dtdc.Columns[i]);
                    if (i < iColCount - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.Write(sw.NewLine);

                // Now write all the rows.

                foreach (DataRow dr in dtdc.Rows)
                {
                    for (int i = 0; i < iColCount; i++)
                    {
                        if (!Convert.IsDBNull(dr[i]))
                        {
                            sw.Write(dr[i].ToString());
                        }
                        if (i < iColCount - 1)
                        {
                            sw.Write(",");
                        }
                    }

                    sw.Write(sw.NewLine);
                }
                sw.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        catch (Exception ex)
        {

        }
    }
2
задан 29.12.2016, 23:06
0 ответов

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

А следовательно я вижу (исправь меня, если я ошибаюсь), ты используешь StreamWriter чтобы писать данные DataTable. Проблема состоит в том, что у Excel есть специальный формат хранения файлов. То, что ты делаешь действительно, состоит в том, чтобы наполнять текстовый файл полями, отделенными запятыми.

Текстовыми файлами, отделенными табуляторами, запятыми или точками с запятой является то, что известно как файлы CSV. Excel может читать этот тип файлов, но не родной формат этого приложения.

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

Особенно я использую ClosedXml, хотя ты найдешь несколько сходных книжных магазинов.

0
ответ дан 03.12.2019, 17:56