Avatar billede sbaht Nybegynder
28. marts 2006 - 13:45 Der er 20 kommentarer og
1 løsning

Data fra MS-SQL til Excel med ASP.NET

Jeg skal lave en knap der ekportere en tabel fra sql db til Excel, er der nogen der ved hvordan man griber det an, jeg kan sagten ekportere til et datagrid men nu skal det eksporteres direkte til Excel.
Avatar billede dr_chaos Nybegynder
28. marts 2006 - 13:52 #2
coden konverteret til c# ser ud på denne måde:
public string ExportRequest()
{
  string tempExportRequest = null;
try
{
//  On Error GoTo err_Handler

  // Excel object variables
  Excel.Application appExcel = null;
  Excel.Workbook wbk = null;
  Excel.Worksheet wks = null;
  string sTemplate = null;
  string sTempFile = null;
  string sOutput = null;

  DAO.Database dbs = null;
  DAO.Recordset rst = null;
  string sSQL = null;
  long lRecords = 0;
  int iRow = 0;
  int iCol = 0;
  int iFld = 0;

  const byte cTabTwo = 2;
  const byte cStartRow = 4;
  const byte cStartColumn = 3;

  DoCmd.Hourglass true;

  // set to break on all errors
  Application.SetOption "Error Trapping", 0;

  // start with a clean file built from the template file
  sTemplate = CurrentProject.Path + "\\SalesTemplate.xls";
  sOutput = CurrentProject.Path + "\\SalesOutput.xls";
  if (Microsoft.VisualBasic.FileSystem.Dir(sOutput, Microsoft.VisualBasic.FileAttribute.Normal) != "")
      Kill sOutput;
  FileCopy sTemplate, sOutput;

  // Create the Excel Applicaiton, Workbook and Worksheet and Database object
  Set appExcel = Excel.Application;
  Set wbk = appExcel.Workbooks.Open(sOutput);
  Set wks = appExcel.Worksheets(cTabTwo);
  sSQL = "select * from qrySales";
  Set dbs = CurrentDb;
  Set rst = dbs.OpenRecordset(sSQL, dbOpenSnapshot);

  // For this template, the data must be placed on the 4th row, third column.
  // (these values are set to constants for easy future modifications)
  iCol = cStartColumn;
  iRow = cStartRow;
  if (! rst.BOF)
      rst.MoveFirst();
  while ( ! (rst.EOF))
  {
      iFld = 0;
      lRecords = lRecords + 1;
      this.lblMsg.Caption = "Exporting record #" + lRecords + " to SalesOutput.xls";
      this.Repaint;

//INSTANT C# NOTE: The ending condition of VB 'For' loops is tested only on entry to the loop. Instant C# has created a temporary variable in order to use the initial value of cStartColumn + (rst.Fields.Count - 1) for every iteration:
      int tempFor1 = cStartColumn + (rst.Fields.Count - 1);
      for (iCol = cStartColumn; iCol <= tempFor1; iCol++)
      {
        wks.Cells(iRow, iCol) = rst.Fields[iFld];

        if ((rst.Fields[iFld].Name.IndexOf("Date", 0) + 1) > 0)
            wks.Cells(iRow, iCol).NumberFormat = "mm/dd/yyyy";

        wks.Cells(iRow, iCol).WrapText = false;
        iFld = iFld + 1;
      }

      wks.Rows[iRow].EntireRow.AutoFit;
      iRow = iRow + 1;
      rst.MoveNext();
  }

  tempExportRequest = "Total of " + lRecords + " rows processed.";
  this.lblMsg.Caption = "Total of " + lRecords + " rows processed.";

exit_Here:
  // Cleanup all objects  (resume next on errors)
//TODO: INSTANT C# TODO TASK: The 'On Error Resume Next' statement is not converted by Instant C#:
  On Error Resume Next
  Set wks = null;
  Set wbk = null;
  Set appExcel = null;
  Set rst = null;
  Set dbs = null;
  DoCmd.Hourglass false;
  return tempExportRequest;

}

catch
{
//TODO: INSTANT C# TODO TASK: Calls to the VB 'Err' object are not converted by Instant C#:
  tempExportRequest = Err.Description;
//TODO: INSTANT C# TODO TASK: Calls to the VB 'Err' object are not converted by Instant C#:
  this.lblMsg.Caption = Err.Description;
  goto exit_Here;

}
  return tempExportRequest;
}
Avatar billede dj_uncas Nybegynder
28. marts 2006 - 13:53 #3
Hvorfor har du lavet 2 spørgsmål?

Anyway, det er bare at sætte:
Response.ContentType = "application/vnd.ms.excel";

Så er det også en god ide at fjerne alt der ikke lige er <html>, <body> eller <table> tags, så excel ikke fucker op. F.eks. skal du sætte EnableViewState="false"..
Avatar billede sbaht Nybegynder
28. marts 2006 - 14:11 #4
Ja det er en fejl, jeg syntes ikke den gemte det første gang, men det var åbenbart noget med opdateringen der glippede.. Jeg lukker det andet..
Avatar billede sbaht Nybegynder
28. marts 2006 - 15:02 #5
PUHAA!! dr_chaos det var en ordentlig mundfuld, har prøvet at rode lidt med det men kan umiddelbart ikke få det til at virke..
Avatar billede dj_uncas Nybegynder
28. marts 2006 - 15:05 #6
Har du prøvet bare at gøre som jeg foreslår, og sætte Response.ContentType? Hvis du kan få noget ud af det, er det da et sted at starte..
Avatar billede dr_chaos Nybegynder
28. marts 2006 - 15:06 #7
Ja var bare et script jeg fandt. prøv evt dj's løsning.
Avatar billede sbaht Nybegynder
28. marts 2006 - 15:09 #8
Det kan også bruges, spørgsmålet er så bare at ved at bruge Response.ContentType = "application/vnd.ms.excel"; eksporteres dataene ikke direkte til excel??
Avatar billede dj_uncas Nybegynder
28. marts 2006 - 15:23 #9
Jeg forstår ikke lige hvad du mener?

Med Response.ContentType vises din HTML side som et Excel dokument, men nej der bliver ikke oprettet en ny .xls fil, eller noget i den stil...
Avatar billede sbaht Nybegynder
29. marts 2006 - 07:23 #10
Ok men hvor definere man så hvilken tabel man ønsker at eksportere??
Avatar billede dj_uncas Nybegynder
29. marts 2006 - 09:30 #11
På denne måde bliver alt indhold på din side vist som et Excel dokument. Lige fra <html> til </html> ;-)
Avatar billede sbaht Nybegynder
29. marts 2006 - 11:26 #12
Ja men hva så når indholdet ikke skal vises på siden først, men eksporteres direkte fra databasen?
Avatar billede dj_uncas Nybegynder
29. marts 2006 - 11:34 #13
Så databinder du alle data til eks. et GridView, og angiver bagefter ContentType:

MitGridView.DataSource = mitDataSet;
MitGridView.DataBind();

Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader( "Content-Disposition", "inline; filename=MinDataFil.xls" );
Avatar billede sbaht Nybegynder
29. marts 2006 - 12:11 #14
Ok har gjort følgende, problemet er lidt det GridView, jeg er ikke skarp på hvordan man definere det.

strConnection = "user id=User;password=XXXX;";
            strConnection += "initial catalog=log;server= NYsql;";
            strConnection += "Connect Timeout=30";

            SqlConnection conn = new SqlConnection( strConnection );
            SqlCommand cmd = new SqlCommand( searchSql, conn );
            DataSet ds = new DataSet();
            SqlDataAdapter adpt = new SqlDataAdapter( cmd );
            cmd.Connection.Open();

            try
            {
                adpt.Fill( ds );
            }
            finally
            {
                cmd.Connection.Close();
            }

            GridView.DataSource = ds;
            GridView.DataGrid1.DataBind();
            Response.ContentType = "application/vnd.ms-excel";
            Response.AppendHeader( "Content-Disposition", "inline; filename=DataFil.xls" );
Avatar billede dj_uncas Nybegynder
29. marts 2006 - 12:14 #15
du har i din .aspx side:
<asp:GridView id="MyGrid" runat="server" />

og i .aspx.cs:

..la la, connection..
MyGrid.DataSource = ds;
MyGrid.DataBind();
Avatar billede sbaht Nybegynder
29. marts 2006 - 13:05 #16
Ok så langt er jeg med, men hvad er forskellen på et gridview og et datagrid?
Avatar billede dj_uncas Nybegynder
29. marts 2006 - 13:26 #17
Der er kun forskel på hvor nice de er :-D

GridView er en 2.0 version af DataGrid, med mere standard xhtml-agtighed... Så simpelt er det.. GridView har vist også lidt flere funktionaliteter, men det kan jeg ikke lige udtale mig om på stående fod.
Avatar billede dj_uncas Nybegynder
29. marts 2006 - 13:27 #18
Men jeg vil foreslå dig at bruge GridView hvis du udvikler i 2.0, da det giver noget pænere HTML
Avatar billede sbaht Nybegynder
29. marts 2006 - 13:29 #19
Ok jeg har fået det til at virke, jeg skulle lige forstå hvad f..... det var du mente, men nu spiller det lige efter bogen. Så hvis du smider et svar så er pointuddeling..
Avatar billede dj_uncas Nybegynder
29. marts 2006 - 13:30 #20
Cool. Svar kommer her...
Avatar billede sbaht Nybegynder
29. marts 2006 - 13:31 #21
Jeg udvikler i 1.1, så det var nok derfor jeg ikke fattede hvad et GridView var.:-) men så er man da blevet det klogere..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester