Microsoft Office yüklemeden C # içinde nasıl bir Excel (.XLS ve .XLSX) dosyası oluştururum?


1890

Kodu çalıştıran makineye Excel'in yüklenmesini gerektirmeden C # ile bir Excel elektronik tablosunu nasıl oluşturabilirim?


"... Ms Office yüklemeden?" sorunun bir kısmı çok profesyonelce değil. Bir C # programından herhangi bir dosya türü oluşturabilirsiniz ( xlsveya xlsxdosya bunlardan biri olacak şekilde). Bilgisayarınızda onu okuyabilen bir program olması (örneğin, ikili) olması gerekmez.
Mike

30
@Mike "Excel'in yüklenmesini gerektirmeden" parçanın profesyonel olmakla hiçbir ilgisi yoktur. Bu bağımlılıklar hakkında. Sorunun orijinal metni şöyle ifade edildi: "İdeal olarak, açık kaynak istiyorum, bu yüzden koduma herhangi bir üçüncü taraf bağımlılığı eklemek zorunda değilim ve dosyayı (OLE kullanarak doğrudan Excel'i kullanmaktan kaçınmak istiyorum Otomasyon.) " Sorunun büyük ölçüde basitleştirilmesi talihsiz bir durum.
Tony

5
Bir şey sans kütüphanesi veya harici kod yapmaya çalıştığınızı varsayarsak, xls dosyası için konuşamıyorum, ancak xlsx dosyaları için, neden varolan bir dosyayı alıp bir zip dosyasına yeniden adlandırıp içeriği keşfederek başlamıyorsunuz? Biraz tersine mühendislik size biraz söyleyecektir. Çeşitli klasör ve alt klasörlerde birkaç farklı xml dosyası ve rels dosyası vardır. Bunu keşfetmeyi deneyin ve bunun çoğaltabileceğiniz bir şey olup olmadığını görün veya çeşitli xml ad alanları / şemaları ile ilgili belgeleri bulabileceğinizi görün.
Alexander Ryan Baggett

@AlexanderRyanBaggett Bu son derece yardımcı oldu! Otomatik rapor oluşturma üzerinde çalışırken ve bir zip arşivi olarak dokümanları keşfederken bu yazıya rastladım.
SentientFlesh

Yanıtlar:


1055

ExcelLibrary adlı bir kitaplık kullanabilirsiniz. Google Code'da yayınlanan ücretsiz, açık kaynaklı bir kütüphane:

ExcelLibrary

Bu, yukarıda bahsettiğiniz PHP ExcelWriter'ın bir bağlantı noktası gibi görünüyor. Henüz yeni .xlsx biçimine yazmaz, ancak bu işlevselliği içine eklemek için çalışıyorlar.

Çok basit, küçük ve kullanımı kolaydır. Ayrıca, Excel verileriyle kolayca çalışmak için DataSets ve DataTable'ları kullanmanıza izin veren bir DataSetHelper vardır.

ExcelLibrary hala daha eski Excel biçimi (.xls dosyaları) için çalışıyor gibi görünüyor, ancak gelecekte daha yeni 2007/2010 formatları için destek ekliyor olabilir.

Yalnızca Excel 2007/2010 biçimindeki dosyalar (.xlsx dosyaları) için çalışan EPPlus'ı da kullanabilirsiniz . Her ikisi ile de çalışan NPOI var.

Yorumlarda belirtildiği gibi her kitaplıkta bilinen birkaç hata vardır. Toplamda, EPPlus zaman geçtikçe en iyi seçim gibi görünüyor. Daha aktif olarak güncelleniyor ve belgeleniyor gibi görünüyor.

Ayrıca, aşağıdaki @ АртёмЦарионов tarafından belirtildiği gibi, EPPlus'ın Pivot Tabloları için desteği vardır ve ExcelLibrary'nin bazı desteği olabilir ( ExcelLibrary'de Pivot tablosu sorunu )

Hızlı başvuru için birkaç bağlantı:
ExcelLibrary - GNU Küçük GPL
EPPlus - GNU Küçük Genel Kamu Lisansı (LGPL)
NPOI - Apache Lisansı

ExcelLibrary için bazı örnek kod:

Veritabanından veri alan ve bu veritabanından bir çalışma kitabı oluşturan bir örnek. ExcelLibrary kodunun alttaki tek satır olduğunu unutmayın:

//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 dosyasını oluşturmak bu kadar kolaydır. Elle Excel dosyaları da oluşturabilirsiniz, ancak yukarıdaki işlevsellik beni gerçekten etkiledi.


247
ExcelLibrary'nin yerini olağanüstü EPPlus - epplus.codeplex.com almıştır . Jan düzenli olarak günceller. Kullanıyor ve birlikte çalıştığımız en iyi açık kaynaklı projelerden biri.
Mark A

3
Büyük veri kümeleriyle (çok sayıda sütun içeren 5000 satırdan daha büyük) uğraşırken ExcelLibrary'nin çok fazla performans sorunu olduğuna dikkat edilmelidir. Şu anda iş yerinde kod tabanının ağır bir modifikasyonunu yapıyoruz, böylece bir projede kullanabiliriz.
Kasım

EPPlus, ExcelLibrary'den çok daha az hatalı görünüyor, ancak GPL ve bu nedenle sadece açık kaynaklı projeler için bir çözüm.
Seth


6
ClosedXML ne olacak ? Projelerinizde faydalı olabilirim.
Amadeus Sánchez

589

Xlsx biçiminden memnunsanız GitHub projemi EPPlus'ı deneyin . ExcelPackage kaynağından başladı, ancak bugün tam bir yeniden yazma. Aralıkları, hücre stilini, çizelgeleri, şekilleri, resimleri, adlandırılmış aralıkları, Otomatik Filtreyi ve daha birçok şeyi destekler.


77
Lisans artık LGPL, sürüm notlarını burada bulabilirsiniz: epplus.codeplex.com/releases/view/79802
Simon D

13
Örnekler yardımcı oldu. Birkaç saat içinde bu kitaplığı (sürüm 4.x) Microsoft birlikte çalışma kitaplığı (korkunç yavaş) kullanarak kodumu değiştirmek mümkün. Karşılaştırmam iki sekmeli ve yaklaşık 750.000 hücreli bir dosya yazıyor. MS birlikte çalışmasının kullanılması 13 dakika sürdü. EPPlus kullanıldığında yaklaşık 80 saniye hızlandırılmış 10 saniye sürdü. Çok mutlu!
Paul Chernoch

3
Bu iş parçacığındaki netlik için LGPL, yazılımın GPL'nin enfektif kısmı oluşmadan bağlanmasına izin verir. Yalnızca ClosedXml'de yaptığınız kaynak değişikliklerini açmanız veya kaynak kodunu doğrudan uygulamanızın içine (ClosedXml derlemelerine başvurmak yerine) koyarsanız, uygulamanızı açık bir kaynakla açmanız gerekir.
Chris Marisic

4
@Paul Chernoch: Büyük Excel sayfalarını birlikte hızlıca dolduruyoruz. İşin sırrı toplu bir güncelleme yapmak. Bir nesne [,] bloğu oluşturun, bunu doldurun, ardından bu matrisi bir kerede Excel'e yazın: excelWorksheet.get_Range (aralık) .Value2 = block;
Marc Meketon

2
Lisanslama LGPL'den Polyform Noncommercial 1.0.0 lisansına geçiyor gibi görünüyor
Luke

175

Microsoft Office için Açık XML SDK 2.0 kullanmaya ne dersiniz?

Bazı faydaları:

  • Office'in yüklü olmasını gerektirmez
  • Microsoft tarafından yapılmıştır = İyi MSDN belgeleri
  • Projede kullanmak için sadece bir .Net dll
  • SDK, diff, validator vb.Gibi birçok araçla birlikte gelir

Bağlantılar:


3
Bunun için DLL dosyasının 5 MB'den biraz fazla olduğunu ve Office 2007 formatlarıyla sınırlı olduğunu unutmayın. Ama kesinlikle benim için çalışan en kolay ve en hızlı çözüm.
Josh Brown

18
O v2.5 çıktı ve indirilebilir kadar sadece kafaları burada .
Snuffleupagus

10
SDK, XML'i sınıflara modeller, böylece her XML etiketi bir etikete eşlenir ve daha sonra sınıf hiyerarşisini doğru şekilde oluşturmanız gerekir (her örnekte bir alt örnek / etiket koleksiyonu bulunur). Bu, çok karmaşık olan bir Excel dosyasının XML yapısını bilmeniz gerektiği anlamına gelir. Yukarıda bahsedilen EPPlus gibi bir şeyleri basitleştiren bir ambalaj kullanmak çok daha kolaydır.
Tsahi Asher

2
Microsoft Open XML SDK - Açık XML Yazıcısının harika bir örneğini polymathprogrammer.com/2012/08/06/… adresinde bulabilirsiniz veya Stack Overflow çözümüne bakınız stackoverflow.com/questions/11370672/…
Greg

4
Microsoft Open XML SDK'nın Open XML Writer'ı harika buldum. Yukarıdaki çözümleri (Özellikle Vincent Tom'un örneği (Poly Math)) kullanarak, büyük veri kümelerinden akan bir yazar oluşturmak kolaydır ve kayıtları benzer bir şekilde ve yaptığınız şey için çok daha karmaşık olmayan bir şekilde yazar CSV; ama bunun yerine xml yazıyorsunuz. Açık XML, Microsoft'un yeni Office biçimlerini düşündüğü bir zihniyettir. XML içeriklerini incelemek istiyorsanız, bunları her zaman .xslx'den .zip dosyalarına yeniden adlandırabilirsiniz.
Greg

167

Aşağıdaki açık kaynaklı projeleri başarıyla kullandım:

  • OOXML formatları için ExcelPackage (Office 2007)

  • .XLS biçimi için NPOI (Office 2003). NPOI 2.0 (Beta) XLSX'i de destekler.

Blog gönderilerime bir göz atın:

C # içinde Excel elektronik tabloları .XLS ve .XLSX oluşturma

Excel Tablosu ve dinamik Grafik ile NPOI


6
NPOI - Satır ve Sütun referanslarına ilişkin bir not sıfır tabanlıdır. Mevcut bir şablonu doldurmak için iyi çalışır.
John M

108

Excel dosyalarını oluşturmak ve değiştirmek için OLEDB kullanabilirsiniz. Şunu kontrol edin: OLEDB kullanarak Excel'i okuma ve yazma .

Tipik örnek:

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 - Bazı bağlantılar:


4
Birisi x64'te çalışırken bunun işe yarayıp yaramadığını doğrulayabilir mi? Jet'in yalnızca uygulamanız 32 bit modunda derlendiğinde veya çalışıyorsa çalıştığından eminim.
Lamar

2
Bu bağlantıyı yeni test ettim ve Windows Server 2008 R2 x64
RC'de

25
Buna çok dikkat edin - büyük çirkin bir ipucu (örneğin, bazen bir sütun türünü tahmin eder ve uymayan tüm verileri atar).
dbkk

9
Bu yöntemi kullanırken çok dikkatli olunmalıdır. Mükemmel bir formatta olmayan veriler için çok kesintili buldum.
Kenny Mann

9
OleDb'yi büyük bir projede kullanmak zorunda olan bir kişi olarak, SENİN UZAKTA KAL! Bazen biçimi anlayamadığı için bir hücre değerini alamaz. Silme işlemi yok. En küçük bir sağlayıcı değişikliği ile bile tamamen farklı ve öngörülemez çalışır. Kanıtlanmış bir ticari çözüme gidin diyorum.
Caner Öncü

80

Ticari çözüm, SpreadsheetGear for .NET bunu yapacaktır.

Canlı ASP.NET (C # ve VB) örneklerini burada görebilir ve bir değerlendirme sürümünü buradan indirebilirsiniz .

Feragatname: SpreadsheetGear LLC şirketine sahibim


10
Harika bir ürününüz var ama bence buradaki birçok insan ücretsiz çözümler bekliyor. Bu aşağı oyları açıklayabilir.
md1337

65

Kullandığım birkaç seçenek:

XLSX bir zorunluluksa: ExcelPackage iyi bir başlangıçtır, ancak geliştirici üzerinde çalışmayı bıraktığında öldü. ExML oradan aldı ve birkaç özellik ekledi. ExML kötü bir seçenek değil, hala birkaç üretim web sitesinde kullanıyorum.

Tüm yeni projelerim için Apache POI'nin .NET portu olan NPOI kullanıyorum . NPOI 2.0 (Alpha) XLSX'i de destekler.


XLS'yi desteklemeniz gerekiyorsa ExcelPackage'a dikkat edin. Onunla zor zaman geçirdim ve sonunda ExcelLibrary'ye geçtim.
Jeremy

Kesinlikle doğru. ExcelPackage / ExML, yalnızca XLSX desteğine ihtiyacınız varsa iyi bir seçenektir.
Nate

5
ExcelPackage'ın ardılı olduğuna dikkat edin: XLSX'i destekleyen EPPlus ( epplus.codeplex.com ). Örneğin NPOI ile karşılaştırıldığında tek endişem performans, örneğin çok fazla sütun olduğunda.
Pragmateek

63

HTML tablolarını kullanmak için son derece hafif bir seçenek olabilir. Bir dosyada kafa, gövde ve tablo etiketleri oluşturun ve .xls uzantılı bir dosya olarak kaydedin. Çıktıları stilize etmek için kullanabileceğiniz formüller dahil Microsoft'a özgü özellikler vardır.

Bunu bir web uygulamasında kodlamayabileceğinizi anlıyorum, ancak burada bir HTML dosyası aracılığıyla bir Excel dosyasının kompozisyonuna bir örnek . Bu teknik, bir konsol uygulaması, masaüstü uygulaması veya hizmet kodluyorsanız kullanılabilir.


6
Çok ad hoc ama işe yarıyor (açılışta bir uyarı veren excel'den bahsetmiyorum) ve çok basit, bir çözüm olarak bir yere sahip olmayı hak ediyor. Sadece bir excel dosyasını dışa aktarabileceğinizi gösterdiğiniz için :))
Luka Ramishvili

3
Bu çözüm benim için iyi çalıştı, sadece .xlsx uzantısını kullanamayacağınızı unutmayın
Jill

Kuruluşumdaki bazı kişiler Office 2010 ve sonraki sürümlerde bu şekilde yapılan excel dosyalarını açamıyor. Sorunun ne olduğunu bilmiyorum, ama kendi OpenXML uygulamasını kullanmak zorunda kaldım. (Sogger'ın cevabına bakınız)
Kristen

49

Excel 2007/2010 dosyaları oluşturuyorsanız bu açık kaynak projesini deneyin: https://github.com/closedxml/closedxml

XML Belgelerinin zorluklarıyla uğraşmadan dosyaları (VBA'ya benzer) manipüle etmek için nesne yönelimli bir yol sağlar. C # ve Visual Basic (VB) gibi herhangi bir .NET dili tarafından kullanılabilir.

ClosedXML, Excel uygulaması olmadan Excel 2007/2010 dosyaları oluşturmanıza olanak tanır. Tipik bir örnek, bir web sunucusunda Excel raporları oluşturmaktır:

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

9
Bunu oldukça büyük Excel sayfaları oluşturan bir projede kullanmayı denedim. Mükemmel kütüphane, ancak performansı son derece zayıf. Sadece üzerinde çalıştığım proje için bir karşılaştırma yaptım: ClosedXML (v 0.53.3) 92.489 ms alırken EPPlus (v 2.9.03, test için - GPL olduğu için kullanamayız) 16.500 ms sürdü.
Druid

1
@Kaynak LGPL'dir, kaynak kodunu ClosedXML olarak
Chris Marisic


47

Aslında C # 'da bulunan birlikte çalışma sınıflarını kontrol etmek isteyebilirsiniz (örn Microsoft.Office.Interop.Excel. OLE diye bir şey söylemezsiniz (ki bu böyle değildir), ancak birlikte çalışma sınıflarının kullanımı çok kolaydır. Burada C # Belgelerine bakın (Interop for Excel başlar) sayfa 1072).

Onları denemediyseniz etkilenmiş olabilirsiniz.

Lütfen Microsoft'un bu konudaki tutumuna dikkat edin:

Microsoft şu anda herhangi bir katılımsız, etkileşimli olmayan istemci uygulaması veya bileşeninden (ASP, ASP.NET, DCOM ve NT Hizmetleri dahil) Microsoft Office uygulamalarının Otomasyonunu önermemektedir ve desteklememektedir, çünkü Office kararsız davranış ve / veya Office bu ortamda çalıştırıldığında kilitlenme.


6
Ancak her şeyi el ile attığınızdan emin olmalısınız, aksi takdirde bellek sızdırırsınız
MagicKat

8
@Ricky B: Ayrıca, birlikte çalıştığım deneyime göre excel kullanıyor olması. Her kullandığımızda, Excel makineye yüklenmemiş olsaydı, COM istisnaları alırdık.
MagicKat

1
OLE ile, çok dikkatli bertaraflarda bile, sonunda bellek veya çökmelere neden olur. Bu, katılan uygulamalar / iş istasyonları için tartışmasız uygundur, ancak sunucular için önerilmez (MS'in bunu belirten bir KB'si vardır). Sunucumuz için her gece yeniden başlatıyoruz. Yine, bu iyi çalışıyor.
Jennifer Zouak

11
@Geoffrey: ah Tamam, bunun için beni çalıştıracaksın :) -> support.microsoft.com/kb/257757 Microsoft şu anda herhangi bir katılımsız, Microsoft Office uygulamalarının Otomasyonunu önermiyor ve desteklemiyor etkileşimli istemci uygulaması ...
Jennifer Zouak

4
Birlikte tartışmaya bir haftadan fazla uğraştıktan sonra bu tartışmaya geliyorum ve ihtiyaçlarınız çok basit değilse, bu işe yaramayacak. E-tablonuzu biçimlendirme desteği, yalnızca düz bir .csv dosyası değil, bir .xls dosyası oluşturmanın nedeni olan uçurumdur. Örneğin, bir hücrede 911 karakterden fazla çıktı almayı denediniz mi veya birleştirilmiş hücrelerin genişliğini tutarlı bir şekilde ayarlamayı denediniz mi? Ben var, ve şimdi bu saçmalıktan ne kadar nefret ettiğimi söyleyemem ... Kendinize bir iyilik yapın ve bu tartışmada belirtilen ücretsiz kütüphanelerden biriyle gidin.
md1337

34

Burada bir dışa sağlayan tamamen ücretsiz C # kütüphanesi, var DataSet, DataTableveya List<>açık XML kütüphaneleri kullanılarak orijinal bir Excel 2007 .xlsx dosyası içine:

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

Tam kaynak kodu - ücretsiz olarak - talimatlar ve bir demo uygulaması ile birlikte sağlanır.

Bu sınıfı uygulamanıza ekledikten sonra, DataSet'inizi yalnızca bir kod satırında Excel'e aktarabilirsiniz:

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

Bundan daha basit olamaz ...

Ve Excel'in sunucunuzda bulunmasını bile gerektirmez.


1
Tüm özellikleri almak için bir bağış istediğiniz için bu biraz yanıltıcı görünüyor.
UrbanEsc

Bu kısmen doğrudur: Tamamen ücretsiz sürüm sizin için mükemmel bir .xlsx dosyası oluşturur ve tüm kaynak kodu sağlanır. Bu iki hayır kurumundan birine 10 $ veya daha fazla bağışta bulunursanız (kesinlikle hiçbir şey almıyorum), o zaman biçimlendirme, tarihler vb. Nasıl yapılacağını gösteren "daha iyi" bir sürüm elde edersiniz. iyi bir amaç için 10 $ bağışlamak buna değer!
Mike Gledhill


23

GemBox.Spreadsheet'e bakmak isteyebilirsiniz .

İhtiyaçlarınız dahilinde ise, tüm özelliklere sahip ücretsiz bir sürümleri vardır, ancak sayfa başına 150 satır ve çalışma kitabı başına 5 sayfa ile sınırlıdır.

Henüz kendim kullanmam gerekmiyordu, ama ilginç görünüyor.


21

Syncfusion Essential XlsIO bunu yapabilir. Microsoft Office'e bağımlı değildir ve ayrıca farklı platformlar için özel bir desteği vardır.

Kod örneği:

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

Hak sahibi olursanız , tüm kontrol paketi topluluk lisans programı aracılığıyla ücretsiz olarak kullanılabilir (gelirden 1 milyon ABD dolarından az). Not: Syncfusion için çalışıyorum.


18

İyi,

Aspose gibi bir üçüncü taraf kitaplığı da kullanabilirsiniz .

Bu kütüphane, Excel'in makinenize yüklenmesini gerektirmemesi avantajına sahiptir, bu da sizin durumunuz için idealdir.


Daha kesin olmak gerekirse şunu kullanabilirsiniz: .NET uygulamanızda Excel (XLS, XLSX) dosyaları oluşturmak için Aspose.Cells for .NET'i .
Shahzad Latif

9
Evet, 999 $ 'lık minimum lisans ücreti ödemeyi düşünmezseniz yapabilirsiniz. 999 $ daha ucuz olan MikesKnowledgeBase kütüphanesini deneyin!
Mike Gledhill

17

OpenXML, MS Excel'in Sunucuya yüklenmesini önlemeye yardımcı olan iyi bir alternatiftir. Microsoft tarafından sağlanan Open XML SDK 2.0, Open XML paketlerini ve bir paket içindeki temel Açık XML şema öğelerini değiştirme görevini basitleştirir. Açık XML Uygulama Programlama Arabirimi (API), geliştiricilerin Açık XML paketlerinde gerçekleştirdiği birçok genel görevi içerir.

Bunu inceleyin OpenXML: Sunucuya MS Excel'i yüklemekten kaçınmaya yardımcı olan alternatif


17

Çeşitli Office 2003 XML kitaplıkları küçük excel dosyaları için oldukça iyi çalışır. Ancak, XML biçiminde kaydedilmiş büyük bir çalışma kitabının boyutunun bir sorun olduğunu düşünüyorum. Örneğin, birlikte çalıştığım bir çalışma kitabı yeni (ve kuşkusuz daha sıkı bir şekilde paketlenmiş) XLSX biçiminde 40 MB olacaktır.

Araştırmam beni götürdüğü kadarıyla, eski ikili dosya formatlarına çıktıya izin veren iki ticari paket var. Onlar:

İkisi de ucuz değil (sırasıyla 500USD ve 800USD). ancak her ikisi de Excel'in kendisinden bağımsız çalışır.

Merak ettiğim şey OpenOffice.org gibi Excel çıktı modülü. Acaba Java'dan .Net'e taşınabilir mi?


Bu hem .net hem de java üzerinde çalışır ve pahalı değildir. SmartXLS smartxls.com
liya


15

Son zamanlarda FlexCel.NET'i kullandım ve mükemmel bir kütüphane ! Çok fazla yazılım ürünü hakkında bunu söylemiyorum. Tüm satış konuşmasını burada vermenin bir anlamı yok, web sitesindeki tüm özellikleri okuyabilirsiniz.

Ticari bir üründür, ancak satın alırsanız tam kaynağı alırsınız. Bu yüzden eğer gerçekten isteseydiniz bunu derlemenize derleyebilirsiniz. Aksi takdirde xcopy için sadece bir ekstra montaj - yapılandırma veya kurulum veya bunun gibi bir şey yok.

Üçüncü taraf kütüphaneler olmadan bunu yapmanın herhangi bir yolunu bulacağınızı sanmıyorum.


15

System.IO.StreamWriter kullanarak excel nesnesini kullanmadan excel veri kümesini vermek için basit bir kod yazdım.

Aşağıda, tüm tabloları veri kümesinden okuyacak ve tek tek sayfalara yazacak olan kod bulunmaktadır. Bu makaleden yardım aldım .

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
Makalenin dediği gibi, Excel'in aslında bir XLS dosyası olmaktan ziyade okuyacağı XML, bu da e-tabloları okuyan diğer programlarda değil, yalnızca Excel'de çalışabileceği anlamına gelir. Ama muhtemelen burada eşdeğer HTML tablosunun cevaplarından daha iyi!
Rup

Xlsx'i destekler ? OpenXML ?
Kiquenet

14

Yalnızca sorununuzu doğrudan ele alan bir üçüncü taraf çözümüne başka bir referans eklemek istiyorum: http://www.officewriter.com

(Feragatname: OfficeWriter yapan SoftArtisans için çalışıyorum)



12

Örnek kodla birlikte, LINQ to XML ile yapmanın bir yolu:

LINQ ile Excel Verilerini XML'ye Hızla İçeri ve Dışarı Aktarma

İsim alanlarını vb. İçe aktarmanız gerektiğinden biraz karmaşıktır, ancak harici bağımlılıklardan kaçınmanıza izin verir.

(Ayrıca, elbette, C # değil VB .NET'dir, ancak VB .NET öğelerini her zaman kendi projesinde XML Değişmezlerini kullanmak ve C # 'da her şeyi yapmak için izole edebilirsiniz.)


12

Infragistics veya Syncfusion gibi bazı üçüncü taraf bileşen satıcıları, Microsoft Excel'in yüklenmesini gerektirmeyen çok iyi Excel dışa aktarma özellikleri sağlar.

Bu satıcılar ayrıca gelişmiş kullanıcı arabirimi ızgarası bileşenleri sağladığından, bir excel dışa aktarmanın stili ve düzeninin, uygulamanızın kullanıcı arabirimindeki bir ızgaranın geçerli durumunu taklit etmesini istiyorsanız, bu bileşenler özellikle kullanışlıdır.

Dışa aktarma işleminizin, dışa aktarılacak verilere vurgu yapılarak ve kullanıcı arayüzüne bağlantı olmadan sunucu tarafında yürütülmesi amaçlanıyorsa, ücretsiz açık kaynak seçeneklerinden birini (örneğin ExcelLibrary) tercih ederim.

Daha önce Microsoft Office paketinde sunucu tarafı otomasyonu kullanmaya çalışan projelerle ilgilenmiştim. Bu deneyime dayanarak, bu yaklaşıma karşı şiddetle tavsiye ediyorum.


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

Merhaba bu çözüm, ızgara görünümünüzü excel dosyanıza dışa aktarmaktır.


7
Hayır, bu, gerçek bir Excel dosyası yerine Excel dosyası olarak işaretlenmiş HTML üretir. Evet, Excel'in kendisi bu Tamam'ı açacaktır, ancak elektronik tabloları tüketen diğer programlar - örneğin Microsoft'un ücretsiz Excel görüntüleyicisi dahil - kabul etmeyecektir. Buradaki kitaplıklardan birini kullanarak gerçek bir Excel dosyası oluşturmak daha iyi olur.
Rup

Ayrıca , boşluk vb. İçeren dosya adlarıyla başa çıkacak bir dize eklemek yerine içerik düzenleme başlık metni oluşturmak için System.Net.Mime.ContentDisposition öğesini kullanmalısınız .
Rup

12

Bu kitaplığı kullanarak güzel biçimlendirilmiş Excel dosyaları oluşturabilirsiniz: http://officehelper.codeplex.com/documentation
Aşağıdaki örneğe bakın:

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

nerede örnek böyle bakmak:

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

C #'dan bir Excel dosyası oluşturmanın en basit ve en hızlı yolu Açık XML Üretkenlik Aracı'nı kullanmaktır. Açık XML Üretkenlik Aracı, Açık XML SDK yüklemesi ile birlikte gelir. Araç tersine herhangi bir Excel dosyasını C # koduna dönüştürür. C # kodu daha sonra bu dosyayı yeniden oluşturmak için kullanılabilir.

İlgili sürece genel bir bakış:

  1. Open XML SDK'sını araçla yükleyin.
  2. İstediğiniz görünüme sahip en son Excel istemcisini kullanarak bir Excel dosyası oluşturun. Ad verin DesiredLook.xlsx.
  3. Araç açıkken DesiredLook.xlsxüst taraftaki Kodu Yansıt düğmesini tıklayın. resim açıklamasını buraya girin
  4. Dosyanızın C # kodu aracın sağ bölmesinde oluşturulur. Bunu C # çözümünüze ekleyin ve istediğiniz görünüme sahip dosyalar oluşturun.

Bonus olarak, bu yöntem herhangi bir Word ve PowerPoint dosyası için çalışır. C # geliştiricisi olarak, gereksinimlerinize uyacak şekilde kodda değişiklikler yaparsınız.

Github üzerinde bu amaçla Windows üzerinde çalışacak basit bir WPF uygulaması geliştirdim . GeneratedClassOluşturulan kodu yapıştırabileceğiniz bir yer tutucu sınıf var . Dosyanın bir sürümünü geri giderseniz, böyle bir excel dosyası oluşturur:

resim açıklamasını buraya girin


1
Bu Açık XML SDK çözümünü henüz denemedim ama Vay be, kesinlikle kontrol edeceğim. Uzun yıllar böyle aletlerle çalıştım ve bunu bilmiyordum. Ben .NET ile XLSX dosyaları dönüştürmek için kendi basit FOSS yayımladım: github.com/TonyGravagno/NebulaXConvert
TonyG


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.