ฉันจะสร้างสเปรดชีต Excel ด้วย C # โดยไม่ต้องติดตั้ง Excel บนเครื่องที่ใช้รหัสได้อย่างไร
ฉันจะสร้างสเปรดชีต Excel ด้วย C # โดยไม่ต้องติดตั้ง Excel บนเครื่องที่ใช้รหัสได้อย่างไร
คำตอบ:
คุณสามารถใช้ไลบรารีชื่อ ExcelLibrary มันเป็นห้องสมุดโอเพนซอร์ซฟรีที่โพสต์บน Google Code:
ดูเหมือนว่าจะเป็นพอร์ตของ 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 ได้ด้วยตนเอง แต่ฟังก์ชั่นด้านบนเป็นสิ่งที่ฉันประทับใจจริงๆ
หากคุณมีความสุขกับรูปแบบ xlsx ลองโครงการ GitHub ของฉันEPPlus มันเริ่มต้นด้วยแหล่งที่มาจาก ExcelPackage แต่วันนี้เป็นการเขียนใหม่ทั้งหมด มันรองรับช่วง, ใส่สไตล์เซลล์, แผนภูมิ, รูปร่าง, รูปภาพ, ตั้งชื่อช่วง, ตัวกรองอัตโนมัติและอื่น ๆ อีกมากมาย
แล้วการใช้ Open XML SDK 2.0 สำหรับ Microsoft Office ล่ะ
ประโยชน์บางประการ:
ลิงค์:
ฉันเคยประสบความสำเร็จกับโครงการโอเพนซอร์ซต่อไปนี้:
ExcelPackage สำหรับรูปแบบ OOXML (Office 2007)
NPOI สำหรับรูปแบบ. XLS (Office 2003) NPOI 2.0 (Beta) ยังรองรับ XLSX
ดูที่โพสต์บล็อกของฉัน:
คุณสามารถใช้ 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 สำหรับ. NETจะทำเช่นนั้น
คุณสามารถดูการถ่ายทอดสด ASP.NET (C # และ VB) ตัวอย่างที่นี่และดาวน์โหลดรุ่นทดลองที่นี่
ข้อจำกัดความรับผิดชอบ: ฉันเป็นเจ้าของ SpreadsheetGear LLC
ตัวเลือกที่ฉันใช้:
ถ้าจำเป็นต้องใช้ XLSX: ExcelPackageเป็นการเริ่มต้นที่ดี แต่จะหายไปเมื่อนักพัฒนาเลิกทำงาน ExML หยิบขึ้นมาจากที่นั่นและเพิ่มคุณสมบัติบางอย่าง ExMLไม่ใช่ตัวเลือกที่ไม่ดีฉันยังคงใช้มันในเว็บไซต์การผลิตสองแห่ง
สำหรับทุกโครงการใหม่ของฉัน แต่ฉันใช้NPOIพอร์ต .NET ของApache POI NPOI 2.0 (Alpha)รองรับ XLSX
ตัวเลือกที่มีน้ำหนักเบามากอาจใช้ตาราง HTML เพียงสร้างแท็กส่วนหัวเนื้อหาและตารางในไฟล์และบันทึกเป็นไฟล์ที่มีนามสกุล. xls มีแอตทริบิวต์เฉพาะของ Microsoft ที่คุณสามารถใช้กำหนดลักษณะของผลลัพธ์ได้รวมถึงสูตรต่างๆ
ฉันรู้ว่าคุณอาจไม่ได้เขียนโปรแกรมนี้ในเว็บแอปพลิเคชัน แต่นี่เป็นตัวอย่างของการจัดองค์ประกอบของไฟล์ Excel ผ่านตาราง HTML สามารถใช้เทคนิคนี้หากคุณกำลังเข้ารหัสแอปคอนโซลแอพเดสก์ท็อปหรือบริการ
หากคุณกำลังสร้างไฟล์ 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");
คุณอาจต้องการตรวจสอบคลาส 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 ในสภาพแวดล้อมนี้
นี่คือ 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 อย่างง่ายโดยใช้สคีมาที่มีเอกสารครบถ้วน
Syncfusion Essential XlsIOสามารถทำได้ มันไม่มีการพึ่งพาสำนักงาน Microsoft และยังมีการสนับสนุนเฉพาะสำหรับแพลตฟอร์มที่แตกต่างกัน
ตัวอย่างโค้ด:
//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 ลงในเครื่องของคุณซึ่งจะเหมาะที่สุดในกรณีของคุณ
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 บนเซิร์ฟเวอร์
ไลบรารี XML ของ Office 2003 XML ต่างๆนั้นทำงานได้ดีสำหรับไฟล์ Excel ขนาดเล็ก อย่างไรก็ตามฉันพบว่าเวิร์กบุ๊กขนาดใหญ่ที่บันทึกในรูปแบบ XML เป็นปัญหา ตัวอย่างเช่นเวิร์กบุ๊กที่ฉันทำงานด้วยจะเป็น 40MB ในรูปแบบ XLSX ใหม่ (และแน่นขึ้นเป็นที่ยอมรับมาก) กลายเป็นไฟล์ XML 360MB
เท่าที่การวิจัยของฉันได้รับฉันมีสองแพคเกจการค้าที่อนุญาตให้ส่งออกไปยังรูปแบบไฟล์ไบนารีที่เก่ากว่า พวกเขาคือ:
ฉันคิดว่าไม่ถูก (500USD และ 800USD ตามลำดับ) แต่ทั้งสองทำงานเป็นเอกเทศของ Excel เอง
สิ่งที่ฉันอยากรู้คือโมดูลส่งออก Excel สำหรับไลค์ของ OpenOffice.org ฉันสงสัยว่าพวกเขาสามารถพอร์ตจาก Java เป็น. Net
ฉันเห็นด้วยเกี่ยวกับการสร้าง XML Spreadsheets ต่อไปนี้เป็นตัวอย่างเกี่ยวกับวิธีการทำ C # 3 (ทุกคนเพียงแค่บล็อกเกี่ยวกับเรื่องนี้ใน VB 9: P) http://www.aaron-powell.com/linq-to-xml-to- สันทัด
ฉันเพิ่งใช้FlexCel.NETและพบว่ามันเป็นห้องสมุดที่ยอดเยี่ยม! ฉันไม่ได้พูดถึงผลิตภัณฑ์ซอฟต์แวร์มากเกินไป ไม่มีจุดที่จะให้ยอดขายทั้งหมดที่นี่คุณสามารถอ่านคุณสมบัติทั้งหมดบนเว็บไซต์ของพวกเขา
มันเป็นผลิตภัณฑ์เชิงพาณิชย์ แต่คุณจะได้แหล่งที่มาเต็มถ้าคุณซื้อ ดังนั้นฉันคิดว่าคุณสามารถรวบรวมมันไว้ในสภาของคุณได้หากคุณต้องการ ไม่เช่นนั้นจะเป็นเพียงแอสเซมบลีพิเศษหนึ่งตัวสำหรับ xcopy - ไม่มีการกำหนดค่าหรือติดตั้งหรืออะไรอย่างนั้น
ฉันไม่คิดว่าคุณจะพบวิธีที่จะทำสิ่งนี้หากไม่มีห้องสมุดบุคคลที่สามในฐานะ. NET Framework แน่นอนว่าไม่ได้มีการสนับสนุนและ OLE Automation เป็นเพียงโลกแห่งความเจ็บปวด
ฉันเขียนโค้ดง่าย ๆ เพื่อส่งออกชุดข้อมูลไปยัง 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();
}
เพียงแค่ต้องการเพิ่มการอ้างอิงอื่นไปยังโซลูชันของบุคคลที่สามที่แก้ไขปัญหาของคุณโดยตรง: http://www.officewriter.com
(ข้อจำกัดความรับผิดชอบ: ฉันทำงานให้กับ SoftArtisans บริษัท ที่สร้าง OfficeWriter)
ต่อไปนี้เป็นวิธีดำเนินการกับ 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 # คือการใช้เครื่องมือเพิ่มประสิทธิภาพการทำงานของ XML เครื่องมือเพิ่มประสิทธิภาพ Open XML มาพร้อมกับการติดตั้ง Open XML SDK เครื่องมือจะแปลงไฟล์ Excel ใด ๆ ให้เป็นรหัส C # รหัส C # สามารถใช้เพื่อสร้างไฟล์นั้นใหม่
ภาพรวมของกระบวนการที่เกี่ยวข้องคือ:
DesiredLook.xlsx
ชื่อมันDesiredLook.xlsx
และคลิกปุ่มรหัสสะท้อนใกล้ด้านบน
เป็นโบนัสวิธีนี้ใช้ได้กับไฟล์ Word และ PowerPoint ในฐานะนักพัฒนา C # คุณจะทำการเปลี่ยนแปลงรหัสเพื่อให้เหมาะกับความต้องการของคุณ
ฉันได้พัฒนาแอพ WPF อย่างง่ายบน githubซึ่งจะทำงานบน Windows เพื่อจุดประสงค์นี้ มีคลาสตัวยึดตำแหน่งGeneratedClass
ซึ่งคุณสามารถวางรหัสที่สร้างได้ หากคุณย้อนกลับไฟล์หนึ่งเวอร์ชันมันจะสร้างไฟล์ excel ดังนี้:
Excel อัตโนมัติที่มีประโยชน์ใน C # คุณสามารถค้นหาได้จากลิงค์ต่อไปนี้
http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm
โบลตัน
ดูตัวอย่างวิธีสร้างไฟล์ Excel
มีตัวอย่างในC #และVB.NET
มันจัดการไฟล์ XSL XSLX และ CSV Excel
xls
หรือเป็นxlsx
ไฟล์หนึ่งในนั้น) ไม่ใช่ข้อกำหนดที่มีโปรแกรมในคอมพิวเตอร์ของคุณที่สามารถอ่านได้ (พูดไบนารี)