ASP.NET में एक एक्सेल फाइल बनाना [बंद]


99

मैं एक ASP.NET ऐप (VB.NET कोडबेहाइंड) में एक सेक्शन जोड़ने वाला हूं, जो एक उपयोगकर्ता को एक्सेल फाइल के रूप में उन्हें लौटाए जाने वाले डेटा को प्राप्त करने की अनुमति देगा, जो मैं डेटाबेस डेटा के आधार पर उत्पन्न करूंगा। जबकि ऐसा करने के कई तरीके हैं, प्रत्येक की अपनी कमियां हैं। आप डेटा कैसे लौटाएंगे? मैं एक ऐसी चीज की तलाश में हूं जो यथासंभव साफ और सीधी हो।


जवाबों:


131

सीएसवी

पेशेवरों:

  • सरल

विपक्ष:

  • यह अन्य स्थानों या विभिन्न एक्सेल कॉन्फ़िगरेशन (यानी सूची विभाजक) में काम नहीं कर सकता है
  • स्वरूपण, सूत्र, आदि लागू नहीं कर सकते

एचटीएमएल

पेशेवरों:

  • अभी भी बहुत आसान है
  • सरल बनाने और सूत्रों का समर्थन करता है

विपक्ष:

  • आपको फ़ाइल को xls के रूप में नाम देना होगा और Excel आपको एक गैर देशी एक्सेल फ़ाइल खोलने के बारे में चेतावनी दे सकता है
  • प्रति कार्यपुस्तिका एक कार्यपत्रक

OpenXML (Office 2007 .XLSX)

पेशेवरों:

  • देशी एक्सेल प्रारूप
  • सभी एक्सेल सुविधाओं का समर्थन करता है
  • एक्सेल की एक कॉपी कॉपी की आवश्यकता नहीं है
  • पिवट टेबल उत्पन्न कर सकते हैं
  • ओपन सोर्स प्रोजेक्ट EPPlus का उपयोग करके उत्पन्न किया जा सकता है

विपक्ष:

  • Excel 2007 के बाहर सीमित संगतता (आजकल कोई समस्या नहीं होनी चाहिए)
  • जब तक आप तीसरे पक्ष के घटक का उपयोग नहीं कर रहे हैं तब तक जटिल है

SpreadSheetML (खुला प्रारूप XML)

पेशेवरों:

  • देशी एक्सेल प्रारूपों की तुलना में सरल
  • अधिकांश एक्सेल विशेषताओं का समर्थन करता है: प्रति कार्यपुस्तिका, स्वरूपण, शैली, सूत्र, एकाधिक पत्रक
  • इसका उपयोग करने के लिए एक्सेल को स्थापित करने की आवश्यकता नहीं है
  • किसी तीसरे पक्ष के पुस्तकालयों की जरूरत नहीं है - बस अपना xml लिखें
  • दस्तावेज़ एक्सेल एक्सपी / 2003/2007 द्वारा खोले जा सकते हैं

विपक्ष:

  • अच्छे प्रलेखन का अभाव
  • Excel के पुराने संस्करणों में समर्थित नहीं (2000 से पहले)
  • केवल-लिखें, इसमें एक बार जब आप इसे खोलते हैं और एक्सेल से बदलाव करते हैं तो यह देशी एक्सेल में बदल जाता है।

XLS (थर्ड पार्टी कंपोनेंट द्वारा उत्पन्न)

पेशेवरों:

  • सभी फ़ॉर्मेटिंग, फ़ार्मुलों आदि के साथ देशी एक्सेल फ़ाइल बनाएँ।

विपक्ष:

  • खरीद दाम
  • निर्भरता जोड़ें

COM इंटरॉप

पेशेवरों:

  • देशी Microsoft पुस्तकालयों का उपयोग करता है
  • देशी दस्तावेजों के लिए समर्थन पढ़ें

विपक्ष:

  • बहुत धीमी गति से
  • निर्भरता / संस्करण मिलान समस्याएँ
  • पढ़ते समय वेब उपयोग के लिए कंसीडर / डेटा अखंडता मुद्दे
  • बहुत धीमी गति से
  • वेब उपयोग के लिए स्केलिंग मुद्दे (संगामिति से अलग): सर्वर पर भारी एक्सेल ऐप के कई उदाहरण बनाने की जरूरत है
  • विंडोज की आवश्यकता है
  • क्या मैंने उल्लेख किया है कि यह धीमा है?

1
स्प्रेडशीट बीएमएल के लिए उल्लिखित "राइट-ओनली" बाधा पूरी तरह से एक मुद्दा नहीं है, क्योंकि आप चाहें तो स्प्रेडशीट एमएल के रूप में एक एक्सेल फाइल को बचा सकते हैं।
ब्रायन

1
यदि आप इसके साथ बड़ी फ़ाइलें बनाते हैं, तो स्प्रेडशीट Excel 2003 को क्रैश कर सकता है। इस पर भरोसा मत करो: /
ब्रायन

2
आप Office 2002 और 2003 में ठीक स्प्रेडशीट फ़ाइल में वापस सेव कर सकते हैं। आवश्यक नहीं है। स्प्रैडशीटएमएल ऑफिस 2007 की नई विशेषताओं (जैसे, 3 से अधिक सशर्त प्रारूप) सहित मैक्रोज़, चार्ट, ग्राफिक्स और कुछ अन्य बाधाओं और छोरों को संग्रहीत नहीं कर सकता है। चूंकि XML क्रिया है, सर्वर से भेजने से पहले Zipping SpreadsheetML (SharpZipLib का उपयोग करना एक विकल्प है) डाउनलोड के समय को कम करने के लिए बहुत अच्छा काम करता है - वास्तव में, यह उल्लेख किया जाना चाहिए कि OpenXML वैसे भी एक ज़िप कंटेनर में संग्रहीत है। @ ब्रायन: मैं दुर्घटनाग्रस्त समस्याओं के बिना दैनिक आधार पर 50-100MB रेंज में जटिल स्प्रेडशीट बीएमएल का उपयोग करता हूं।
richardtallent

यदि कोई संभावना है कि आपको CSV के रूप में बड़ी मात्रा में डेटा निर्यात करना होगा। स्प्रेडशीट बीएमएल के अलावा किसी भी अन्य प्रारूप के साथ एक बेहतर समाधान बनाना कठिन है। HTML को कुशलतापूर्वक लिखा और पढ़ा जा सकता है, लेकिन उपयोगी होने के लिए आपके हिस्से पर और विनिर्देश की आवश्यकता है। HTML और स्प्रेडशीट, दोनों में बड़ी फाइलों के बारे में अन्य मुद्दे हैं जैसे ब्रायन ने अपनी टिप्पणी में उल्लेख किया है। इसलिए अगर आपको बस CSV के साथ सरल डेटा निर्यात स्टिक की आवश्यकता है।
जोहान्सएच

2
@ पोमार्क: यह सीधा हो सकता है, लेकिन यह साफ नहीं है। उपयोगकर्ता एक्सेल फ़ाइल चाहता है और आप उसे एक नकली एक्सटेंशन के साथ एक HTML फ़ाइल देते हैं।
हेंजज़ी

38

आप डेटा को html टेबल सेल के रूप में आउटपुट कर सकते हैं, उस पर एक एक्सटेंशन .xlsया स्टिक चिपका .xlsxसकते हैं, और एक्सेल इसे खोल देगा जैसे कि यह एक देशी दस्तावेज़ हो। आप इस तरह से कुछ सीमित प्रारूपण और सूत्र गणना भी कर सकते हैं, इसलिए यह सीएसवी की तुलना में अधिक शक्तिशाली है। इसके अलावा, एक HTML तालिका का उत्पादन ASP.Net जैसे वेब प्लेटफॉर्म से करना बहुत आसान होना चाहिए;)

यदि आपको अपनी एक्सेल वर्कबुक में कई वर्कशीट या नामित वर्कशीट की आवश्यकता है, तो आप एक्सएमएल स्कीमा नामक एक्सएमएल स्कीम के जरिए कुछ ऐसा कर सकते हैं SpreadSheetML। यह वह नया प्रारूप नहीं है जो Office 2007 के साथ भेजा गया है, लेकिन कुछ और पूरी तरह से अलग है जो Excel 2000 के रूप में वापस काम करता है। यह समझने का सबसे आसान तरीका है कि यह कैसे काम करता है एक उदाहरण के साथ:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
        xmlns:o="urn:schemas-microsoft-com:office:office"
        xmlns:x="urn:schemas-microsoft-com:office:excel"
        xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
        xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
      <Author>Your_name_here</Author>
      <LastAuthor>Your_name_here</LastAuthor>
      <Created>20080625</Created>
      <Company>ABC Inc</Company>
      <Version>10.2625</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
        <WindowHeight>6135</WindowHeight>
        <WindowWidth>8445</WindowWidth>
        <WindowTopX>240</WindowTopX>
        <WindowTopY>120</WindowTopY>
        <ProtectStructure>False</ProtectStructure>
        <ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>

<Styles>
      <Style ss:ID="Default" ss:Name="Normal">
            <Alignment ss:Vertical="Bottom" />
            <Borders />
            <Font />
            <Interior />
            <NumberFormat />
            <Protection />
      </Style>
</Styles>

<Worksheet ss:Name="Sample Sheet 1">
<Table ss:ExpandedColumnCount="2" x:FullColumns="1" x:FullRows="1" ID="Table1">
<Column ss:Width="150" />
<Column ss:Width="200" />
<Row>
      <Cell><Data ss:Type="Number">1</Data></Cell>
      <Cell><Data ss:Type="Number">2</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">3</Data></Cell>
      <Cell><Data ss:Type="Number">4</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">5</Data></Cell>
      <Cell><Data ss:Type="Number">6</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">7</Data></Cell>
      <Cell><Data ss:Type="Number">8</Data></Cell>
</Row>
</Table>
</Worksheet>

<Worksheet ss:Name="Sample Sheet 2">
<Table ss:ExpandedColumnCount="2" x:FullColumns="1" x:FullRows="1" ID="Table2">
<Column ss:Width="150" />
<Column ss:Width="200" />
<Row>
      <Cell><Data ss:Type="String">A</Data></Cell>
      <Cell><Data ss:Type="String">B</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">C</Data></Cell>
      <Cell><Data ss:Type="String">D</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">E</Data></Cell>
      <Cell><Data ss:Type="String">F</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">G</Data></Cell>
      <Cell><Data ss:Type="String">H</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook> 

12
आप एक .xml extensio के साथ फ़ाइल का नाम बदल सकते हैं और इसे जोड़ सकते हैं: <? mso-application progid = "Excel.Sheet"?> बस के बाद <? xml version = "1.0"?> एक्सेल फ़ाइल, इसे सही आइकन देगा, जब आप फ़ाइल पर क्लिक करेंगे तो एक्सेल खुल जाएगा और एक्सेल को यह शिकायत नहीं होगी कि फ़ाइल प्रारूप और सामग्री मेल नहीं खाते हैं। अलविदा।
pomarc

1
@pomarc इसका नकारात्मक पक्ष यह है कि एक्सेल फ़ाइलों को आयात करने वाले अन्य प्रोग्राम इसे पहचान नहीं पाएंगे। लेकिन फिर, वे शायद xml को पार्स नहीं करेंगे।
जोएल कोएहॉर्न

1
मैंने इस तकनीक का काफी सफलतापूर्वक उपयोग किया है। यह मेरी सिफारिश होगी - गंदगी सरल और बहुत प्रभावी।
NealB

एचटीएमएल सारणीबद्ध डेटा के साथ दो संभावित मुद्दों (वाईएमएमवी) को एक्सएलएस फाइल के रूप में मास्क किया गया है: (1) माइक्रोसॉफ्ट एक्सेल स्वचालित रूप से प्रमुख स्थानों और जीरो ट्रिम कर देगा; और (2) Microsoft Excel 2010 HTML सारणीबद्ध डेटा वाली XLS फ़ाइल खोलने पर उपयोगकर्ता को चेतावनी देता है। # 1 का समाधान creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel लगता है (यदि अग्रणी स्थान / शून्य महत्वपूर्ण हैं और इसे बनाए रखने की आवश्यकता है)।
इवविंस

स्पष्टीकरण के लिए, जबकि मैंने HTML तालिकाओं का उल्लेख किया था, इस उत्तर का मुख्य बिंदु स्प्रेडशीटएमएल है, जो कि केवल HTML टैब डेटा से अधिक है। एक्सेल इसे मूल के रूप में देखता है।
जोएल कोएहॉर्न

16

यदि एक DataTable से आ रहा है :

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

एक ग्रिड से :

public static void GridviewtoXLS(GridView gv, string fileName)
{
    int DirtyBit = 0;
    int PageSize = 0;
    if (gv.AllowPaging == true)
    {
        DirtyBit = 1;
        PageSize = gv.PageSize;
        gv.AllowPaging = false;
        gv.DataBind();
    }

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.Charset = "utf-8";
    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";

    using (StringWriter sw = new StringWriter())
    using (HtmlTextWriter htw = new HtmlTextWriter(sw))
    {
        //  Create a table to contain the grid
        Table table = new Table();

        //  include the gridline settings
        table.GridLines = gv.GridLines;

        //  add the header row to the table
        if (gv.HeaderRow != null)
        {
            Utilities.Export.PrepareControlForExport(gv.HeaderRow);
            table.Rows.Add(gv.HeaderRow);
        }

        //  add each of the data rows to the table
        foreach (GridViewRow row in gv.Rows)
        {
            Utilities.Export.PrepareControlForExport(row);
            table.Rows.Add(row);
        }

        //  add the footer row to the table
        if (gv.FooterRow != null)
        {
            Utilities.Export.PrepareControlForExport(gv.FooterRow);
            table.Rows.Add(gv.FooterRow);
        }

        //  render the table into the htmlwriter
        table.RenderControl(htw);

        //  render the htmlwriter into the response
        HttpContext.Current.Response.Write(sw.ToString().Replace("£", ""));
        HttpContext.Current.Response.End();
    }

    if (DirtyBit == 1)
    {
        gv.PageSize = PageSize;
        gv.AllowPaging = true;
        gv.DataBind();
    }
}

private static void PrepareControlForExport(Control control)
{
    for (int i = 0; i < control.Controls.Count; i++)
    {
        Control current = control.Controls[i];
        if (current is LinkButton)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
        }
        else if (current is ImageButton)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
        }
        else if (current is HyperLink)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
        }
        else if (current is DropDownList)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
        }
        else if (current is CheckBox)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
        }

        if (current.HasControls())
        {
            Utilities.Export.PrepareControlForExport(current);
        }
    }
}

1
बस मुझे जो कोड चाहिए, धन्यवाद। :)
काजेनसेन

स्कॉट, पाउंड ("पाउंड") चिह्न के साथ क्या है? अगर मुझे इसकी आवश्यकता है तो क्या होगा? कोई और किरदार जो खतरनाक हो?
पायोटर ओविसक

उत्तम। मुझे जिस चीज की जरूरत थी।
ब्रैड ब्रूस

£ चिन्ह वास्तव में सिर्फ एक चीज है जो मुझे अपने ग्राहकों के लिए चाहिए थी। आप इसे बाहर निकाल सकते हैं।
SpoiledTechie.com 19

एचटीएमएल सारणीबद्ध डेटा के साथ दो संभावित मुद्दों (वाईएमएमवी) को एक्सएलएस फाइल के रूप में मास्क किया गया है: (1) माइक्रोसॉफ्ट एक्सेल स्वचालित रूप से प्रमुख स्थानों और जीरो ट्रिम कर देगा; और (2) Microsoft Excel 2010 HTML सारणीबद्ध डेटा वाली XLS फ़ाइल खोलने पर उपयोगकर्ता को चेतावनी देता है। # 1 का समाधान creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel लगता है (यदि अग्रणी स्थान / शून्य महत्वपूर्ण हैं और इसे बनाए रखने की आवश्यकता है)। Microsoft Excel में खोले जाने पर CSV डेटा फ़ाइलें भी # 1 से पीड़ित होती हैं।
इवविंस

7

यह स्प्रेडमल के आसपास एक मुफ्त आवरण है - यह महान काम करता है।

http://www.carlosag.net/Tools/ExcelXmlWriter/


मैंने इसका भी उपयोग किया है - यह बहुत अच्छा है।
पॉल सार्ट

यह पुस्तकालय भी xls पढ़ने की अनुमति देता है?
एलेक्स

5

दिए गए उत्तरों के आधार पर, और सहकर्मियों के साथ परामर्श के आधार पर, यह प्रतीत होता है कि सबसे अच्छा समाधान या तो XML फ़ाइल या HTML तालिकाओं को उत्पन्न करना है और इसे अनुलग्नक के रूप में नीचे धकेलना है। मेरे सहकर्मियों द्वारा अनुशंसित एक बदलाव यह है कि डेटा (यानी HTML टेबल) सीधे रिस्पांस ऑब्जेक्ट को लिखा जा सकता है, इस प्रकार एक फाइल को लिखने की आवश्यकता को समाप्त कर देता है, जो अनुमतियों की समस्याओं के कारण परेशानी भरा हो सकता है, I / O ध्यान दें, और यह सुनिश्चित करना कि अनुसूचित शुद्धिकरण होता है।

यहां कोड का एक स्निपेट है ... मैंने अभी तक इसकी जांच नहीं की है, और मैंने सभी तथाकथित कोड की आपूर्ति नहीं की है, लेकिन मुझे लगता है कि यह अच्छी तरह से विचार का प्रतिनिधित्व करता है।

    Dim uiTable As HtmlTable = GetUiTable(groupedSumData)

    Response.Clear()

    Response.ContentType = "application/vnd.ms-excel"
    Response.AddHeader("Content-Disposition", String.Format("inline; filename=OSSummery{0:ddmmssf}.xls", DateTime.Now))

    Dim writer As New System.IO.StringWriter()
    Dim htmlWriter As New HtmlTextWriter(writer)
    uiTable.RenderControl(htmlWriter)
    Response.Write(writer.ToString)

    Response.End()

2
दान, आप सही रास्ते पर हैं। और मैं निश्चित रूप से HTML के लिए स्प्रेडशीट बीएमएल की सिफारिश करता हूं - भविष्य के लिए सांस लेने का कमरा, क्योंकि एचटीएमएल समर्थन निराशाजनक रूप से सीमित है। लेकिन एचटीएमएल, स्प्रेडशीट एमएलएम और ओपनएक्सएमएल के साथ, फ़ाइल का आकार बड़ा हो सकता है, और सर्वर द्वारा gzipped नहीं होगा। ओपनएक्सएमएल को अंदर कई फाइलों के साथ एक ज़िप कंटेनर की आवश्यकता होती है, और स्प्रेडशीट एमएलएमएल और एचटीएमएल दोनों डाउनलोड करने के लिए बहुत तेज़ हैं यदि आप उन्हें पहले ज़िप करते हैं और अनुलग्नक के रूप में ज़िप भेजते हैं। SharpZipLib का उपयोग करें और सीधे प्रतिक्रिया के बजाय इसे स्ट्रीम करें।
richardtallent

4

चूँकि एक्सेल HTML को समझता है, आप एक HTML फ़ाइल के रूप में डेटा को एक .xls एक्सटेंशन के साथ एक अस्थायी फ़ाइल में लिख सकते हैं, फ़ाइल के लिए FileInfo प्राप्त कर सकते हैं और इसका उपयोग करके वापस उड़ा सकते हैं।

Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + fi.Name);
Response.AddHeader("Content-Length", fi.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(fi.FullName);
Response.End();

यदि आप अस्थायी फ़ाइल से बचना चाहते हैं, तो आप इन-मेमोरी स्ट्रीम में लिख सकते हैं और राइटफ़ाइल का उपयोग करने के बजाय बाइट्स वापस लिख सकते हैं

यदि सामग्री-लंबाई शीर्ष लेख छोड़ा गया है, तो आप सीधे html वापस लिख सकते हैं, लेकिन यह सभी ब्राउज़रों में हर समय सही ढंग से काम नहीं कर सकता है


2
एचटीएमएल सारणीबद्ध डेटा के साथ दो संभावित मुद्दों (वाईएमएमवी) को एक्सएलएस फाइल के रूप में मास्क किया गया है: (1) माइक्रोसॉफ्ट एक्सेल स्वचालित रूप से प्रमुख स्थानों और जीरो ट्रिम कर देगा; और (2) Microsoft Excel 2010 HTML सारणीबद्ध डेटा वाली XLS फ़ाइल खोलने पर उपयोगकर्ता को चेतावनी देता है। # 1 का समाधान creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel लगता है (यदि अग्रणी स्थान / शून्य महत्वपूर्ण हैं और इसे बनाए रखने की आवश्यकता है)।
इकोविंस

3

मैं व्यक्तिगत रूप से XML विधि पसंद करता हूं। मैं डेटाबेस से डेटा डेटासेट में वापस कर दूँगा, इसे एक्सएमएल में सहेजें, फिर मैं एक xslt फ़ाइल बनाता हूं जिसमें एक परिवर्तन नियम होता है जो एक उचित दस्तावेज़ को प्रारूपित करेगा, और एक सरल XML परिवर्तन कार्य को पूरा करेगा। इसके बारे में सबसे अच्छा हिस्सा आप कोशिकाओं को प्रारूपित कर सकते हैं, सशर्त स्वरूपण, सेटअप हेडर और फुटर, और यहां तक ​​कि प्रिंट रेंज भी सेट कर सकते हैं।


2

मैंने इसे एक-दो बार किया है और हर बार सबसे आसान तरीका सीएसवी (कोमा सेपरेटेड वैल्यू) फाइल को वापस करना था। एक्सेल इसे पूरी तरह से आयात करता है, और यह करने के लिए अपेक्षाकृत तेज़ है।


CSV डेटा के साथ एक संभावित मुद्दा (YMMV): Microsoft Excel स्वचालित रूप से अग्रणी स्थान और शून्य को ट्रिम करेगा
i34vins

2

हम डेटा को हर समय एक्सेल करने के लिए निर्यात करते हैं। इसे HTML में परिवर्तित करना और फिर एक्सेल फाइल में लिखना

Response.ContentType = "application/vnd.ms-excel"
    Response.Charset = ""
    Response.AddHeader("content-disposition", "fileattachment;filename=YOURFILENAME.xls")
    Me.EnableViewState = False
    Dim sw As System.IO.StringWriter = New System.IO.StringWriter
    Dim hw As HtmlTextWriter = New HtmlTextWriter(sw)
    ClearControls(grid)
    grid.RenderControl(hw)
    Response.Write(sw.ToString())
    Response.End()

इस विधि के साथ एकमात्र गचा यह था कि हमारे बहुत से ग्रिड में बटन या लिंक थे, इसलिए आपको इसकी भी आवश्यकता है:

'needed to export grid to excel to remove link button control and represent as text
Private Sub ClearControls(ByVal control As Control)
    Dim i As Integer
    For i = control.Controls.Count - 1 To 0 Step -1
        ClearControls(control.Controls(i))
    Next i

    If TypeOf control Is System.Web.UI.WebControls.Image Then
        control.Parent.Controls.Remove(control)
    End If

    If (Not TypeOf control Is TableCell) Then
        If Not (control.GetType().GetProperty("SelectedItem") Is Nothing) Then
            Dim literal As New LiteralControl
            control.Parent.Controls.Add(literal)
            Try
                literal.Text = CStr(control.GetType().GetProperty("SelectedItem").GetValue(control, Nothing))
            Catch
            End Try
            control.Parent.Controls.Remove(control)
        Else
            If Not (control.GetType().GetProperty("Text") Is Nothing) Then
                Dim literal As New LiteralControl
                control.Parent.Controls.Add(literal)
                literal.Text = CStr(control.GetType().GetProperty("Text").GetValue(control, Nothing))
                control.Parent.Controls.Remove(control)
            End If
        End If
    End If
    Return
End Sub

मैंने पाया कि कहीं, यह अच्छी तरह से काम करता है।


2
एचटीएमएल सारणीबद्ध डेटा के साथ दो संभावित मुद्दों (वाईएमएमवी) को एक्सएलएस फाइल के रूप में मास्क किया गया है: (1) माइक्रोसॉफ्ट एक्सेल स्वचालित रूप से प्रमुख स्थानों और जीरो ट्रिम कर देगा; और (2) Microsoft Excel 2010 HTML सारणीबद्ध डेटा वाली XLS फ़ाइल खोलने पर उपयोगकर्ता को चेतावनी देता है। # 1 का समाधान creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel लगता है (यदि अग्रणी स्थान / शून्य महत्वपूर्ण हैं और इसे बनाए रखने की आवश्यकता है)।
इकॉविंस


2

यहां एक रिपोर्ट है जो एक संग्रहीत प्रक्रिया से खींचती है। परिणाम एक्सेल को निर्यात किए जाते हैं। यह ADO.NET के बजाय ADO का उपयोग करता है और इस लाइन का कारण है

oSheet.Cells(2, 1).copyfromrecordset(rst1)

यह अधिकांश काम करता है और ado.net में उपलब्ध नहीं है।

‘Calls stored proc in SQL Server 2000 and puts data in Excel and ‘formats it

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim cnn As ADODB.Connection
        cnn = New ADODB.Connection
        cnn.Open("Provider=SQLOLEDB;data source=xxxxxxx;" & _
          "database=xxxxxxxx;Trusted_Connection=yes;")

        Dim cmd As New ADODB.Command


        cmd.ActiveConnection = cnn


        cmd.CommandText = "[sp_TomTepley]"
        cmd.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc
        cmd.CommandTimeout = 0
        cmd.Parameters.Refresh()


        Dim rst1 As ADODB.Recordset
        rst1 = New ADODB.Recordset
        rst1.Open(cmd)

        Dim oXL As New Excel.Application
        Dim oWB As Excel.Workbook
        Dim oSheet As Excel.Worksheet

        'oXL = CreateObject("excel.application")
        oXL.Visible = True
        oWB = oXL.Workbooks.Add
        oSheet = oWB.ActiveSheet

        Dim Column As Integer
        Column = 1

        Dim fld As ADODB.Field
        For Each fld In rst1.Fields

            oXL.Workbooks(1).Worksheets(1).Cells(1, Column).Value = fld.Name
            oXL.Workbooks(1).Worksheets(1).cells(1, Column).Interior.ColorIndex = 15
            Column = Column + 1

        Next fld

        oXL.Workbooks(1).Worksheets(1).name = "Tom Tepley Report"
        oSheet.Cells(2, 1).copyfromrecordset(rst1)
        oXL.Workbooks(1).Worksheets(1).Cells.EntireColumn.AutoFit()


        oXL.Visible = True
        oXL.UserControl = True

        rst1 = Nothing

        cnn.Close()
        Beep()

    End Sub

1

यदि आप डेटा के साथ एक GridView भरते हैं तो आप एचटीएमएल स्वरूपित डेटा प्राप्त करने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं, लेकिन ब्राउज़र को इंगित करना एक उत्कृष्ट फ़ाइल है।

 Public Sub ExportToExcel(ByVal fileName As String, ByVal gv As GridView)

        HttpContext.Current.Response.Clear()
        HttpContext.Current.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName))
        HttpContext.Current.Response.ContentType = "application/ms-excel"

        Dim sw As StringWriter = New StringWriter
        Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
        Dim table As Table = New Table

        table.GridLines = gv.GridLines

        If (Not (gv.HeaderRow) Is Nothing) Then
            PrepareControlForExport(gv.HeaderRow)
            table.Rows.Add(gv.HeaderRow)
        End If

        For Each row As GridViewRow In gv.Rows
            PrepareControlForExport(row)
            table.Rows.Add(row)
        Next

        If (Not (gv.FooterRow) Is Nothing) Then
            PrepareControlForExport(gv.FooterRow)
            table.Rows.Add(gv.FooterRow)
        End If

        table.RenderControl(htw)

        HttpContext.Current.Response.Write(sw.ToString)
        HttpContext.Current.Response.End()

    End Sub


    Private Sub PrepareControlForExport(ByVal control As Control)

        Dim i As Integer = 0

        Do While (i < control.Controls.Count)

            Dim current As Control = control.Controls(i)

            If (TypeOf current Is LinkButton) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, LinkButton).Text))

            ElseIf (TypeOf current Is ImageButton) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, ImageButton).AlternateText))

            ElseIf (TypeOf current Is HyperLink) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, HyperLink).Text))

            ElseIf (TypeOf current Is DropDownList) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, DropDownList).SelectedItem.Text))

            ElseIf (TypeOf current Is CheckBox) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, CheckBox).Checked))

            End If

            If current.HasControls Then
                PrepareControlForExport(current)
            End If

            i = i + 1

        Loop

    End Sub

एचटीएमएल सारणीबद्ध डेटा के साथ दो संभावित मुद्दों (वाईएमएमवी) को एक्सएलएस फाइल के रूप में मास्क किया गया है: (1) माइक्रोसॉफ्ट एक्सेल स्वचालित रूप से प्रमुख स्थानों और जीरो ट्रिम कर देगा; और (2) Microsoft Excel 2010 HTML सारणीबद्ध डेटा वाली XLS फ़ाइल खोलने पर उपयोगकर्ता को चेतावनी देता है। # 1 का समाधान creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel लगता है (यदि अग्रणी स्थान / शून्य महत्वपूर्ण हैं और इसे बनाए रखने की आवश्यकता है)।
इवविंस

1

MicrosoftOffice.Interop नाम स्थान के माध्यम से COM इंटरॉप से ​​बचें। यह इतना धीमा और अविश्वसनीय और अस्थिर है। मर्दवादियों के लिए लागू नहीं है।


1

आप इस लाइब्रेरी का उपयोग करके अच्छी तरह से स्वरूपित एक्सेल फाइल बना सकते हैं, काफी आसानी से: http://officehelper.codeplex.com/documentation

Microsoft Office को वेबसर्वर पर स्थापित करने की आवश्यकता नहीं है!


0

सीएसवी सबसे आसान तरीका है। ज्यादातर समय यह एक्सेल से जुड़ा होता है। अन्यथा आपको स्वचालन एपीआई या एक्सएमएल प्रारूप का उपयोग करना होगा। एपीआई और एक्सएमएल का उपयोग करना मुश्किल नहीं है।

एक्सेल के लिए XML उत्पन्न करने के बारे में जानकारी


0

मैं या तो CSV मार्ग जाता हूं (जैसा कि ऊपर वर्णित है), या अधिक बार इन दिनों, मैं फ़ाइल उत्पन्न करने के लिए Infragistics NetAdvantage का उपयोग करता हूं। (उस समय का बहुत बड़ा हिस्सा, जहां Infragistics खेल में है, हम सिर्फ एक मौजूदा UltraWebGrid का निर्यात कर रहे हैं, जो अनिवार्य रूप से एक-LOC समाधान है, जब तक कि अतिरिक्त स्वरूपण वाले ट्वीक्स की आवश्यकता न हो। हम मैन्युअल रूप से Excel / BIFF फ़ाइल भी बना सकते हैं। लेकिन वहाँ शायद ही कभी की जरूरत है।)


0

यार, .net में मुझे लगता है कि आपके पास एक घटक हो सकता है जो ऐसा कर सकता है, लेकिन क्लासिक एस्प में मैंने पहले ही इसे एक html तालिका बनाने और पृष्ठ के माइम को बदलने के लिए vnd / msexcel में बदल दिया है। मुझे लगता है कि यदि आप एक ग्रिडव्यू का उपयोग करते हैं और माइम प्रकार को बदलते हैं तो शायद यह काम करना चाहिए, क्योंकि ग्रिडव्यू एक html तालिका है।


एचटीएमएल सारणीबद्ध डेटा के साथ दो संभावित मुद्दों (वाईएमएमवी) को एक्सएलएस फाइल के रूप में मास्क किया गया है: (1) माइक्रोसॉफ्ट एक्सेल स्वचालित रूप से प्रमुख स्थानों और जीरो ट्रिम कर देगा; और (2) Microsoft Excel 2010 HTML सारणीबद्ध डेटा वाली XLS फ़ाइल खोलने पर उपयोगकर्ता को चेतावनी देता है। # 1 का समाधान creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel लगता है (यदि अग्रणी स्थान / शून्य महत्वपूर्ण हैं और इसे बनाए रखने की आवश्यकता है)।
इकोविंस

0

बचने का एकमात्र बुलेटप्रूफ तरीका "यह दिखता है कि ये संख्याएं पाठ के रूप में संग्रहीत हैं" ग्रीन त्रिकोण ओपन एक्सएमएल प्रारूप का उपयोग करना है। यह अपरिहार्य हरे त्रिकोणों से बचने के लिए, इसका उपयोग करने के लायक है।


0

एक्सेल रिपोर्ट के लिए मैंने जो सबसे अच्छा तरीका देखा है, वह यह है कि एक्सएमएल एक्सटेंशन के साथ एक्सएमएल में डेटा को लिखना और उसे सही कंटेंट टाइप के साथ ग्राहकों तक पहुंचाना। (आवेदन / xls)

यह किसी भी रिपोर्ट के लिए काम करता है जिसके लिए बुनियादी तैयार करने की आवश्यकता होती है, और आपको पाठ की तुलना करने वाले टूल का उपयोग करके मौजूदा स्प्रैडशीट से तुलना करने की अनुमति देता है।


0

यह मानते हुए कि यह एक इंट्रानेट के लिए है, जहां आप अनुमतियां सेट कर सकते हैं और IE को जनादेश दे सकते हैं, आप वर्कबुक क्लाइंट साइड को JScript / VBScript ड्राइविंग एक्सेल के साथ जनरेट कर सकते हैं । यह आपको सर्वर पर एक्सेल को स्वचालित करने की कोशिश के बिना देशी एक्सेल फॉर्मेटिंग देता है।

मुझे यकीन नहीं है कि मैं वास्तव में इस दृष्टिकोण को अभी भी काफी आला परिदृश्यों को छोड़कर सुझाऊंगा, लेकिन क्लासिक एएसपी के दिनों के दौरान यह काफी सामान्य था।


0

आप निश्चित रूप से हमेशा तीसरे पक्ष के घटकों के लिए जा सकते हैं। व्यक्तिगत रूप से, मुझे Spire.XLS http://www.e-iceblue.com/xls/xlsintro.htm के साथ एक अच्छा अनुभव मिला है

घटक आपके आवेदन के भीतर उपयोग करने के लिए बहुत आसान है:

        Workbook workbook = new Workbook();

        //Load workbook from disk.
        workbook.LoadFromFile(@"Data\EditSheetSample.xls");
        //Initailize worksheet
        Worksheet sheet = workbook.Worksheets[0];

        //Writes string
        sheet.Range["B1"].Text = "Hello,World!";
        //Writes number
        sheet.Range["B2"].NumberValue = 1234.5678;
        //Writes date
        sheet.Range["B3"].DateTimeValue = System.DateTime.Now;
        //Writes formula
        sheet.Range["B4"].Formula = "=1111*11111";

        workbook.SaveToFile("Sample.xls");

0

उन समस्याओं में से एक जिसका मैंने ऊपर सुझाए गए समाधानों में से एक का उपयोग करके चलाया है, जो इस उत्तर के समान है कि यदि आप सामग्री को अनुलग्नक के रूप में बाहर धकेलते हैं (जो मैंने गैर-एमएस ब्राउज़र के लिए सबसे साफ समाधान पाया है) , फिर इसे एक्सेल 2000-2003 में खोलें, इसका प्रकार एक "एक्सेल वेब पेज" है, न कि देशी एक्सेल डॉक्यूमेंट।

फिर आपको उपयोगकर्ताओं को यह समझाना होगा कि एक्सेल के भीतर "Save as type" का उपयोग करके इसे एक्सेल डॉक्यूमेंट में कैसे बदलें। यह एक दर्द है अगर उपयोगकर्ताओं को इस दस्तावेज़ को संपादित करने की आवश्यकता है और फिर इसे अपनी साइट पर पुनः अपलोड करें।

मेरी सिफारिश सीएसवी का उपयोग करने की है। यह सरल है और अगर उपयोगकर्ता इसे एक्सेल के भीतर से खोलते हैं, तो एक्सेल कम से कम उन्हें इसके मूल प्रारूप में इसे बचाने के लिए संकेत देता है।


यदि आपके उपयोगकर्ता दुनिया भर में बिखरे हुए हैं तो आपको CSV से सावधान रहने की आवश्यकता होगी। यहाँ जर्मनी में अल्पविराम का उपयोग दशमलव विभाजक के रूप में किया जाता है और इसलिए अर्धविराम का उपयोग मूल्य विभाजक के रूप में किया जाता है। एक ऐसी फाइल बनाना मुश्किल है जो सभी विभिन्न संस्कृतियों में पढ़ने योग्य हो। इसलिए मेरा वोट XML प्रारूपों में से एक के लिए होगा।
पॉल

0

मैं सिर्फ डेटा के आधार पर एक CSV फ़ाइल बनाऊंगा, क्योंकि मैं देख रहा हूं कि सबसे साफ और एक्सेल के पास इसके लिए अच्छा समर्थन है। लेकिन अगर आपको अधिक लचीले प्रारूप की आवश्यकता है, तो मुझे यकीन है कि असली एक्सेल फाइल बनाने के लिए कुछ 3 पार्टी उपकरण हैं।


0

यहाँ एक समाधान एक CSV के रूप में बाहर निकलने योग्य स्ट्रीम करता है। तेज, स्वच्छ और आसान, और यह इनपुट में कॉमा को संभालता है।

public static void ExportToExcel(DataTable data, HttpResponse response, string fileName)
{
    response.Charset = "utf-8";
    response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
    response.Cache.SetCacheability(HttpCacheability.NoCache);
    response.ContentType = "text/csv";
    response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);

    for (int i = 0; i < data.Columns.Count; i++)
    {
       response.Write(data.Columns[i].ColumnName);
       response.Write(i == data.Columns.Count - 1 ? "\n" : ",");
    }        
    foreach (DataRow row in data.Rows)
    {
        for (int i = 0; i < data.Columns.Count; i++)
        {
            response.Write(String.Format("\"{0}\"", row[i].ToString()));
            response.Write(i == data.Columns.Count - 1 ? "\n" : ",");
        }
    }

    response.End();
}

-1

एक वेब फ़ॉर्म C # से निर्यात करने के लिए एक फ़ंक्शन बनाया गया ताकि वह दूसरों की मदद कर सके

    public void ExportFileFromSPData(string filename, DataTable dt)
    {
        HttpResponse response = HttpContext.Current.Response;

        //clean up the response.object
        response.Clear();
        response.Buffer = true;
        response.Charset = "";

        // set the response mime type for html so you can see what are you printing 
        //response.ContentType = "text/html";
        //response.AddHeader("Content-Disposition", "attachment;filename=test.html");

        // set the response mime type for excel
        response.ContentType = "application/vnd.ms-excel";
        response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
        response.ContentEncoding = System.Text.Encoding.UTF8;
        response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());

        //style to format numbers to string
        string style = @"<style> .text { mso-number-format:\@; } </style>";
        response.Write(style);

        // create a string writer
        using (StringWriter sw = new StringWriter())
        {
            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            {
                // instantiate a datagrid
                GridView dg = new GridView();
                dg.DataSource = dt;
                dg.DataBind();

                foreach (GridViewRow datarow in dg.Rows)
                {
                    //format specific cell to be text 
                    //to avoid 1.232323+E29 to get 1232312312312312124124
                    datarow.Cells[0].Attributes.Add("class", "text");
                }

                dg.RenderControl(htw);
                response.Write(sw.ToString());
                response.End();
            }
        }
     }

-5

यदि आपको CSV फ़ाइल के बजाय Excel का उपयोग करना है, तो आपको एक सर्वर से Excel उदाहरण पर OLE स्वचालन का उपयोग करना होगा। ऐसा करने का सबसे आसान तरीका एक टेम्पलेट फ़ाइल है और इसे डेटा के साथ प्रोग्रामेटिक रूप से भरना है। आप इसे किसी अन्य फ़ाइल में सहेजते हैं।

सुझाव:

  • अंतःक्रियात्मक रूप से मत करो। उपयोगकर्ता प्रक्रिया को बंद कर दें और फिर फ़ाइल के लिंक के साथ एक पृष्ठ पोस्ट करें। यह स्प्रेडशीट उत्पन्न होने पर संभावित प्रदर्शन समस्याओं को कम करता है।
  • पहले बताए अनुसार टेम्प्लेट का उपयोग करें। यह इसे संशोधित करना आसान बनाता है।
  • सुनिश्चित करें कि एक्सेल संवाद को पॉप अप नहीं करने के लिए सेट है। एक वेब सर्वर पर यह पूरे एक्सेल उदाहरण को लटका देगा।
  • एक्सेल उदाहरण को एक अलग सर्वर पर रखें, अधिमानतः एक फ़ायरवॉल के पीछे, इसलिए इसे संभावित सुरक्षा छेद के रूप में उजागर नहीं किया गया है।
  • संसाधन के उपयोग पर नज़र रखें। OLE स्वचालन इंटरफ़ेस (PIA के सिर्फ इस पर शिमर्स हैं) पर एक स्प्रेडशीट बनाना एक काफी हेवीवेट प्रक्रिया है। यदि आपको इसे उच्च डेटा संस्करणों में स्केल करने की आवश्यकता है, तो आपको अपनी वास्तुकला के साथ कुछ हद तक चतुर होने की आवश्यकता हो सकती है।

'माइम-टाइप टू ट्रिक एक्सेल टू ट्रिक एक्सेल इन ओपनिंग HTML टेबल' एप्रोच काम करेंगे अगर आपको फाइल के फॉर्मेट को थोड़ा बेसिक नहीं लगता है। ये एप्रोच क्लाइंट पर सीपीयू के भारी काम को रोकते हैं। यदि आप स्प्रेडशीट के प्रारूप पर ठीक-ठीक नियंत्रण चाहते हैं, तो आपको संभवतः ऊपर बताए अनुसार फ़ाइल बनाने के लिए एक्सेल का उपयोग करना होगा।


एक वेब सर्वर से ऑटोमेशन करने का बुरा विचार। विकल्प हैक-ईश लग सकते हैं, लेकिन वे वास्तव में बहुत बेहतर काम करेंगे।
जोएल कोएहॉर्न

हम एक्सेल के साथ सर्वर-साइड OLE का उपयोग करते हैं और यह बैकसाइड में बहुत बड़ा दर्द है। यदि यह हमारे उत्पाद के लिए जोखिम नहीं थे **, हम एक और समाधान के साथ जाना होगा। ** बेहतर शैतान आप जानते हैं ...
डेवई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.