ฉันจะสร้างไฟล์ Excel (.XLS และ. XLSX) ใน C # โดยไม่ต้องติดตั้ง Microsoft Office ได้อย่างไร


1890

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


"... โดยไม่ต้องติดตั้ง Ms Office?" ส่วนหนึ่งของคำถามฟังดูไม่เป็นมืออาชีพมาก คุณสามารถสร้างไฟล์ประเภทใดก็ได้จากโปรแกรม C # (โดยมีxlsหรือเป็นxlsxไฟล์หนึ่งในนั้น) ไม่ใช่ข้อกำหนดที่มีโปรแกรมในคอมพิวเตอร์ของคุณที่สามารถอ่านได้ (พูดไบนารี)
Mike

30
@ ไมค์ชิ้นส่วน "โดยไม่ต้องติดตั้ง Excel" ไม่เกี่ยวข้องกับความเป็นมืออาชีพ มันเกี่ยวกับการพึ่งพา ข้อความต้นฉบับของคำถามถูกใช้คำว่า: "โดยหลักการแล้วฉันต้องการโอเพ่นซอร์สดังนั้นฉันจึงไม่ต้องเพิ่มการพึ่งพาบุคคลที่สามใด ๆ ในรหัสของฉันและฉันต้องการหลีกเลี่ยงการใช้ Excel โดยตรงเพื่อสร้างไฟล์ (โดยใช้ OLE ระบบอัตโนมัติ) " มันเป็นเรื่องที่โชคไม่ดีที่คำถามนี้ได้ทำให้ง่ายขึ้นอย่างมาก
โทนี่

5
สมมติว่าคุณกำลังพยายามทำบางสิ่งบางอย่างในห้องสมุด sans หรือรหัสภายนอกฉันไม่สามารถพูดถึงไฟล์ xls ได้ แต่สำหรับไฟล์ xlsx ทำไมไม่เริ่มด้วยการนำไฟล์ที่มีอยู่แล้วเปลี่ยนชื่อเป็นไฟล์ zip และสำรวจเนื้อหา วิศวกรรมย้อนกลับเล็กน้อยจะบอกคุณไม่น้อย มีไฟล์ xml ที่แตกต่างกันหลายไฟล์และเชื่อมโยงไฟล์ต่าง ๆ ในโฟลเดอร์และโฟลเดอร์ย่อยต่างๆ ลองสำรวจดูและดูว่าเป็นสิ่งที่คุณสามารถทำซ้ำหรือดูว่าคุณสามารถค้นหาเอกสารใน xml namespaces / schemas ต่างๆได้หรือไม่
Alexander Ryan Baggett

@AlexanderRyanBaggett สิ่งนี้มีประโยชน์มาก! เข้ามาโพสต์นี้ในขณะที่ทำงานกับการสร้างรายงานโดยอัตโนมัติและการสำรวจเอกสารเนื่องจากไฟล์ zip ให้ความเข้าใจในสิ่งที่จะสร้างไฟล์เอกสาร
SentientFlesh

คำตอบ:


1055

คุณสามารถใช้ไลบรารีชื่อ 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 Table ใน ExcelLibrary )

นี่คือลิงค์คู่สำหรับการอ้างอิงอย่างรวดเร็ว:
ExcelLibrary - GNU Lesser GPL
EPPlus - GNU Lesser General Public License (LGPL)
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 ได้ด้วยตนเอง แต่ฟังก์ชั่นด้านบนเป็นสิ่งที่ฉันประทับใจจริงๆ


247
ExcelLibrary ได้ถูกแทนที่โดย EPPlus พิเศษ - epplus.codeplex.com ม.ค. อัพเดทเป็นประจำ ได้ใช้มันและเป็นหนึ่งในโครงการโอเพ่นซอร์สที่ดีที่สุดที่เราเคยทำงานด้วย
ทำเครื่องหมาย A

3
ควรสังเกตว่า ExcelLibrary มีปัญหาด้านประสิทธิภาพการทำงานจำนวนมากเมื่อจัดการกับชุดข้อมูลขนาดใหญ่ (ใหญ่กว่า 5,000 แถวพร้อมคอลัมน์จำนวนมาก) ขณะนี้กำลังทำการแก้ไขฐานรหัสในที่ทำงานอย่างหนักเพื่อให้เราสามารถใช้งานในโครงการได้
rossisdead

EPPlus ดูเหมือนว่ารถบั๊กน้อยกว่า ExcelLibrary แต่ก็เป็น GPL และเป็นเพียงทางออกสำหรับโครงการโอเพนซอร์สเท่านั้น
เซท


6
สิ่งที่เกี่ยวกับClosedXML ? ฉันอาจพิสูจน์ว่ามีประโยชน์ในโครงการของคุณ
Amadeus Sánchez

589

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


77
ใบอนุญาตคือ LGPL ตอนนี้ปล่อยบันทึกที่นี่: epplus.codeplex.com/releases/view/79802
Simon D

13
ตัวอย่างมีประโยชน์ ฉันสามารถเปลี่ยนรหัสจากการใช้ Microsoft interop library (ช้ามาก ๆ ) เป็นไลบรารี่นี้ (เวอร์ชั่น 4.x) ในอีกไม่กี่ชั่วโมง มาตรฐานของฉันเขียนไฟล์ที่มีสองแท็บและเซลล์ประมาณ 750,000 เซลล์ ใช้ MS interop ใช้เวลา 13 นาที เมื่อใช้ EPPlus จะใช้เวลา 10 วินาทีซึ่งเป็นการเพิ่มความเร็วประมาณ 80x มีความสุขมาก!
Paul Chernoch

3
เพื่อความชัดเจนในหัวข้อนี้ LGPL อนุญาตให้เชื่อมโยงซอฟต์แวร์โดยไม่มีส่วนที่ติดเชื้อของ GPL ที่เกิดขึ้น คุณจะต้องทำการเปลี่ยนแปลงโอเพนซอร์สที่คุณทำกับ ClosedXml หรือถ้าคุณใส่ซอร์สโค้ด (ตรงข้ามกับการอ้างอิงแอสเซมบลี ClosedXml) ภายในแอปพลิเคชันของคุณคุณต้องเปิดซอร์สแอปพลิเคชันของคุณ
Chris Marisic

4
@Paul Chernoch: เราเติมแผ่นงาน Excel ขนาดใหญ่เข้าด้วยกันอย่างรวดเร็ว ความลับคือการทำการอัปเดตจำนวนมาก สร้างวัตถุ [,] บล็อกเติมข้อมูลนั้นจากนั้นเขียนเมทริกซ์นั้นไปยัง Excel ในครั้งเดียว: excelWorksheet.get_Range (ช่วง) .Value2 = block;
Marc Meketon

2
ดูเหมือนว่าสิทธิ์ใช้งานจะเปลี่ยนจาก LGPL เป็นสิทธิ์ใช้งาน Polyform Noncommercial 1.0.0
Luke

175

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

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

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

ลิงค์:


3
สิ่งสำคัญที่ควรทราบคือ DLL สำหรับตัวนี้มีขนาดเกิน 5 MB และ จำกัด เฉพาะรูปแบบ Office 2007 แต่แน่นอนทางออกที่ง่ายที่สุดและเร็วที่สุดที่เหมาะกับฉัน
Josh Brown

18
เพียงแค่หัวขึ้น v2.5 ที่ออกและสามารถดาวน์โหลดได้ที่นี่
Snuffleupagus

10
SDK วางโมเดล XML ลงในคลาสเพื่อให้แต่ละแท็ก XML ถูกแมปกับแท็กจากนั้นคุณต้องสร้างลำดับชั้นของคลาส (แต่ละอินสแตนซ์มีชุดของอินสแตนซ์ลูก / แท็ก) อย่างถูกต้อง ซึ่งหมายความว่าคุณต้องรู้โครงสร้าง XML ของไฟล์ Excel ซึ่งมีความซับซ้อนมาก มันง่ายกว่าที่จะใช้ wrapper เช่น EPPlus ที่กล่าวถึงข้างต้นซึ่งทำให้สิ่งต่าง ๆ ง่ายขึ้น
Tsahi Asher

2
ตัวอย่างที่ดีของ Microsoft Open XML SDK - Open XML Writer สามารถดูได้ที่polymathprogrammer.com/2012/08/06/ … หรือดูโซลูชัน Stack Overflow stackoverflow.com/questions/11370672/…
Greg

4
ฉันพบว่า Open XML Writer ของ Microsoft Open XML SDK นั้นยอดเยี่ยม การใช้โซลูชันด้านบน (โดยเฉพาะตัวอย่างของ Vincent Tom (Poly Math)) มันง่ายที่จะสร้างนักเขียนที่ไหลผ่านชุดข้อมูลขนาดใหญ่และเขียนบันทึกในลักษณะที่คล้ายคลึงกันและไม่ซับซ้อนเกินกว่าที่คุณจะทำ CSV; แต่คุณเขียน xml แทน Open XML เป็นแนวคิดที่ Microsoft คิดว่าเป็นรูปแบบ Office ใหม่และคุณสามารถเปลี่ยนชื่อไฟล์เหล่านี้จากไฟล์. xslx เป็น. zip ได้หากคุณรู้สึกอยากโผล่เนื้อหา XML
เกร็ก

167

ฉันเคยประสบความสำเร็จกับโครงการโอเพนซอร์ซต่อไปนี้:

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

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

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

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

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


6
หมายเหตุเกี่ยวกับ NPOI - การอ้างอิงแถวและคอลัมน์เป็นแบบศูนย์ ทำงานได้ดีสำหรับการเติมแม่แบบที่มีอยู่
John M

108

คุณสามารถใช้ 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();
}

แก้ไข - ลิงก์เพิ่มเติม:


4
บางคนสามารถยืนยันได้ว่าทำงานได้เมื่อทำงานใน x64 หรือไม่ ฉันค่อนข้างมั่นใจว่า Jet ทำงานได้เฉพาะเมื่อแอปของคุณรวบรวมหรือทำงานในโหมด 32 บิต
ลามาร์

2
ฉันเพิ่งทดสอบการเชื่อมต่อนี้และมันล้มเหลวใน Windows Server 2008 R2 x64 RC ดูเหมือนว่าจะต้องติดตั้งไดรเวอร์ระบบ Office 2007: ส่วนประกอบการเชื่อมต่อข้อมูล [ microsoft.com/downloads/…
Chris Richner

25
โปรดใช้ความระมัดระวังกับสิ่งนี้ - มันเป็นเรื่องที่น่าเกลียดมาก (ตัวอย่างเช่นบางครั้งก็เดาประเภทคอลัมน์และทิ้งข้อมูลทั้งหมดที่ไม่เหมาะสม)
dbkk

9
ควรระวังให้มากหากใช้วิธีนี้ ฉันพบว่ามันไม่สม่ำเสมอสำหรับข้อมูลที่ไม่อยู่ในรูปแบบที่สมบูรณ์แบบ
Kenny Mann

9
ในฐานะคนที่ต้องใช้ OleDb ในโครงการขนาดใหญ่ฉันพูดว่าอยู่ห่างจากมัน! บางครั้งไม่สามารถดึงค่าเซลล์เพียงเพราะไม่เข้าใจรูปแบบ มันไม่มีการลบ มันทำงานแตกต่างกันอย่างสิ้นเชิงและคาดเดาไม่ได้แม้จะมีการเปลี่ยนแปลงผู้ให้บริการเพียงเล็กน้อย ฉันจะบอกว่าไปหาทางออกเชิงพาณิชย์ที่พิสูจน์แล้ว
Caner Öncü

80

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

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

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


10
คุณมีผลิตภัณฑ์ที่ยอดเยี่ยม แต่ฉันคิดว่าผู้คนจำนวนมากที่นี่กำลังรอรับโซลูชั่นฟรี นั่นอาจอธิบายการลงคะแนนเสียง
md1337

65

ตัวเลือกที่ฉันใช้:

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

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


ระวังด้วย ExcelPackage หากคุณต้องการรองรับ XLS ฉันมีเวลายากกับมันและในที่สุดก็เปลี่ยนเป็น ExcelLibrary
Jeremy

จริงแน่นอน ExcelPackage / ExML เป็นเพียงตัวเลือกที่ดีถ้าคุณต้องการการสนับสนุน XLSX
เนท

5
โปรดทราบว่า ExcelPackage มีผู้สืบทอด: EPPlus ( epplus.codeplex.com ) ซึ่งรองรับ XLSX สิ่งเดียวที่ฉันกังวลเมื่อเปรียบเทียบกับ NPOI คือประสิทธิภาพเช่นเมื่อมีคอลัมน์จำนวนมาก
Pragmateek

63

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

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


6
มันเป็นแบบเฉพาะกิจ แต่ก็ใช้งานได้ (ไม่ต้องพูดถึง excel ออกคำเตือนเรื่องการเปิด) และมันง่ายมากสมควรที่จะมีสถานที่เป็นทางออก แม้ว่าจะเป็นเพียงการแสดงว่าคุณสามารถส่งออกไฟล์ excel ได้ :))
Luka Ramishvili

3
วิธีนี้ใช้ได้ผลดีสำหรับฉันแค่ทราบว่าคุณไม่สามารถใช้ส่วนขยาย. xlsx ได้
Jill

บางคนในองค์กรของฉันไม่สามารถเปิดไฟล์ excel ได้ด้วยวิธีนี้ใน Office 2010 ขึ้นไป ไม่ทราบว่าปัญหาคืออะไร แต่ฉันต้องม้วนการใช้งาน OpenXML ของตัวเอง (ดูคำตอบของ Sogger)
Kristen Hammack

49

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

มันมีวิธีการเชิงวัตถุเพื่อจัดการไฟล์ (คล้ายกับ VBA) โดยไม่ต้องจัดการกับความยุ่งยากของเอกสาร XML มันสามารถใช้โดย. NET ภาษาใด ๆ เช่น C # และ Visual Basic (VB)

ClosedXML อนุญาตให้คุณสร้างไฟล์ Excel 2007/2010 โดยไม่มีแอปพลิเคชัน Excel ตัวอย่างทั่วไปคือการสร้างรายงาน Excel บนเว็บเซิร์ฟเวอร์:

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

9
ฉันพยายามใช้สิ่งนี้ในโครงการที่สร้างแผ่นงาน Excel ที่มีขนาดใหญ่มาก ห้องสมุดยอดเยี่ยม แต่ประสิทธิภาพแย่มาก ฉันเพิ่งทำการเปรียบเทียบสำหรับโครงการที่ฉันกำลังดำเนินการ: ClosedXML (v 0.53.3) ใช้เวลา 92,489 ms ในขณะที่ EPPlus (v 2.9.03 สำหรับการทดสอบ - เราใช้ไม่ได้เพราะมัน GPL) ใช้เวลา 16,500 มิลลิวินาที
Druid

1
@Druid ใบอนุญาตคือ LGPL สมมติว่าคุณไม่ได้แก้ไขซอร์สโค้ดเป็น ClosedXML คุณสามารถใช้epplus.codeplex.com/license
Chris Marisic


47

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

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

โปรดได้รับการเตือนถึงท่าทางของ Microsoft ในเรื่องนี้:

Microsoft ไม่แนะนำในขณะนี้และไม่สนับสนุน Automation ของแอปพลิเคชัน Microsoft Office จากแอปพลิเคชันหรือส่วนประกอบไคลเอ็นต์ที่ไม่ต้องอาศัยการโต้ตอบใด ๆ (รวมถึง ASP, ASP.NET, DCOM และ NT Services) เนื่องจาก Office อาจมีพฤติกรรมที่ไม่เสถียรและ / หรือการหยุดชะงักเมื่อมีการเรียกใช้ Office ในสภาพแวดล้อมนี้


6
แต่คุณต้องให้แน่ใจว่าคุณกำจัดทุกอย่างด้วยตนเองมิฉะนั้นคุณจะรั่วหน่วยความจำ
MagicKat

8
@Ricky B: นอกจากนี้ในประสบการณ์ของฉันกับ interop คือมันใช้ excel ทุกครั้งที่เราใช้งานหากไม่ได้ติดตั้ง Excel ไว้ในเครื่องเราจะได้รับข้อยกเว้น COM
MagicKat

1
ด้วย OLE แม้จะมีการกำจัดที่ระมัดระวังมากในที่สุดก็จะรั่วไหลหน่วยความจำหรือเกิดปัญหา นี่เป็นเหตุผลที่ตกลงสำหรับแอปพลิเคชัน / เวิร์กสเตชันที่เข้าร่วม แต่สำหรับเซิร์ฟเวอร์ไม่แนะนำ (MS มี KB ที่ระบุสิ่งนี้) สำหรับเซิร์ฟเวอร์ของเราเราเพิ่งรีบูตทุกคืน อีกครั้งนั่นก็ใช้ได้
Jennifer Zouak

11
@Geoffrey: อ่าโอเคคุณจะทำให้ฉันทำงานได้ :) -> support.microsoft.com/kb/257757 Microsoft ไม่แนะนำในขณะนี้และไม่สนับสนุน Automation ของแอปพลิเคชั่น Microsoft Office จากที่ใดก็ตามที่ไม่ต้องสนใจ แอปพลิเคชันไคลเอนต์แบบโต้ตอบ ...
Jennifer Zouak

4
ฉันกำลังจะมาถึงการสนทนานี้หลังจากที่ต้องดิ้นรนเป็นเวลามากกว่าหนึ่งสัปดาห์ในการทำงานร่วมกันและถ้าความต้องการของคุณง่ายมากนี่ไม่ได้ผล การสนับสนุนสำหรับการจัดรูปแบบสเปรดชีตของคุณนั้นสุดเหวี่ยงซึ่งเป็นสาเหตุของการสร้างไฟล์. xls และไม่ใช่แค่ไฟล์. csv แบบแบน ตัวอย่างเช่นคุณลองส่งออกอักขระมากกว่า 911 ตัวในเซลล์หรือลองตั้งความกว้างของเซลล์ที่ผสานในลักษณะที่สอดคล้องกันหรือไม่? ฉันมีและฉันไม่สามารถบอกคุณว่าฉันเกลียดอึนี้เท่าไหร่ตอนนี้ ... ทำตัวเองชอบและไปกับหนึ่งในห้องสมุดฟรีที่กล่าวถึงในการสนทนานี้
md1337

34

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

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

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

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

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

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

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


1
ดูเหมือนว่าจะทำให้เข้าใจผิดเล็กน้อยในขณะที่คุณขอบริจาคเพื่อรับคุณสมบัติทั้งหมด
UrbanEsc

นั่นเป็นความจริงบางส่วน: รุ่นฟรีที่สมบูรณ์จะสร้างไฟล์. xlsx ที่สมบูรณ์แบบสำหรับคุณและมีรหัสแหล่งที่มาทั้งหมด หากคุณบริจาค $ 10 หรือมากกว่าให้กับหนึ่งในสององค์กรการกุศล (ซึ่งฉันไม่ได้รับอย่างแน่นอน) จากนั้นคุณจะได้รับเวอร์ชัน "ดีกว่า" ซึ่งแสดงวิธีการจัดรูปแบบวันที่และอื่น ๆ เนื่องจากราคาของผลิตภัณฑ์ของบุคคลที่สาม การบริจาค 10 ดอลลาร์ให้กับสาเหตุที่ดีแทนที่จะคุ้มค่า!
Mike Gledhill


23

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

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

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


21

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

  • ASP.NET
  • ASP.NET MVC
  • UWP
  • Xamarin
  • WPF และ Windows Forms
  • บริการของ Windows และการทำงานแบบเป็นชุด

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

//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


18

ดี,

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

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


เพื่อให้แม่นยำยิ่งขึ้นคุณสามารถใช้Aspose.Cells for .NET เพื่อสร้างไฟล์ Excel (XLS, XLSX) ในแอปพลิเคชัน. NET ของคุณ
Shahzad Latif

9
ใช่คุณสามารถถ้าคุณไม่สนใจจ่ายค่าธรรมเนียมใบอนุญาตขั้นต่ำ $ 999 ลองห้องสมุด MikesKnowledgeBase ... ซึ่งราคา $ 999 ถูกกว่านี้ !!
Mike Gledhill

17

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

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


17

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

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

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

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


อันนี้ใช้ได้ทั้ง. net และ java และไม่แพง SmartXLS smartxls.com
liya


15

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

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

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


15

ฉันเขียนโค้ดง่าย ๆ เพื่อส่งออกชุดข้อมูลไปยัง 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();
    }

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

รองรับxlsx ? OpenXML ?
Kiquenet

14

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

(ข้อจำกัดความรับผิดชอบ: ฉันทำงานให้กับ SoftArtisans บริษัท ที่สร้าง OfficeWriter)



12

ต่อไปนี้เป็นวิธีดำเนินการกับ LINQ ถึง XML พร้อมรหัสตัวอย่าง:

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

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

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


12

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

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

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

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


12
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 ซึ่งอาจช่วยคุณได้


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

คุณควรใช้System.Net.Mime.ContentDispositionเพื่อสร้างข้อความส่วนหัวการจัดการเนื้อหาแทนการผนวกสตริงซึ่งจะจัดการกับชื่อไฟล์ที่มีช่องว่าง ฯลฯ อย่างถูกต้อง
เปียห์

12

คุณสามารถสร้างไฟล์ 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};
    }
}

10

วิธีที่ง่ายที่สุดและเร็วที่สุดในการสร้างไฟล์ Excel จาก C # คือการใช้เครื่องมือเพิ่มประสิทธิภาพการทำงานของ XML เครื่องมือเพิ่มประสิทธิภาพ Open XML มาพร้อมกับการติดตั้ง 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 ดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันยังไม่ได้ลองใช้โซลูชัน Open XML SDK นี้ แต่ว้าวฉันจะลองดูอย่างแน่นอน ฉันทำงานกับเครื่องมือแบบนี้มาหลายปีแล้วและไม่รู้เกี่ยวกับสิ่งนี้ ฉันเผยแพร่ FOSS ง่าย ๆ ของฉันเองสำหรับการแปลงไฟล์เป็น XLSX ด้วย. NET: github.com/TonyGravagno/NebulaXConvert
TonyG


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.