Send søkeresultatene til Excel fra ASP.NET nettsted

stemmer
5

Vi lar brukerne opprette ad-hoc-spørringer på våre nettsider. Vi ønsker å ha brukeren velge sine kriterier, klikk deretter sende og ha resultatene streames automatisk til Excel. Jeg har anvendelsen populere en Table, deretter ved hjelp av datatable for å skape en fane avgrenset streng. Problemet er å få det til å utmerke seg.

Hva er den beste måten å streame data til Excel? Helst ville vi ikke ha for å gjøre brukerne lukke et tomt vindu etter å ha klikket på send-knappen.

Publisert på 29/09/2008 klokken 12:35
kilden bruker
På andre språk...                            


7 svar

stemmer
10

Endre sidens filtype å utmerke seg, og bare streame HTML nødvendig å bygge en tabell på siden. kode fra her

//for demo purpose, lets create a small datatable & populate it with dummy data
System.Data.DataTable workTable = new System.Data.DataTable();

//The tablename specified here will be set as the worksheet name of the generated Excel file. 
workTable.TableName = "Customers";
workTable.Columns.Add("Id");
workTable.Columns.Add("Name");
System.Data.DataRow workRow;

for (int i = 0; i <= 9; i++)
{
workRow = workTable.NewRow();
workRow[0] = i;
workRow[1] = "CustName" + i.ToString();
workTable.Rows.Add(workRow);
}

//...and lets put DataTable2ExcelString to work
string strBody = DataTable2ExcelString(workTable);

Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
Response.AppendHeader("Content-disposition", "attachment; filename=my.xls");
Response.Write(strBody);
Svarte 29/09/2008 kl. 12:37
kilden bruker

stemmer
0

Jeg vil anbefale å bruke en filehandler (.ashx) Det eneste problemet er å skape excel-filen fra Datatable. Det finnes en rekke tredjeparts produkter som vil gjøre dette for deg (f.eks Infragistics gir en komponent som gjør nettopp dette).

En ting jeg anbefaler mot bruker Excel Interop på serveren din ... det er veldig tung og støttes ikke.

Svarte 29/09/2008 kl. 12:39
kilden bruker

stemmer
1

Hvis du oppretter en side som er bare en tabell med resultatene og sette sidens innholdstype til "application / vnd.ms-excel", så produksjonen vil være i Excel.

Response.ContentType = "application/vnd.ms-excel";

Hvis du vil tvinge frem en spare, ville du gjøre noe sånt som følgende:

Response.AddHeader("Content-Disposition", "attachment; filename=somefilename.xls");
Svarte 29/09/2008 kl. 12:47
kilden bruker

stemmer
0

Når du har din Datasett kan du konvertere den til et objekt [,] og sette det inn i et Excel-dokument. Deretter kan du lagre dokumentet på disk og streame den til brukeren.

        //write the column headers
        for (int cIndex = 1; cIndex < 1 + columns; cIndex++)
            sheet.Cells.set_Item(4, cIndex, data.Columns[cIndex - 1].Caption);
        if (rows > 0)
        {

            //select the range where the data will be pasted
            Range r = sheet.get_Range(sheet.Cells[5, 1], sheet.Cells[5 + (rows - 1), columns]);

            //Convert the datatable to an object array
            object[,] workingValues = new object[rows, columns];

            for (int rIndex = 0; rIndex < rows; rIndex++)
                for (int cIndex = 0; cIndex < columns; cIndex++)
                    workingValues[rIndex, cIndex] = data.Rows[rIndex][cIndex].ToString();

            r.Value2 = workingValues;
         }
Svarte 29/09/2008 kl. 13:06
kilden bruker

stemmer
0

Jeg ville bruke et behandlingsprogram for XLS filtypen og en gratis komponent for å konvertere Table til morsmålsopplæring xls format. Komponenten fra dette nettstedet http://www.csvreader.com/ gjør mer at nettadressen tilsier. Den nyeste versjonen av Excel vil klage på en HTML-formatert XLS-fil. Også huske på størrelsen på data blir returnert. Webserveren din bør bruke komprimering for denne utvidelsen, og koden din bør sjekke hvis antallet rader som returneres er større enn det som excel kan vises i ett regneark; flere ark kan være nødvendig. http://www.mrexcel.com/archive2/23600/26869.htm

Svarte 29/09/2008 kl. 13:24
kilden bruker

stemmer
1

Jeg fikk en utils funksjon som gjør dette allerede. Når du setter den inn i en Datatable, kan du eksportere den med Response hjelp

        public static void DataTabletoXLS(DataTable DT, string fileName)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Charset = "utf-16";
        HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
        HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", fileName));
        HttpContext.Current.Response.ContentType = "application/ms-excel";

        string tab = "";
        foreach (DataColumn dc in DT.Columns)
        {
            HttpContext.Current.Response.Write(tab + dc.ColumnName.Replace("\n", "").Replace("\t", ""));
            tab = "\t";
        }
        HttpContext.Current.Response.Write("\n");

        int i;
        foreach (DataRow dr in DT.Rows)
        {
            tab = "";
            for (i = 0; i < DT.Columns.Count; i++)
            {
                HttpContext.Current.Response.Write(tab + dr[i].ToString().Replace("\n", "").Replace("\t", ""));
                tab = "\t";
            }
            HttpContext.Current.Response.Write("\n");
        }
        HttpContext.Current.Response.End();
               }
Svarte 29/09/2008 kl. 17:56
kilden bruker

stemmer
0

Vennligst bruk denne koden for å løse problemet.Denne koden vil konvertere excel ark til tekst format.Hope dette vil løse problemet

    grdSrcRequestExport.RenderControl(oHtmlTextWriter);
    string s = "";
    s=oStringWriter.ToString().Replace("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">", "");
    s="<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\"><head><meta http-equiv=Content-Type content=\"text/html; charset=us-ascii\"><meta name=ProgId content=Excel.Sheet><meta name=Generator content=\"Microsoft Excel 11\"><table x:str border=0 cellpadding=0 cellspacing=0 width=560 style='border-collapse: collapse;table-layout:fixed;width:420pt'>"+s.ToString()+"</table></body></html>";
    //Byte[] bContent = System.Text.Encoding.GetEncoding("utf-8").GetBytes();
    Response.Write(s);
Svarte 29/06/2009 kl. 07:51
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more