c# - सी#से एक्सेल(.XLS और.XLSX)फ़ाइल बनाएं




.net excel file-io (25)

विभिन्न एक्सेल फाइलों के लिए विभिन्न कार्यालय 2003 एक्सएमएल पुस्तकालय उपलब्ध हैं। हालांकि, मुझे एक समस्या होने के लिए XML प्रारूप में सहेजी गई एक बड़ी कार्यपुस्तिका का आकार मिलता है। उदाहरण के लिए, मैं जिस वर्कबुक के साथ काम करता हूं वह नए में 40 एमबी होगा (और स्वीकार्य रूप से अधिक कसकर पैक किया गया है) एक्सएलएसएक्स प्रारूप 360 एमबी एक्सएमएल फाइल बन जाता है।

जहां तक ​​मेरे शोध ने मुझे लिया है, वहां दो वाणिज्यिक पैकेज हैं जो पुराने बाइनरी फ़ाइल स्वरूपों को आउटपुट की अनुमति देते हैं। वो हैं:

न तो सस्ते (500USD और 800USD क्रमशः, मुझे लगता है)। लेकिन दोनों ही एक्सेल के स्वतंत्र हैं।

OpenOffice.org की पसंद के लिए एक्सेल आउटपुट मॉड्यूल के बारे में मैं उत्सुक हूं। मुझे आश्चर्य है कि क्या उन्हें जावा से .NET तक पोर्ट किया जा सकता है।

मैं कोड चला रहे मशीन पर एक्सेल स्थापित करने के बिना सी # के साथ एक्सेल स्प्रेडशीट कैसे बना सकता हूं?



सी # से एक्सेल फ़ाइल बनाने का सबसे आसान और तेज़ तरीका ओपन एक्सएमएल उत्पादकता उपकरण का उपयोग करना है। ओपन एक्सएमएल उत्पादकता उपकरण ओपन एक्सएमएल एसडीके स्थापना के साथ आता है। टूल रिवर्स इंजीनियरों को सी # कोड में किसी एक्सेल फ़ाइल को इंजीनियर करता है। तब सी # कोड का उपयोग उस फ़ाइल को फिर से उत्पन्न करने के लिए किया जा सकता है।

शामिल प्रक्रिया का एक सिंहावलोकन है:

  1. उपकरण के साथ ओपन एक्सएमएल एसडीके स्थापित करें।
  2. वांछित देखो के साथ नवीनतम एक्सेल क्लाइंट का उपयोग कर एक एक्सेल फ़ाइल बनाएँ। इसे DesiredLook.xlsx नाम दें।
  3. टूल के साथ DesiredLook.xlsx खोलें और शीर्ष के पास प्रतिबिंब कोड बटन पर क्लिक करें।
  4. आपकी फ़ाइल के लिए सी # कोड टूल के दाएं फलक में जेनरेट किया जाएगा। इसे अपने सी # समाधान में जोड़ें और वांछित रूप से फाइलें उत्पन्न करें।

बोनस के रूप में, यह विधि किसी भी वर्ड और पावरपॉइंट फ़ाइलों के लिए काम करती है। सी # डेवलपर के रूप में, फिर आप अपनी आवश्यकताओं के अनुरूप कोड में परिवर्तन करेंगे।

मैंने जिथब पर एक साधारण WPF ऐप विकसित किया है जो इस उद्देश्य के लिए विंडोज पर चलाएगा। GeneratedClass क्लास नामक प्लेसहोल्डर क्लास है जहां आप जेनरेट कोड को पेस्ट कर सकते हैं। यदि आप फ़ाइल के एक संस्करण को वापस जाते हैं, तो यह इस तरह एक एक्सेल फ़ाइल उत्पन्न करेगा:


public class GridViewExportUtil
{
    public static void Export(string fileName, GridView gv)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader(
            "content-disposition", string.Format("attachment; filename={0}", fileName));
        HttpContext.Current.Response.ContentType = "application/ms-excel";

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

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

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

                //  add the footer row to the table
                if (gv.FooterRow != null)
                {
                    GridViewExportUtil.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());
                HttpContext.Current.Response.End();
            }
        }
    }

    /// <summary>
    /// Replace any of the contained controls with literals
    /// </summary>
    /// <param name="control"></param>
    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())
            {
                GridViewExportUtil.PrepareControlForExport(current);
            }
        }
    }
}

हाय यह समाधान आपके ग्रिड व्यू को अपनी एक्सेल फ़ाइल में निर्यात करना है, यह आपकी मदद कर सकता है


LINQ से एक्सएमएल के साथ ऐसा करने का एक तरीका यहां है, नमूना कोड के साथ पूरा करें:

एक्सेल डेटा को LINQ से एक्सएमएल के साथ त्वरित रूप से आयात और निर्यात करें

यह थोड़ा जटिल है, क्योंकि आपको नेमस्पेस आयात करना है और आगे भी, लेकिन यह आपको किसी बाहरी निर्भरता से बचने देता है।

(इसके अलावा, ज़ाहिर है, यह वीबी .NET है, सी # नहीं, लेकिन आप एक्सएमएल लिटलल्स का उपयोग करने के लिए हमेशा अपनी परियोजना में वीबी .NET सामान को अलग कर सकते हैं, और सी # में सब कुछ कर सकते हैं।)


मैंने उपयोग किए गए कुछ विकल्प:

यदि एक्सएलएसएक्स जरूरी है: ExcelPackage एक अच्छी शुरुआत है लेकिन डेवलपर इस पर काम करना छोड़ने पर मर गया। एक्सएमएल ने वहां से उठाया और कुछ विशेषताओं को जोड़ा। ExML एक बुरा विकल्प नहीं है, मैं अभी भी इसे दो उत्पादन वेबसाइटों में उपयोग कर रहा हूं।

मेरी सभी नई परियोजनाओं के लिए, हालांकि, मैं अपाचे पीओआई के .NET पोर्ट, NPOI का उपयोग कर रहा हूं। एनपीओआई 2.0 (अल्फा) एक्सएलएसएक्स का भी समर्थन करता है।


क्या आपने कभी sylk कोशिश की है?

हम क्लासिक एएसपी में एक्सेलशीट्स को सिल्क के रूप में उत्पन्न करते थे और अभी हम एक्सेलजेनरेटर की खोज भी कर रहे हैं।

Sylk के फायदे हैं, आप कोशिकाओं को प्रारूपित कर सकते हैं।


वाणिज्यिक समाधान, .NET के लिए स्प्रेडशीट गियर यह करेगा।

आप यहां लाइव एएसपी.नेट (सी # और वीबी) नमूने देख सकते हैं और here एक मूल्यांकन संस्करण डाउनलोड कर सकते here

अस्वीकरण: मेरे पास स्प्रेडशीट गियर एलएलसी है


आप वास्तव में इंटरऑप कक्षाओं को देखना चाह सकते हैं। आप ओएलई नहीं कहते हैं (जो यह नहीं है), लेकिन इंटरऑप कक्षाओं का उपयोग करना बहुत आसान है।

यदि आपने उन्हें आजमाया नहीं है तो आप प्रभावित हो सकते हैं।

कृपया माइक्रोसॉफ्ट के इस stance पर चेतावनी stance :

माइक्रोसॉफ्ट वर्तमान में किसी भी अप्रत्याशित, गैर-इंटरैक्टिव क्लाइंट एप्लिकेशन या घटक (एएसपी, एएसपी.नेट, डीसीओएम, और एनटी सेवाओं सहित) से माइक्रोसॉफ़्ट ऑफिस अनुप्रयोगों के स्वचालन की अनुशंसा नहीं करता है, और समर्थन नहीं करता है, क्योंकि कार्यालय अस्थिर व्यवहार प्रदर्शित कर सकता है और / या जब इस माहौल में कार्यालय चलाया जाता है तो डेडलॉक।


आप Excel फ़ाइलों को बनाने और कुशल बनाने के लिए OLEDB का उपयोग कर सकते हैं। इसे जांचें: OLEDB का उपयोग कर Excel पढ़ना और लिखना

विशिष्ट उदाहरण:

using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'"))
{
  conn.Open();
  OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn);
  cmd.ExecuteNonQuery();
}

संपादित करें - कुछ और लिंक:


आप ExcelLibrary नामक लाइब्रेरी का उपयोग कर सकते हैं। यह Google कोड पर पोस्ट की गई एक निःशुल्क, मुक्त स्रोत लाइब्रेरी है:

ExcelLibrary

यह ऊपर वर्णित PHP ExcelWriter का एक बंदरगाह दिखता है। यह अभी तक नए .xlsx प्रारूप में नहीं लिखा जाएगा, लेकिन वे उस कार्यक्षमता को जोड़ने पर काम कर रहे हैं।

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

एक्सेल लाइब्रेरी अभी भी पुराने एक्सेल प्रारूप (.xls फ़ाइलों) के लिए काम करता है, लेकिन भविष्य में नए 2007/2010 स्वरूपों के लिए भविष्य में समर्थन जोड़ रहा है।

आप EPPlus भी उपयोग कर सकते हैं, जो केवल Excel 2007/2010 प्रारूप फ़ाइलों (.xlsx फ़ाइलों) के लिए काम करता है।

टिप्पणियों में उल्लिखित प्रत्येक लाइब्रेरी के साथ कुछ ज्ञात बग हैं। बिलकुल समय के साथ, ईपीप्लस सबसे अच्छा विकल्प प्रतीत होता है। ऐसा लगता है कि यह अधिक सक्रिय रूप से अद्यतन और दस्तावेज भी है।

इसके अलावा, जैसा कि नीचे @ АртёмЦарионов द्वारा नोट किया गया है, ईपीप्लस के पास पिवोट टेबल्स के लिए समर्थन है और एक्सेल लाइब्रेरी में कुछ समर्थन हो सकता है ( ExcelLibrary में पिवट तालिका समस्या )

त्वरित संदर्भ के लिए यहां कुछ लिंक दिए गए हैं:
ExcelLibrary - जीएनयू कम जीपीएल
EPPlus - जीएनयू लेसर जनरल पब्लिक लाइसेंस (एलजीपीएल)

ExcelLibrary के लिए यहां कुछ उदाहरण कोड:

डेटाबेस से डेटा लेने और उससे कार्यपुस्तिका बनाने का एक उदाहरण यहां दिया गया है। ध्यान दें कि ExcelLibrary कोड नीचे एक पंक्ति है:

//Create the data set and table
DataSet ds = new DataSet("New_DataSet");
DataTable dt = new DataTable("New_DataTable");

//Set the locale for each
ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;

//Open a DB connection (in this example with OleDB)
OleDbConnection con = new OleDbConnection(dbConnectionString);
con.Open();

//Create a query and fill the data table with the data from the DB
string sql = "SELECT Whatever FROM MyDBTable;";
OleDbCommand cmd = new OleDbCommand(sql, con);
OleDbDataAdapter adptr = new OleDbDataAdapter();

adptr.SelectCommand = cmd;
adptr.Fill(dt);
con.Close();

//Add the table to the data set
ds.Tables.Add(dt);

//Here's the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);

एक्सेल फ़ाइल बनाना उतना आसान है जितना। आप एक्सेल फ़ाइलों को मैन्युअल रूप से भी बना सकते हैं, लेकिन उपर्युक्त कार्यक्षमता वास्तव में मुझे प्रभावित करती है।


यहां एक पूरी तरह से निशुल्क सी # लाइब्रेरी है, जो आपको ओपनएक्सएमएल पुस्तकालयों का उपयोग करके DataSet , DataTable या List<> को एक वास्तविक एक्सेल 2007 .xlsx फ़ाइल में निर्यात करने देती है:

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

पूर्ण स्रोत कोड प्रदान किया जाता है - नि: शुल्क - निर्देशों के साथ, और एक डेमो आवेदन।

इस कक्षा को अपने आवेदन में जोड़ने के बाद, आप अपने डेटासेट को एक्सेल में कोड की केवल एक पंक्ति में निर्यात कर सकते हैं:

CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");

यह उससे ज्यादा आसान नहीं है ...

और यह आपके सर्वर पर एक्सेल को उपस्थित होने की भी आवश्यकता नहीं है।


ओपनएक्सएमएल भी एक अच्छा विकल्प है जो सर्वर पर एमएस एक्सेल स्थापित करने से बचने में मदद करता है। माइक्रोसॉफ्ट द्वारा प्रदान किया गया ओपन एक्सएमएल एसडीके 2.0 ओपन एक्सएमएल पैकेज और अंतर्निहित ओपन एक्सएमएल स्कीमा तत्वों को पैकेज के अंदर जोड़ना आसान बनाता है। ओपन एक्सएमएल एप्लीकेशन प्रोग्रामिंग इंटरफेस (एपीआई) कई सामान्य कार्यों को समाहित करता है जो डेवलपर्स ओपन एक्सएमएल पैकेज पर प्रदर्शन करते हैं।

इसे ओपनएक्सएमएल देखें: वैकल्पिक जो सर्वर पर एमएस एक्सेल स्थापित करने से बचने में मदद करता है


इंफ्राजिस्टिक्स या सिंकफ्यूजन जैसे कुछ तृतीय पक्ष घटक विक्रेता बहुत अच्छी एक्सेल निर्यात क्षमताओं को प्रदान करते हैं जिन्हें माइक्रोसॉफ्ट एक्सेल को स्थापित करने की आवश्यकता नहीं होती है।

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

यदि आपका निर्यात निर्यात किए जाने वाले डेटा पर जोर देने के साथ सर्वर पक्ष को निष्पादित करने का इरादा है और यूआई के लिए कोई लिंक नहीं है, तो मैं एक मुक्त ओपन सोर्स विकल्प (जैसे एक्सेल लाइब्रेरी) के लिए जाऊंगा।

मैं पहले उन परियोजनाओं से जुड़ा हुआ हूं जिन्होंने माइक्रोसॉफ़्ट ऑफिस सूट पर सर्वर साइड ऑटोमेशन का उपयोग करने का प्रयास किया था। इस अनुभव के आधार पर मैं उस दृष्टिकोण के खिलाफ दृढ़ता से अनुशंसा करता हूं।


IKVM + पीओआई

या, आप इंटरऑप का उपयोग कर सकते हैं ...


आप http://www.gemboxsoftware.com/GBSpreadsheetFree.htm पर एक नज़र डालना चाहते हैं।

उनके पास सभी सुविधाओं के साथ एक मुफ्त संस्करण है, लेकिन प्रति पंक्ति 150 पंक्तियों तक सीमित है और प्रति कार्यशालाओं में 5 चादरें हैं, यदि यह आपकी आवश्यकताओं के भीतर आती है।

मुझे अभी तक इसका उपयोग करने की आवश्यकता नहीं है, लेकिन दिलचस्प लग रहा है।


मैं एक्सएमएल स्प्रेडशीट्स उत्पन्न करने के बारे में सहमत हूं, यहां एक उदाहरण है कि इसे सी # 3 के लिए कैसे किया जाए (हर कोई सिर्फ वीबी 9: पी में इसके बारे में ब्लॉग करता है) http://www.aaron-powell.com/linq-to-xml-to-excel


मैंने अभी हाल ही में FlexCel.NET उपयोग किया है और इसे एक उत्कृष्ट पुस्तकालय के रूप में पाया है! मैं यह नहीं कहता कि बहुत सारे सॉफ्टवेयर उत्पादों के बारे में। यहां पूरी बिक्री पिच देने में कोई बात नहीं है, आप अपनी वेबसाइट पर सभी सुविधाओं को पढ़ सकते हैं।

यह एक वाणिज्यिक उत्पाद है, लेकिन यदि आप इसे खरीदते हैं तो आपको पूरा स्रोत मिलता है। तो मुझे लगता है कि यदि आप वास्तव में चाहते थे तो आप इसे अपनी असेंबली में संकलित कर सकते हैं। अन्यथा यह xcopy के लिए सिर्फ एक अतिरिक्त असेंबली है - कोई कॉन्फ़िगरेशन या इंस्टॉलेशन या ऐसा कुछ भी नहीं।

मुझे नहीं लगता कि आपको तीसरे पक्ष के पुस्तकालयों के बिना ऐसा करने का कोई तरीका मिलेगा क्योंकि .NET ढांचे, स्पष्ट रूप से, इसके लिए समर्थन में नहीं बनाया गया है और ओएलई स्वचालन केवल दर्द की पूरी दुनिया है।



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

मुझे एहसास है कि आप इसे वेब अनुप्रयोग में कोड नहीं कर रहे हैं, लेकिन यहां एक HTML फ़ाइल के माध्यम से एक्सेल फ़ाइल की संरचना का एक example है। यदि आप कंसोल ऐप, डेस्कटॉप ऐप या सेवा कोडिंग कर रहे थे तो इस तकनीक का उपयोग किया जा सकता था।



और माइक्रोसॉफ्ट ऑफिस के लिए ओपन एक्सएमएल एसडीके 2.0 का उपयोग करने के बारे में क्या?

कुछ लाभ:

  • कार्यालय स्थापित करने की आवश्यकता नहीं है
  • माइक्रोसॉफ्ट = सभ्य एमएसडीएन दस्तावेज द्वारा बनाया गया
  • परियोजना में उपयोग करने के लिए बस एक .NET डीएलएल
  • एसडीके कई उपकरणों जैसे diff, validator, आदि के साथ आता है

लिंक:


बस किसी तीसरे पक्ष के समाधान में एक और संदर्भ जोड़ना चाहते हैं जो सीधे आपके मुद्दे को संबोधित करता है: http://www.officewriter.com

(अस्वीकरण: मैं सॉफ़्टआर्टिसन के लिए काम करता हूं, वह कंपनी जो OfficeWriter बनाती है)


सिंकफ्यूजन आवश्यक XlsIO यह कर सकता है। माइक्रोसॉफ्ट ऑफिस पर इसकी कोई निर्भरता नहीं है और विभिन्न प्लेटफार्मों के लिए भी विशिष्ट समर्थन है।

कोड नमूना:

//Creates a new instance for ExcelEngine.
ExcelEngine excelEngine = new ExcelEngine();
//Loads or open an existing workbook through Open method of IWorkbooks
IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName);
//To-Do some manipulation|
//To-Do some manipulation
//Set the version of the workbook.
workbook.Version = ExcelVersion.Excel2013;
//Save the workbook in file system as xlsx format
workbook.SaveAs(outputFileName);

यदि आप अर्हता प्राप्त करते हैं (राजस्व में 1 मिलियन अमरीकी डालर से कम) तो नियंत्रण के पूरे सूट समुदाय लाइसेंस कार्यक्रम के माध्यम से मुफ्त में उपलब्ध है। नोट: मैं सिंकफ्यूजन के लिए काम करता हूं।


If you really want a copy of the underlying bytes of a string, you can use a function like the one that follows. However, you shouldn't please read on to find out why.

[DllImport(
        "msvcrt.dll",
        EntryPoint = "memcpy",
        CallingConvention = CallingConvention.Cdecl,
        SetLastError = false)]
private static extern unsafe void* UnsafeMemoryCopy(
    void* destination,
    void* source,
    uint count);

public static byte[] GetUnderlyingBytes(string source)
{
    var length = source.Length * sizeof(char);
    var result = new byte[length];
    unsafe
    {
        fixed (char* firstSourceChar = source)
        fixed (byte* firstDestination = result)
        {
            var firstSource = (byte*)firstSourceChar;
            UnsafeMemoryCopy(
                firstDestination,
                firstSource,
                (uint)length);
        }
    }

    return result;
}

This function will get you a copy of the bytes underlying your string, pretty quickly. You'll get those bytes in whatever way they are encoding on your system. This encoding is almost certainly UTF-16LE but that is an implementation detail you shouldn't have to care about.

It would be safer, simpler and more reliable to just call,

System.Text.Encoding.Unicode.GetBytes()

In all likelihood this will give the same result, is easier to type, and the bytes will always round-trip with a call to

System.Text.Encoding.Unicode.GetString()




c# .net excel file-io