C# C导出到Excel文件中的第一行作为列名
我已经编写了一个小应用程序,它接受我的SQL查询并将数据输出到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) {
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字符串,对吗?这在代码中是什么样子的?很抱歉,我对导出数据库数据仍然很陌生。这很有效,只是它没有从最后一列中获取列名,该列实际上不是数据库中的列,而是由基于表中条件的查询创建的列。我应该没事,但你认为有什么办法吗?