Câu hỏi Tạo tệp Excel (.XLS và .XLSX) từ C #


Làm cách nào để tạo Bảng tính Excel với C # mà không yêu cầu Excel được cài đặt trên máy đang chạy mã?


1571


gốc


Bạn không chắc liệu đây có phải là địa điểm phù hợp hay không, nhưng hãy xem tại ClosedXML. Nó đặt giới hạn> 2003 vào mã của bạn, nhưng cho đến nay chúng tôi đã sử dụng nó với thành công lớn. - Carl
Điều này có thể được thực hiện chỉ với .NET Framework, như mô tả đâyhoặc dễ dàng hơn với một số thư viện như GemBox.Spreadsheet. - NixonUposseen


Các câu trả lời:


Bạn có thể sử dụng thư viện có tên là ExcelLibrary. Đó là thư viện mã nguồn mở miễn phí được đăng trên Google Code:

ExcelLibrary

Điều này có vẻ là một cổng của PHP ExcelWriter mà bạn đã đề cập ở trên. Nó sẽ không ghi vào định dạng .xlsx mới, nhưng chúng đang làm việc để thêm chức năng đó vào.

Nó rất đơn giản, nhỏ và dễ sử dụng. Thêm vào đó nó có một DataSetHelper cho phép bạn sử dụng DataSets và DataTables để dễ dàng làm việc với dữ liệu Excel.

ExcelLibrary dường như vẫn chỉ hoạt động đối với định dạng Excel cũ hơn (các tệp .xls), nhưng có thể thêm hỗ trợ trong tương lai cho các định dạng 2007/2010 mới hơn.

Bạn cũng có thể dùng EPPlus, chỉ hoạt động cho các tệp định dạng Excel 2007/2010 (tệp .xlsx).

Có một vài lỗi đã biết với mỗi thư viện như đã lưu ý trong phần bình luận. Trong tất cả, EPPlus có vẻ là sự lựa chọn tốt nhất khi thời gian trôi qua. Dường như nó được cập nhật và tài liệu tích cực hơn.

Ngoài ra, như được ghi chú bởi @ АртёмЦарионов bên dưới, EPPlus có hỗ trợ cho Pivot Tables và ExcelLibrary có thể có một số hỗ trợ (Vấn đề bảng tổng hợp trong ExcelLibrary)

Dưới đây là một vài liên kết để tham khảo nhanh:
ExcelLibrary - - GNU Lesser GPL
EPPlus - - Giấy phép Công cộng Ít hơn GNU (LGPL)

Dưới đây là một số mã ví dụ cho ExcelLibrary:

Đây là một ví dụ lấy dữ liệu từ một cơ sở dữ liệu và tạo một sổ làm việc từ nó. Lưu ý rằng mã ExcelLibrary là dòng đơn ở dưới cùng:

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

Tạo tệp Excel dễ dàng như vậy. Bạn cũng có thể tạo các tệp Excel theo cách thủ công, nhưng chức năng ở trên là những gì thực sự gây ấn tượng với tôi.


877



ExcelLibrary đã được thay thế bởi EPPlus đặc biệt - epplus.codeplex.com. Jan cập nhật thường xuyên. Đã sử dụng nó và nó là một trong những dự án mã nguồn mở tốt nhất mà chúng tôi đã làm việc cùng. - Mark A
Không. Sử dụng EppPlus - epplus.codeplex.com. Đó là lớn nhất mới nhất. Hỗ trợ định dạng. Tôi dùng nó. - Bill Paetzke
Có vẻ như ExcelLibrary chỉ hỗ trợ .xls và EPPlus .xlsx để chúng bổ sung cho nhau. - jmster
-1 Nếu bạn đang đi để đăng mẫu mã, bạn cũng có thể chắc chắn rằng nó là chính xác. Sử dụng phương pháp Vứt bỏ giao diện này để giải phóng tài nguyên không được quản lý một cách rõ ràng cùng với bộ thu gom rác. Người tiêu dùng của một đối tượng có thể gọi phương thức này khi đối tượng không còn cần thiết nữa. - ta.speot.is
Vui lòng ngừng chuyển tiếp EPPlus như là một thay thế cho ExcelLibrary cho đến khi nó có khả năng cùng chức năng (một xử lý XLS, XLSX khác). Nhiều như tôi thích EPPlus, nó đơn giản không phải là câu trả lời cho các nhu cầu của OP (XLS). - Chris Rogers


Nếu bạn hài lòng với định dạng xlsx, hãy thử codeplex Dự án GitHub. EPPlus. Bắt đầu nó với nguồn từ ExcelPackage, nhưng hôm nay nó là một tổng số viết lại. Hỗ trợ phạm vi, kiểu dáng ô, biểu đồ, hình dạng, hình ảnh, tên trang, bộ lọc tự động và nhiều thứ khác.


491



Thư viện hoàn toàn miễn phí của tôi cũng cho phép bạn xuất bất kỳ DataSet, DataTable hoặc List <> trực tiếp vào tệp .xlsx của Excel 2007, sử dụng Open XML. Mã nguồn đầy đủ và bản trình diễn có tại đây: mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm - Mike Gledhill
Giấy phép hiện là LGPL, ghi chú phát hành tại đây: epplus.codeplex.com/releases/view/79802 - Simon D
Các ví dụ là hữu ích. Tôi đã có thể thay đổi mã của tôi từ việc sử dụng thư viện interop của Microsoft (chậm khủng khiếp) đến thư viện này (phiên bản 4.x) trong một vài giờ. Điểm chuẩn của tôi viết một tệp với hai tab và khoảng 750.000 ô. Sử dụng MS interop phải mất 13 phút. Sử dụng EPPlus mất 10 giây, tăng tốc khoảng 80 lần. Rất vui! - Paul Chernoch
@ JanKällman Bạn nên cập nhật trang CodePlex của mình để hiển thị các phương thức này: LoadFromCollection<T>, LoadFromDataTable vv (tìm thấy qua đây) - PeterX
Để rõ ràng trong chủ đề này, LGPL cho phép phần mềm được liên kết mà không có phần lây nhiễm của GPL xảy ra. Bạn chỉ cần mở các thay đổi nguồn bạn thực hiện đối với ClosedXml hoặc nếu bạn trực tiếp đặt mã nguồn (trái với tham chiếu các hội đồng ClosedXml) bên trong ứng dụng của bạn thì bạn cần phải mở nguồn ứng dụng của mình. - Chris Marisic


Tôi đã sử dụng thành công với các dự án mã nguồn mở sau đây:

  • ExcelPackage cho các định dạng OOXML (Office 2007)

  • NPOI cho định dạng .XLS (Office 2003). NPOI 2.0 (Alpha) cũng hỗ trợ XLSX.

Hãy xem các bài đăng trên blog của tôi:

Tạo bảng tính Excel .XLS và .XLSX trong C #

NPOI với Bảng Excel và Biểu đồ động


147



Một lưu ý về NPOI - Các tham chiếu hàng và cột là không dựa trên. Làm việc tốt để điền một mẫu hiện có. - John M
NPOI 2 hiện đang trong giai đoạn Beta và tôi đã sử dụng nó trong các dự án của mình để xuất khẩu đơn giản mà không gặp vấn đề gì. - Travis
Nó hoạt động. Nó cũng có một số tên không gian tên và lớp không gian tồi tệ nhất từng được phát minh - bắt chước định dạng dữ liệu cơ bản, thay vì chế nhạo nó. - Roman Starkov
Câu hỏi này và câu trả lời của nó thực sự cũ. NPOI bây giờ là con đường để đi, và tôi muốn câu trả lời này là ở đầu trang trước khi tôi lãng phí thời gian của tôi với EPPlus và ExcelLibrary cố gắng để có được một giải pháp mà làm việc cho cả hai .xls và .xlsx Nhận C # tải từ npoi.codeplex.com. Và tài liệu tốt nhất tôi đã tìm thấy, mặc dù nó là phiên bản Java poi.apache.org - SurfingSanta
NPOI đã chuyển từ Codeplex sang Github. - jerhewet


Còn việc sử dụng Open XML SDK 2.0 cho Microsoft Office thì sao?

Một vài lợi ích:

  • Không yêu cầu cài đặt Office
  • Được tạo bởi Microsoft = tài liệu MSDN phong nha
  • Chỉ cần một. Net dll để sử dụng trong dự án
  • SDK đi kèm với nhiều công cụ như diff, validator, v.v.

Liên kết:


141



Quan trọng cần lưu ý rằng DLL cho điều này chỉ hơn 5 MB và giới hạn ở định dạng Office 2007. Nhưng chắc chắn là giải pháp dễ nhất và nhanh nhất có hiệu quả đối với tôi. - Josh Brown
Chỉ cần thông báo rằng v2.5 đã hết và có thể được tải xuống đây. - Snuffleupagus
SDK mô hình XML thành các lớp, để mỗi thẻ XML được ánh xạ tới một thẻ, và sau đó bạn phải xây dựng hệ thống phân cấp lớp (mỗi cá thể có một tập hợp các cá thể / thẻ con) một cách chính xác. Điều này có nghĩa là bạn phải biết cấu trúc XML của một tệp Excel, điều này rất phức tạp. Nó dễ dàng hơn nhiều để sử dụng một wrapper như EPPlus, đã đề cập ở trên, mà đơn giản hóa mọi thứ. - Tsahi Asher
Một mẫu tuyệt vời của Microsoft Open XML SDK - Open XML Writer có thể được tìm thấy tại polymathprogrammer.com/2012/08/06/…  Hoặc xem giải pháp Stack Overflow stackoverflow.com/questions/11370672/… - Greg
Tôi tìm thấy Open XML Writer của Microsoft Open XML SDK là tuyệt vời. Sử dụng các giải pháp trên, (đặc biệt là mẫu của Vincent Tom (Poly Math)), thật dễ dàng để xây dựng một nhà văn truyền qua các bộ dữ liệu lớn và viết các bản ghi theo cách tương tự và không phức tạp hơn nhiều so với những gì bạn muốn làm CSV; nhưng thay vào đó bạn viết xml. Mở XML là tư duy mà Microsoft coi đó là các định dạng Office mới. Và bạn luôn có thể đổi tên chúng từ tệp .xslx thành tệp .zip nếu bạn cảm thấy muốn chọc vào nội dung XML của chúng. - Greg


Bạn có thể sử dụng OLEDB để tạo và thao tác các tệp Excel. Kiểm tra điều này: Đọc và Viết Excel bằng OLEDB.

Ví dụ điển hình:

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

EDIT - Một số liên kết khác:


95



Ai đó có thể xác nhận nếu điều này hoạt động khi chạy trong x64? Tôi khá chắc chắn Jet chỉ hoạt động nếu ứng dụng của bạn được biên dịch hoặc chạy ở chế độ 32 bit. - Lamar
Tôi vừa thử nghiệm kết nối này và nó không thành công trên Windows Server 2008 R2 x64 RC, có vẻ như người ta phải cài đặt Trình điều khiển Hệ thống Office 2007: Thành phần Dữ liệu Kết nối [microsoft.com/downloads/… - Chris Richner
Hãy rất cẩn thận với điều này - đó là một cludge xấu xí lớn (ví dụ, đôi khi nó đoán một loại cột và loại bỏ tất cả các dữ liệu không phù hợp). - dbkk
Người ta phải rất cẩn thận nếu sử dụng phương pháp này. Tôi thấy nó rất dễ bị dữ liệu không có định dạng hoàn hảo. - Kenny Mann
Là một người đã phải sử dụng OleDb trong một dự án lớn, tôi nói NGAY BÂY GIỜ TỪ IT! Đôi khi nó không thể lấy ra một giá trị ô chỉ vì nó không thể hiểu được định dạng. Nó không có thao tác xóa. Nó hoạt động hoàn toàn khác nhau và không thể đoán trước ngay cả với một sự thay đổi nhà cung cấp nhỏ nhất. Tôi muốn nói đi cho một giải pháp thương mại đã được chứng minh. - Caner Öncü


Giải pháp thương mại, Bảng tínhGear for .NET sẽ làm điều đó.

Bạn có thể xem các mẫu ASP.NET (C # và VB) trực tiếp đây và tải xuống phiên bản đánh giá đây.

Tuyên bố từ chối trách nhiệm: Tôi sở hữu SpreadsheetGear LLC


73



Bạn có một sản phẩm tuyệt vời nhưng tôi nghĩ rất nhiều người ở đây đang mong đợi các giải pháp miễn phí. Điều đó có thể giải thích các phiếu bầu xuống. - md1337


Một vài tùy chọn tôi đã sử dụng:

Nếu XLSX là phải: ExcelPackage là một khởi đầu tốt nhưng đã chết khi nhà phát triển ngừng hoạt động trên đó. ExML nhặt từ đó và thêm một vài tính năng. ExML không phải là một lựa chọn tồi, tôi vẫn đang sử dụng nó trong một vài trang web sản xuất.

Tuy nhiên, đối với tất cả các dự án mới của tôi, tôi đang sử dụng NPOI, cổng .NET của Apache POI. NPOI 2.0 (Alpha) cũng hỗ trợ XLSX.


56



Hãy cẩn thận với ExcelPackage nếu bạn cần hỗ trợ XLS. Tôi đã có một thời gian khó khăn với nó và cuối cùng chuyển sang ExcelLibrary. - Jeremy
Chắc chắn là đúng. ExcelPackage / ExML chỉ là một lựa chọn tốt nếu bạn cần hỗ trợ XLSX. - Nate
Lưu ý rằng ExcelPackage có một người kế thừa: EPPlus (epplus.codeplex.com) hỗ trợ XLSX. Mối quan tâm duy nhất của tôi, so với NPOI chẳng hạn, là hiệu suất, ví dụ: khi có nhiều cột. - Pragmateek


Một tùy chọn cực kỳ nhẹ có thể là sử dụng các bảng HTML. Chỉ cần tạo thẻ head, body và table trong một tệp và lưu nó dưới dạng tệp có đuôi .xls. Có các thuộc tính cụ thể của Microsoft mà bạn có thể sử dụng để tạo kiểu cho đầu ra, bao gồm các công thức.

Tôi nhận ra rằng bạn có thể không mã hóa điều này trong một ứng dụng web, nhưng đây là một thí dụ về thành phần của tệp Excel qua bảng HTML. Kỹ thuật này có thể được sử dụng nếu bạn đang viết mã ứng dụng bảng điều khiển, ứng dụng dành cho máy tính để bàn hoặc dịch vụ.


54



Đó là quảng cáo hoc nhưng nó hoạt động (chưa kể excel đưa ra một cảnh báo về việc mở) và rất đơn giản, nó xứng đáng để có một nơi như một giải pháp. Mặc dù chỉ cho thấy rằng bạn có thể xuất một tập tin excel :)) - Luka Ramishvili
Giải pháp này làm việc tốt cho tôi, chỉ cần lưu ý bạn không thể sử dụng phần mở rộng .xlsx - Jill
Một số người trong tổ chức của tôi không thể mở các tệp excel được thực hiện theo cách này trong Office 2010 trở lên. Không biết vấn đề là gì, nhưng tôi đã phải triển khai OpenXML của riêng mình. (xem câu trả lời của Sogger) - Kristen Hammack