Первая строка в виде имен столбцов в C# Экспорт в файл Excel - PullRequest
0 голосов
/ 06 января 2020

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

namespace MaintenanceReportDBtoExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection cnn;
            string connectionString = null;
            string sql = null;
            string data = null;
            int i = 0;
            int j = 0;

            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            object misValue = System.Reflection.Missing.Value;

            xlApp = new Excel.Application();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            connectionString = @"data source=MFG-DB-DEV;Integrated Security=true;initial catalog=OLTP;";
            cnn = new SqlConnection(connectionString);
            cnn.Open();
            sql = @"SELECT MS.MaintCompletionDate, RF.ObjectType, RD.ResourceName, MRB.MaintenanceReqName, MS.NextDateDue,
                    CASE
                        WHEN

                            CASE MRB.MaintenanceReqName
                                WHEN 'Bi-Annual' THEN DATEADD(year, 2, MS.LastDateDue)
                                WHEN 'Annual' THEN DATEADD(year, 1, MS.LastDateDue)
                                WHEN 'Calibration - Annual' THEN DATEADD(year, 1, MS.LastDateDue)
                                WHEN 'Annual - ASY' THEN DATEADD(year, 1, MS.LastDateDue)
                                WHEN 'Semi-Annual' THEN DATEADD(month, 6, MS.LastDateDue)
                                WHEN 'Calibration - Semi-Annual' THEN DATEADD(month, 6, MS.LastDateDue)
                                WHEN 'Quarterly' THEN DATEADD(month, 3, MS.LastDateDue)
                                WHEN 'Calibration - Quarterly' THEN DATEADD(month, 3, MS.LastDateDue)
                                WHEN 'Quarterly - ASY' THEN DATEADD(month, 3, MS.LastDateDue)
                                WHEN 'Monthly' THEN DATEADD(month, 1, MS.LastDateDue)
                                WHEN 'Calibration - Weekly' THEN DATEADD(week, 1, MS.LastDateDue)
                                WHEN 'Weekly - ASY' THEN DATEADD(week, 1, MS.LastDateDue)
                                WHEN 'Semi-Annual - ASY' THEN DATEADD(month, 6, MS.LastDateDue)
                                WHEN 'Monthly - ASY' THEN DATEADD(month, 1, MS.LastDateDue)
                                WHEN 'Bi-Annual - ASY' THEN DATEADD(year, 2, MS.LastDateDue)
                                WHEN 'Weekly' THEN DATEADD(week, 1, MS.LastDateDue)
                                END < GETDATE() THEN 'PAST DUE'

                        WHEN MS.LastDateDue IS NULL AND MS.NextDateDue < GETDATE() THEN 'PAST DUE'

                        WHEN MS.LastDateDue IS NULL AND MS.NextDateDue > GETDATE() THEN 'READY'

                        WHEN MS.LastDateDue IS NULL AND MS.NextDateDue IS NULL THEN 'N/A'

                        ELSE 'READY'
                    END AS MaintenanceStatus
                    FROM CamstarSch.ResourceDef RD
                    INNER JOIN CamstarSch.MaintenanceStatus MS ON RD.ResourceId = MS.ResourceId
                    INNER JOIN CamstarSch.ResourceFamily RF ON RF.ResourceFamilyId = RD.ResourceFamilyId
                    INNER JOIN CamstarSch.AssignedMaintReq AMR ON AMR.AssignedMaintReqId = MS.AssignedMaintReqId
                    INNER JOIN CamstarSch.MaintenanceReq MR ON AMR.MaintenanceReqId = MR.MaintenanceReqId
                    INNER JOIN CamstarSch.MaintenanceReqBase MRB ON MRB.MaintenanceReqBaseId = MR.MaintenanceReqBaseId
                    ORDER BY NextDateDue DESC; ";
            SqlDataAdapter dscmd = new SqlDataAdapter(sql, cnn);
            DataSet ds = new DataSet();
            dscmd.Fill(ds);

            for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
            {
                for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
                {
                    data = ds.Tables[0].Rows[i].ItemArray[j].ToString();
                    xlWorkSheet.Cells[i + 1, j + 1] = data;
                }
            }

            xlWorkBook.SaveAs(@"C:\Users\mbelmer\Desktop\Helpful Files\Test files\MaintenanceReport.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();

            Marshal.ReleaseComObject(xlWorkSheet);
            Marshal.ReleaseComObject(xlWorkBook);
            Marshal.ReleaseComObject(xlApp);
            GC.Collect();

            MailHelper.SendMail(new string[] { "mbelmer@rocelec.com" }, $"Maintenance Report {DateTime.Today}", $"Maintenance Report for {DateTime.Today}", new string[] { @"C:\Users\mbelmer\Desktop\Helpful Files\Test files\MaintenanceReport.xls" });
            Thread.Sleep(500);
            File.Delete(@"C:\Users\mbelmer\Desktop\Helpful Files\Test files\MaintenanceReport.xls");
        }
    }
}

1 Ответ

0 голосов
/ 06 января 2020

Вы можете попробовать заменить это:

for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {
            for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
            {
                data = ds.Tables[0].Rows[i].ItemArray[j].ToString();
                xlWorkSheet.Cells[i + 1, j + 1] = data;
            }
        }

На это:

for (int j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
        {
            data = ds.Tables[0].Columns[j].ColumnName;
            xlWorkSheet.Cells[1, j + 1] = data;
        }

for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
    {
        for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++)
        {
            data = ds.Tables[0].Rows[i].ItemArray[j].ToString();
            xlWorkSheet.Cells[i + 2, j + 1] = data;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...