Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C导出到Excel文件中的第一行作为列名_C#_Sql Server_Dataset_Excel Interop - Fatal编程技术网

C# C导出到Excel文件中的第一行作为列名

C# C导出到Excel文件中的第一行作为列名,c#,sql-server,dataset,excel-interop,C#,Sql Server,Dataset,Excel Interop,我已经编写了一个小应用程序,它接受我的SQL查询并将数据输出到excel文件,然后通过电子邮件发送给我自己。除了我没有得到第一行作为列名之外,一切都运行得非常好。我想我在某个地方丢失了一个可以执行此操作的参数,或者我需要手动硬编码其中的第一行名称?这是我的密码: namespace MaintenanceReportDBtoExcel { class Program { static void Main(string[] args) {

我已经编写了一个小应用程序,它接受我的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");
        }
    }
}

您可以尝试替换此:

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

您需要在提取ColumnName属性的datatable的Columns集合上循环,并将其添加到excel文件中,然后在连接字符串中的datatable行上启动循环以设置HDR选项。请看:@jdweng是的,这听起来正是我想要的,但这不是SqlConnection字符串,对吗?这在代码中是什么样子的?很抱歉,我对导出数据库数据仍然很陌生。这很有效,只是它没有从最后一列中获取列名,该列实际上不是数据库中的列,而是由基于表中条件的查询创建的列。我应该没事,但你认为有什么办法吗?