ฉันจะสร้างสเปรดชีต Excel ด้วย C # โดยไม่ต้องติดตั้ง Excel บนเครื่องที่ใช้โค้ดได้อย่างไร

ตอบ

คุณสามารถใช้ไลบรารีที่เรียกว่า ExcelLibrary เป็นห้องสมุดโอเพ่นซอร์สฟรีที่โพสต์บน Google Code:

ExcelLibrary

นี่ดูเหมือนจะเป็นพอร์ตของ PHP ExcelWriter ที่คุณกล่าวถึงข้างต้น มันจะยังไม่เขียนลงในรูปแบบ .xlsx ใหม่ แต่พวกเขากำลังดำเนินการเพิ่มฟังก์ชันนั้นเข้าไป

มันง่ายมาก เล็ก และใช้งานง่าย นอกจากนี้ยังมี DataSetHelper ที่ช่วยให้คุณใช้ DataSets และ DataTables เพื่อทำงานกับข้อมูล Excel ได้อย่างง่ายดาย

ดูเหมือนว่า ExcelLibrary จะยังใช้งานได้กับรูปแบบ Excel รุ่นเก่า (ไฟล์ .xls) เท่านั้น แต่อาจเพิ่มการสนับสนุนสำหรับรูปแบบ 2007/2010 ที่ใหม่กว่าในอนาคต

คุณยังสามารถใช้EPPlusซึ่งใช้ได้กับไฟล์รูปแบบ Excel 2007/2010 (ไฟล์ .xlsx) เท่านั้น นอกจากนี้ยังมีNPOIที่ใช้งานได้ทั้งสองอย่าง

มีข้อบกพร่องบางประการที่ทราบกันในแต่ละไลบรารีตามที่ระบุไว้ในความคิดเห็น โดยรวมแล้ว EPPlus ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุดเมื่อเวลาผ่านไป ดูเหมือนว่าจะมีการปรับปรุงและจัดทำเอกสารมากขึ้นเช่นกัน

นอกจากนี้ ตามที่ระบุโดย @АртёмЦарионов ด้านล่าง EPPlus รองรับ Pivot Tables และ ExcelLibrary อาจมีการสนับสนุนบางอย่าง ( ปัญหาตาราง Pivot ใน ExcelLibrary )

นี่คือลิงค์สองสามลิงค์สำหรับการอ้างอิงอย่างรวดเร็ว:
ExcelLibrary - GNU Lesser GPL
EPPlus - GNU (LGPL) - ไม่ดูแล
EPPlus 5 อีกต่อไป - Polyform Noncommercial - เริ่มพฤษภาคม 2020
NPOI - Apache License

นี่คือตัวอย่างโค้ดสำหรับ 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);

การสร้างไฟล์ Excel นั้นง่ายมาก คุณยังสามารถสร้างไฟล์ Excel ได้ด้วยตนเอง แต่ฟังก์ชันการทำงานข้างต้นเป็นสิ่งที่ทำให้ฉันประทับใจมาก

หากคุณมีความสุขกับรูปแบบ xlsx ลองโครงการ GitHub ของฉันEPPlus มันเริ่มต้นด้วยแหล่งที่มาจาก ExcelPackage แต่วันนี้เป็นการเขียนใหม่ทั้งหมด รองรับช่วง, การจัดรูปแบบเซลล์, แผนภูมิ, รูปร่าง, รูปภาพ, ช่วงที่มีชื่อ, ตัวกรองอัตโนมัติ และอื่นๆ อีกมากมาย

แล้วการใช้ Open XML SDK 2.0 สำหรับ Microsoft Office ล่ะ

ประโยชน์บางประการ:

  • ไม่ต้องติดตั้ง Office
  • ทำโดย Microsoft = เอกสาร MSDN ที่เหมาะสม
  • .Net dll เพียงตัวเดียวที่จะใช้ในโปรเจ็กต์
  • SDK มาพร้อมกับเครื่องมือมากมาย เช่น diff, validator ฯลฯ

ลิงค์:

ฉันเคยใช้โครงการโอเพ่นซอร์สต่อไปนี้สำเร็จแล้ว:

  • ExcelPackage สำหรับรูปแบบ OOXML (Office 2007)

  • NPOI สำหรับรูปแบบ .XLS (Office 2003) NPOI 2.0 (เบต้า) ยังรองรับ XLSX

ดูโพสต์บล็อกของฉัน:

การสร้างสเปรดชีต Excel .XLS และ .XLSX ใน C #

NPOI พร้อมตาราง Excel และแผนภูมิไดนามิก

คุณสามารถใช้ OLEDB เพื่อสร้างและจัดการไฟล์ Excel ตรวจสอบเรื่องนี้: อ่านและการเขียนโดยใช้ Excel OLEDB

ตัวอย่างทั่วไป:

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

แก้ไข - ลิงค์เพิ่มเติมบางส่วน:

โซลูชันเชิงพาณิชย์อย่างSpreadsheetGear for .NETจะทำสิ่งนี้

คุณสามารถดูการถ่ายทอดสด ASP.NET (C # และ VB) ตัวอย่างที่นี่และดาวน์โหลดรุ่นทดลองที่นี่

ข้อจำกัดความรับผิดชอบ: ฉันเป็นเจ้าของ SpreadsheetGear LLC

ฉันใช้ตัวเลือกสองสามตัว:

ถ้า XLSX เป็นสิ่งจำเป็น: ExcelPackageเป็นการเริ่มต้นที่ดี แต่เสียชีวิตเมื่อนักพัฒนาหยุดทำงาน ExML หยิบขึ้นมาจากที่นั่นและเพิ่มคุณสมบัติบางอย่าง ExMLไม่ใช่ตัวเลือกที่แย่ ฉันยังคงใช้งานมันอยู่สองสามเว็บไซต์ที่ใช้งานจริง

สำหรับทุกโครงการใหม่ของฉัน แต่ฉันใช้NPOIพอร์ต .NET ของApache POI NPOI 2.0 (อัลฟ่า)ยังรองรับ XLSX

ตัวเลือกที่เบามากอาจเป็นการใช้ตาราง HTML เพียงสร้างแท็กส่วนหัว เนื้อหา และตารางในไฟล์ แล้วบันทึกเป็นไฟล์ที่มีนามสกุล .xls มีแอตทริบิวต์เฉพาะของ Microsoft ที่คุณสามารถใช้เพื่อจัดรูปแบบผลลัพธ์ รวมถึงสูตร

ฉันทราบดีว่าคุณอาจไม่ได้เข้ารหัสสิ่งนี้ในเว็บแอปพลิเคชัน แต่นี่คือตัวอย่างการจัดองค์ประกอบของไฟล์ Excel ผ่านตาราง HTML เทคนิคนี้สามารถใช้ได้หากคุณกำลังเขียนโค้ดแอปคอนโซล แอปเดสก์ท็อป หรือบริการ

หากคุณกำลังสร้างไฟล์ Excel 2007/2010 ให้ลองใช้โครงการโอเพ่นซอร์สนี้: https://github.com/closedxml/closedxml

It provides an object oriented way to manipulate the files (similar to VBA) without dealing with the hassles of XML Documents. It can be used by any .NET language like C# and Visual Basic (VB).

ClosedXML allows you to create Excel 2007/2010 files without the Excel application. The typical example is creating Excel reports on a web server:

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");

คุณสามารถใช้ExcelXmlWriter

มันทำงานได้ดี

คุณอาจต้องการตรวจสอบคลาส interop ที่มีอยู่ใน C# (เช่นMicrosoft.Office.Interop.Excelคุณบอกว่าไม่มี OLE (ซึ่งไม่ใช่) แต่คลาส interop นั้นใช้งานง่ายมาก ดูเอกสาร C# ที่นี่ (Interop สำหรับ Excel เริ่มต้นใน หน้า 1072 ของ C # PDF)

คุณอาจจะประทับใจถ้าคุณยังไม่ได้ลอง

โปรดระวังจุดยืนของ Microsoft เกี่ยวกับเรื่องนี้:

Microsoft does not currently recommend, and does not support, Automation of Microsoft Office applications from any unattended, non-interactive client application or component (including ASP, ASP.NET, DCOM, and NT Services), because Office may exhibit unstable behavior and/or deadlock when Office is run in this environment.

นี่คือ C # ห้องสมุดสมบูรณ์ฟรีซึ่งจะช่วยให้คุณส่งออกจากDataSet, DataTableหรือList<>เป็นของแท้ Excel 2007 ไฟล์ .xlsx ใช้ห้องสมุด OpenXML นี้:

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

มีซอร์สโค้ดแบบเต็มให้ - ฟรี - พร้อมคำแนะนำและแอปพลิเคชันสาธิต

หลังจากเพิ่มคลาสนี้ในแอปพลิเคชันของคุณแล้ว คุณสามารถส่งออกชุดข้อมูลของคุณไปยัง Excel ได้ในโค้ดเพียงบรรทัดเดียว:

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

มันไม่ง่ายไปกว่านี้อีกแล้ว...

และไม่จำเป็นต้องแสดง Excel บนเซิร์ฟเวอร์ของคุณด้วยซ้ำ

คุณสามารถพิจารณาสร้างไฟล์ของคุณโดยใช้รูปแบบXML Spreadsheet 2003 นี่คือรูปแบบ XML ง่ายโดยใช้สคีเอกสารที่ดี

คุณอาจต้องการที่จะดูที่GemBox.Spreadsheet

พวกเขามีเวอร์ชันฟรีพร้อมคุณสมบัติทั้งหมด แต่จำกัดไว้ที่ 150 แถวต่อแผ่น และ 5 แผ่นต่อสมุดงาน หากนั่นอยู่ในความต้องการของคุณ

ฉันยังไม่จำเป็นต้องใช้มันเอง แต่ดูน่าสนใจ

Syncfusion Essential XlsIOสามารถทำได้ ไม่มีการพึ่งพา Microsoft office และยังมีการสนับสนุนเฉพาะสำหรับแพลตฟอร์มต่างๆ

ตัวอย่างโค้ด:

//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 ล้านเหรียญสหรัฐ) หมายเหตุ: ฉันทำงานให้กับ Syncfusion

ดี,

คุณยังสามารถใช้ห้องสมุดบุคคลที่สามเช่นAspose

ไลบรารีนี้มีข้อดีตรงที่ไม่ต้องติดตั้ง Excel บนเครื่องของคุณ ซึ่งเหมาะสำหรับกรณีของคุณ

ไลบรารี Office 2003 XML ต่างๆ ที่ใช้งานได้ค่อนข้างดีสำหรับไฟล์ excel ที่มีขนาดเล็กกว่า อย่างไรก็ตาม ฉันพบว่าขนาดที่แท้จริงของสมุดงานขนาดใหญ่ที่บันทึกในรูปแบบ XML เป็นปัญหา ตัวอย่างเช่น เวิร์กบุ๊กที่ฉันทำงานด้วยจะมีขนาด 40MB ในรูปแบบ XLSX ใหม่ (และแน่นกว่าที่ยอมรับได้) กลายเป็นไฟล์ XML 360MB

เท่าที่การวิจัยของฉันได้พาฉันไป มีแพ็คเกจเชิงพาณิชย์สองแพ็คเกจที่อนุญาตให้ส่งออกไปยังรูปแบบไฟล์ไบนารีที่เก่ากว่า พวกเขาคือ:

ฉันคิดว่าไม่มีราคาถูก (500USD และ 800USD ตามลำดับ) แต่ทั้งสองทำงานเป็นอิสระจาก Excel เอง

สิ่งที่ฉันอยากรู้คือโมดูลเอาต์พุตของ Excel สำหรับไลค์ของ OpenOffice.org ฉันสงสัยว่าพวกเขาสามารถย้ายจาก Java ไปยัง .Net ได้หรือไม่

นอกจากนี้ OpenXML ยังเป็นทางเลือกที่ดีที่ช่วยหลีกเลี่ยงการติดตั้ง MS Excel บนเซิร์ฟเวอร์ Open XML SDK 2.0 ที่ Microsoft จัดเตรียมไว้ให้ ช่วยลดความยุ่งยากในการจัดการแพ็คเกจ Open XML และองค์ประกอบ Open XML schema ภายในแพ็คเกจ Open XML Application Programming Interface (API) สรุปงานทั่วไปจำนวนมากที่นักพัฒนาดำเนินการบนแพ็คเกจ Open XML

ลองดูOpenXMLนี้: ทางเลือกที่ช่วยหลีกเลี่ยงการติดตั้ง MS Excel บนเซิร์ฟเวอร์

ฉันได้เขียนโค้ดง่ายๆ เพื่อส่งออกชุดข้อมูลไปยัง excel โดยไม่ต้องใช้วัตถุ excel โดยใช้ System.IO.StreamWriter

ด้านล่างนี้คือโค้ดที่จะอ่านตารางทั้งหมดจากชุดข้อมูลและเขียนลงในแผ่นงานทีละรายการ ผมเอาความช่วยเหลือจากบทความนี้

public static void exportToExcel(DataSet source, string fileName)
{
        const string endExcelXML = "</Workbook>";
        const string startExcelXML = "<xml version>\r\n<Workbook " +
                 "xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
                 " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " +
                 "xmlns:x=\"urn:schemas-    microsoft-com:office:" +
                 "excel\"\r\n xmlns:ss=\"urn:schemas-microsoft-com:" +
                 "office:spreadsheet\">\r\n <Styles>\r\n " +
                 "<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
                 "<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
                 "\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
                 "\r\n <Protection/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"BoldColumn\">\r\n <Font " +
                 "x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
                 "<Style     ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
                 " ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
                 "ss:ID=\"Decimal\">\r\n <NumberFormat " +
                 "ss:Format=\"0.0000\"/>\r\n </Style>\r\n " +
                 "<Style ss:ID=\"Integer\">\r\n <NumberFormat " +
                 "ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
                 "ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
                 "ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n " +
                 "</Styles>\r\n ";
        System.IO.StreamWriter excelDoc = null;
        excelDoc = new System.IO.StreamWriter(fileName);

        int sheetCount = 1;
        excelDoc.Write(startExcelXML);
        foreach (DataTable table in source.Tables)
        {
            int rowCount = 0;
            excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
            excelDoc.Write("<Table>");
            excelDoc.Write("<Row>");
            for (int x = 0; x < table.Columns.Count; x++)
            {
                excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
                excelDoc.Write(table.Columns[x].ColumnName);
                excelDoc.Write("</Data></Cell>");
            }
            excelDoc.Write("</Row>");
            foreach (DataRow x in table.Rows)
            {
                rowCount++;
                //if the number of rows is > 64000 create a new page to continue output
                if (rowCount == 64000)
                {
                    rowCount = 0;
                    sheetCount++;
                    excelDoc.Write("</Table>");
                    excelDoc.Write(" </Worksheet>");
                    excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
                    excelDoc.Write("<Table>");
                }
                excelDoc.Write("<Row>"); //ID=" + rowCount + "
                for (int y = 0; y < table.Columns.Count; y++)
                {
                    System.Type rowType;
                    rowType = x[y].GetType();
                    switch (rowType.ToString())
                    {
                        case "System.String":
                            string XMLstring = x[y].ToString();
                            XMLstring = XMLstring.Trim();
                            XMLstring = XMLstring.Replace("&", "&");
                            XMLstring = XMLstring.Replace(">", ">");
                            XMLstring = XMLstring.Replace("<", "<");
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                           "<Data ss:Type=\"String\">");
                            excelDoc.Write(XMLstring);
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.DateTime":
                            //Excel has a specific Date Format of YYYY-MM-DD followed by  
                            //the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
                            //The Following Code puts the date stored in XMLDate 
                            //to the format above
                            DateTime XMLDate = (DateTime)x[y];
                            string XMLDatetoString = ""; //Excel Converted Date
                            XMLDatetoString = XMLDate.Year.ToString() +
                                 "-" +
                                 (XMLDate.Month < 10 ? "0" +
                                 XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
                                 "-" +
                                 (XMLDate.Day < 10 ? "0" +
                                 XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
                                 "T" +
                                 (XMLDate.Hour < 10 ? "0" +
                                 XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
                                 ":" +
                                 (XMLDate.Minute < 10 ? "0" +
                                 XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
                                 ":" +
                                 (XMLDate.Second < 10 ? "0" +
                                 XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
                                 ".000";
                            excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" +
                                         "<Data ss:Type=\"DateTime\">");
                            excelDoc.Write(XMLDatetoString);
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Boolean":
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                        "<Data ss:Type=\"String\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Int16":
                        case "System.Int32":
                        case "System.Int64":
                        case "System.Byte":
                            excelDoc.Write("<Cell ss:StyleID=\"Integer\">" +
                                    "<Data ss:Type=\"Number\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.Decimal":
                        case "System.Double":
                            excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" +
                                  "<Data ss:Type=\"Number\">");
                            excelDoc.Write(x[y].ToString());
                            excelDoc.Write("</Data></Cell>");
                            break;
                        case "System.DBNull":
                            excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
                                  "<Data ss:Type=\"String\">");
                            excelDoc.Write("");
                            excelDoc.Write("</Data></Cell>");
                            break;
                        default:
                            throw (new Exception(rowType.ToString() + " not handled."));
                    }
                }
                excelDoc.Write("</Row>");
            }
            excelDoc.Write("</Table>");
            excelDoc.Write(" </Worksheet>");
            sheetCount++;
        }


        excelDoc.Write(endExcelXML);
        excelDoc.Close();
    }

ฉันเพิ่งใช้FlexCel.NETและพบว่ามันเป็นห้องสมุดที่ยอดเยี่ยม! ฉันไม่ได้พูดอย่างนั้นเกี่ยวกับผลิตภัณฑ์ซอฟต์แวร์มากเกินไป ไม่มีประโยชน์ที่จะนำเสนอการขายทั้งหมดที่นี่ คุณสามารถอ่านคุณสมบัติทั้งหมดบนเว็บไซต์ของพวกเขาได้

เป็นผลิตภัณฑ์เชิงพาณิชย์ แต่คุณจะได้แหล่งที่สมบูรณ์หากคุณซื้อ ดังนั้นฉันคิดว่าคุณสามารถรวบรวมไว้ในแอสเซมบลีของคุณได้หากต้องการ มิฉะนั้น มันเป็นเพียงแอสเซมบลีพิเศษหนึ่งชุดสำหรับ xcopy - ไม่มีการกำหนดค่าหรือการติดตั้งหรืออะไรทำนองนั้น

ฉันไม่คิดว่าคุณจะพบวิธีการใด ๆ ในการทำเช่นนี้หากไม่มีไลบรารีของบุคคลที่สามเนื่องจาก .NET framework ไม่ได้สร้างขึ้นเพื่อรองรับมันและ OLE Automation เป็นเพียงโลกแห่งความเจ็บปวด

ฉันเห็นด้วยเกี่ยวกับการสร้าง XML Spreadsheets นี่คือตัวอย่างเกี่ยวกับวิธีการทำ C# 3 (ทุกคนเพียงแค่บล็อกเกี่ยวกับมันใน VB 9 :P) http://www.aaron-powell.com/linq-to-xml-to- เก่ง

เพียงต้องการเพิ่มการอ้างอิงถึงโซลูชันของบุคคลที่สามที่แก้ไขปัญหาของคุณโดยตรง: http://www.officewriter.com

(ข้อจำกัดความรับผิดชอบ: ฉันทำงานให้กับ SoftArtisans ซึ่งเป็นบริษัทที่ผลิต OfficeWriter)

IKVM + แล้ว

หรือคุณสามารถใช้ Interop ...

นี่คือวิธีดำเนินการด้วย LINQ เป็น XML พร้อมโค้ดตัวอย่าง:

นำเข้าและส่งออกข้อมูล Excel อย่างรวดเร็วด้วย LINQ ไปยัง XML

มันซับซ้อนเล็กน้อย เนื่องจากคุณต้องนำเข้าเนมสเปซและอื่นๆ แต่มันช่วยให้คุณหลีกเลี่ยงการขึ้นต่อกันภายนอกได้

(แน่นอนว่าเป็น VB .NET ไม่ใช่ C# แต่คุณสามารถแยกเนื้อหา VB .NET ในโครงการของตนเองได้เสมอเพื่อใช้ XML Literals และทำทุกอย่างใน C#)

ผู้จำหน่ายส่วนประกอบภายนอกบางราย เช่น Infragistics หรือ Syncfusion มีความสามารถในการส่งออก Excel ที่ดีมาก โดยไม่จำเป็นต้องติดตั้ง Microsoft Excel

เนื่องจากผู้จำหน่ายเหล่านี้ยังมีส่วนประกอบกริด UI ขั้นสูง ส่วนประกอบเหล่านี้จึงมีประโยชน์อย่างยิ่งหากคุณต้องการให้รูปแบบและเลย์เอาต์ของการส่งออก excel เลียนแบบสถานะปัจจุบันของกริดในส่วนต่อประสานผู้ใช้ของแอปพลิเคชันของคุณ

หากการส่งออกของคุณมีจุดมุ่งหมายเพื่อดำเนินการฝั่งเซิร์ฟเวอร์โดยเน้นที่ข้อมูลที่จะส่งออกและไม่มีลิงก์ไปยัง UI ฉันจะใช้ตัวเลือกโอเพ่นซอร์สฟรีตัวใดตัวหนึ่ง (เช่น ExcelLibrary)

ก่อนหน้านี้ฉันเคยเกี่ยวข้องกับโปรเจ็กต์ที่พยายามใช้ระบบอัตโนมัติฝั่งเซิร์ฟเวอร์ในชุดโปรแกรม Microsoft Office จากประสบการณ์นี้ ฉันขอแนะนำอย่างยิ่งให้ต่อต้านแนวทางนั้น

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

สวัสดี วิธีแก้ปัญหานี้คือการส่งออกมุมมองกริดของคุณไปยังไฟล์ excel ซึ่งอาจช่วยคุณได้

คุณสามารถสร้างไฟล์ Excel ที่มีรูปแบบสวยงามได้โดยใช้ไลบรารีนี้: http://officehelper.codeplex.com/documentation
ดูตัวอย่างด้านล่าง:

using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME))
{
    helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN;
    helper.CurrentSheetName = "Sheet1";
    helper.CurrentPosition = new CellRef("C3");

    //the template xlsx should contains the named range "header"; use the command "insert"/"name".
    helper.InsertRange("header");

    //the template xlsx should contains the named range "sample1";
    //inside this range you should have cells with these values:
    //<name> , <value> and <comment>, which will be replaced by the values from the getSample()
    CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List<string> {"name", "value", "comment"}); 
    helper.InsertRange(sample1, getSample());

    //you could use here other named ranges to insert new cells and call InsertRange as many times you want, 
    //it will be copied one after another;
    //even you can change direction or the current cell/sheet before you insert

    //typically you put all your "template ranges" (the names) on the same sheet and then you just delete it
    helper.DeleteSheet("Sheet3");
}        

โดยที่ตัวอย่างมีลักษณะดังนี้:

private IEnumerable<List<object>> getSample()
{
    var random = new Random();

    for (int loop = 0; loop < 3000; loop++)
    {
        yield return new List<object> {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop};
    }
}

วิธีที่ง่ายและรวดเร็วที่สุดในการสร้างไฟล์ Excel จาก C# คือการใช้ Open XML Productivity Tool Open XML Productivity Tool มาพร้อมกับการติดตั้ง Open XML SDK เครื่องมือนี้จะทำวิศวกรรมย้อนกลับไฟล์ Excel ใดๆ ลงในโค้ด C# โค้ด C# สามารถใช้สร้างไฟล์ใหม่ได้

ภาพรวมของกระบวนการที่เกี่ยวข้องคือ:

  1. ติดตั้ง Open XML SDK ด้วยเครื่องมือ
  2. สร้างไฟล์ Excel โดยใช้ไคลเอ็นต์ Excel ล่าสุดพร้อมรูปลักษณ์ที่ต้องการ DesiredLook.xlsxชื่อมัน
  3. เมื่อเปิดเครื่องมือDesiredLook.xlsxแล้วคลิกปุ่มสะท้อนโค้ดใกล้ด้านบน ใส่คำอธิบายภาพที่นี่
  4. รหัส C# สำหรับไฟล์ของคุณจะถูกสร้างขึ้นในบานหน้าต่างด้านขวาของเครื่องมือ เพิ่มสิ่งนี้ในโซลูชัน C# ของคุณและสร้างไฟล์ด้วยรูปลักษณ์ที่ต้องการ

เป็นโบนัส วิธีนี้ใช้ได้กับไฟล์ Word และ PowerPoint ในฐานะนักพัฒนา C# คุณจะทำการเปลี่ยนแปลงโค้ดเพื่อให้เหมาะกับความต้องการของคุณ

ฉันได้พัฒนาแอพ WPF อย่างง่ายบน githubซึ่งจะทำงานบน Windows เพื่อจุดประสงค์นี้ มีคลาสตัวยึดตำแหน่งGeneratedClassซึ่งคุณสามารถวางโค้ดที่สร้างขึ้นได้ หากคุณย้อนกลับไฟล์เวอร์ชันหนึ่ง ไฟล์จะสร้างไฟล์ excel ดังนี้:

ใส่คำอธิบายภาพที่นี่

คุณเคยลองซิลค์ไหม?

เราเคยสร้าง excelsheets ใน asp แบบคลาสสิกเป็น sylk และตอนนี้เรากำลังค้นหา excelgenerater ด้วย

ข้อดีของ sylk คือ คุณสามารถจัดรูปแบบเซลล์ได้

วิธีการแก้ปัญหา Java โอเพนซอร์สApache POI อาจมีวิธีการตั้งค่าการทำงานร่วมกันที่นี่ แต่ฉันไม่รู้เกี่ยวกับ Java มากพอที่จะตอบคำถามนั้น

เมื่อฉันสำรวจปัญหานี้ ฉันลงเอยด้วยการใช้แอสเซมบลี Interop