Bagaimana cara membuat file Excel (.XLS dan .XLSX) dalam C # tanpa menginstal Microsoft Office?

1892

Bagaimana saya bisa membuat lembar bentang Excel dengan C # tanpa memerlukan Excel untuk diinstal pada mesin yang menjalankan kode?

mistrmark
sumber
"... tanpa menginstal Ms Office?" bagian dari pertanyaan itu terdengar sangat tidak profesional. Anda dapat menghasilkan semua jenis file dari program C # (dengan salah satu file xlsatau xlsxsalah satunya). Ini bukan persyaratan bahwa ada program di komputer Anda yang dapat membacanya (katakanlah, biner).
Mike
30
@ Mike Sepotong "tanpa membutuhkan Excel untuk diinstal" tidak ada hubungannya dengan menjadi profesional. Ini tentang ketergantungan. Teks asli dari pertanyaan diucapkan sebagai: "Idealnya, saya ingin open source jadi saya tidak perlu menambahkan dependensi pihak ketiga ke kode saya, dan saya ingin menghindari menggunakan Excel secara langsung untuk membuat file (menggunakan OLE Otomasi.) " Sayangnya pertanyaan itu disederhanakan secara drastis.
Tony
5
Dengan asumsi Anda mencoba melakukan sesuatu tanpa perpustakaan atau kode eksternal, saya tidak dapat berbicara untuk file xls, tetapi untuk file xlsx, mengapa tidak memulai dengan mengambil yang sudah ada, mengganti nama file tersebut menjadi file zip dan menjelajahi isinya? Sedikit teknik terbalik akan memberi tahu Anda sedikit. Ada beberapa file xml yang berbeda dan menghubungkan file dalam berbagai folder dan subfolder. Coba jelajahi dan lihat apakah itu sesuatu yang dapat Anda tiru atau lihat apakah Anda dapat menemukan dokumentasi di berbagai ruang nama xml / skema.
Alexander Ryan Baggett
@AlexanderRyanBaggett Ini sangat membantu! Datang melintasi pos ini saat bekerja pada pembuatan laporan otomatis dan menjelajahi dokumen sebagai arsip zip memberikan cukup banyak wawasan tentang apa yang terjadi dalam membuat file dokumen.
SentientFlesh

Jawaban:

1055

Anda dapat menggunakan perpustakaan yang disebut ExcelLibrary. Ini adalah perpustakaan sumber terbuka gratis yang diposting di Google Code:

Perpustakaan Excel

Ini terlihat sebagai port dari PHP ExcelWriter yang Anda sebutkan di atas. Itu belum akan menulis ke format .xlsx baru, tetapi mereka sedang berusaha menambahkan fungsionalitas itu di.

Ini sangat sederhana, kecil dan mudah digunakan. Plus itu memiliki DataSetHelper yang memungkinkan Anda menggunakan DataSets dan DataTables untuk dengan mudah bekerja dengan data Excel.

ExcelLibrary tampaknya masih hanya berfungsi untuk format Excel yang lebih lama (file .xls), tetapi mungkin menambahkan dukungan di masa depan untuk format 2007/2010 yang lebih baru.

Anda juga dapat menggunakan EPPlus , yang hanya berfungsi untuk file format Excel 2007/2010 (file .xlsx). Ada juga NPOI yang berfungsi dengan baik.

Ada beberapa bug yang diketahui dengan masing-masing perpustakaan seperti yang tercantum dalam komentar. Secara keseluruhan, EPPlus tampaknya menjadi pilihan terbaik seiring berjalannya waktu. Tampaknya lebih aktif diperbarui dan didokumentasikan juga.

Selain itu, seperti yang dicatat oleh @ АртёмЦарионов di bawah, EPPlus memiliki dukungan untuk Pivot Tables dan ExcelLibrary mungkin memiliki beberapa dukungan ( masalah tabel Pivot di ExcelLibrary )

Berikut adalah beberapa tautan untuk referensi cepat:
ExcelLibrary - GNU Lesser GPL
EPPlus - GNU Lesser General Public License (LGPL)
NPOI - Lisensi Apache

Berikut beberapa contoh kode untuk ExcelLibrary:

Berikut adalah contoh mengambil data dari database dan membuat buku kerja dari itu. Perhatikan bahwa kode ExcelLibrary adalah baris tunggal di bagian bawah:

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

Membuat file Excel semudah itu. Anda juga dapat secara manual membuat file Excel, tetapi fungsionalitas di atas sangat mengesankan saya.

Mike Webb
sumber
247
ExcelLibrary telah digantikan oleh EPPlus yang luar biasa - epplus.codeplex.com . Jan memperbaruinya secara teratur. Telah menggunakannya dan ini adalah salah satu proyek open source terbaik yang pernah kami tangani.
Mark A
3
Perlu dicatat bahwa ExcelLibrary memiliki banyak masalah kinerja ketika berhadapan dengan dataset besar (lebih dari 5000 baris dengan banyak kolom). Saat ini sedang melakukan modifikasi besar-besaran pada basis kode di tempat kerja sehingga kami dapat menggunakannya dalam suatu proyek.
rossisdead
EPPlus tampaknya jauh lebih tidak stabil daripada ExcelLibrary, TETAPI itu adalah GPL dan karenanya hanya solusi untuk proyek sumber terbuka.
Seth
6
Bagaimana dengan ClosedXML ? Saya mungkin terbukti bermanfaat dalam proyek Anda.
Amadeus Sánchez
589

Jika Anda puas dengan format xlsx, coba proyek GitHub saya, EPPlus . Itu dimulai dengan sumber dari ExcelPackage, tetapi hari ini adalah penulisan ulang total. Ini mendukung rentang, penataan sel, bagan, bentuk, gambar, rentang bernama, AutoFilter dan banyak hal lainnya.

Jan Källman
sumber
77
Lisensi sekarang LGPL, lepaskan catatan di sini: epplus.codeplex.com/releases/view/79802
Simon D
13
Contoh-contohnya sangat membantu. Saya dapat mengubah kode saya dari menggunakan perpustakaan interop Microsoft (sangat lambat) ke perpustakaan ini (versi 4.x) dalam beberapa jam. Benchmark saya menulis file dengan dua tab dan sekitar 750.000 sel. Menggunakan MS interop butuh 13 menit. Menggunakan EPPlus butuh 10 detik, kecepatan sekitar 80x. Sangat senang!
Paul Chernoch
3
Untuk kejelasan dalam utas ini, LGPL memungkinkan perangkat lunak untuk dihubungkan tanpa bagian infektif dari GPL. Anda hanya perlu membuka perubahan sumber yang Anda buat ke ClosedXml atau jika Anda langsung memasukkan kode sumber (sebagai ganti referensi rakitan ClosedXml) di dalam aplikasi Anda maka Anda perlu membuka sumber aplikasi Anda.
Chris Marisic
4
@ Paul Chernoch: Kami mengisi lembar Excel besar dengan interop dengan sangat cepat. Rahasianya adalah melakukan pembaruan massal. Buat objek [,] blok, isi itu, lalu tulis matriks itu ke Excel pada satu waktu: excelWorksheet.get_Range (range) .Value2 = blok;
Marc Meketon
2
Sepertinya perizinan sedang beralih dari LGPL ke Polyform Noncommercial 1.0.0 lisensi
Luke
175

Dan bagaimana dengan menggunakan Open XML SDK 2.0 untuk Microsoft Office?

Beberapa manfaat:

  • Tidak memerlukan Office diinstal
  • Dibuat oleh Microsoft = dokumentasi MSDN yang layak
  • Hanya satu. Net dll untuk digunakan dalam proyek
  • SDK dilengkapi dengan banyak alat seperti diff, validator, dll

Tautan:

Sogger
sumber
3
Penting untuk dicatat bahwa DLL untuk ini hanya lebih dari 5 MB dan terbatas pada format Office 2007. Tapi tentu saja solusi termudah dan tercepat yang bekerja untuk saya.
Josh Brown
18
Hanya kepala yang v2.5 keluar dan dapat didownload di sini .
Snuffleupagus
10
SDK memodelkan XML ke dalam kelas, sehingga setiap tag XML dipetakan ke sebuah tag, dan kemudian Anda harus membangun hierarki kelas (setiap instance memiliki koleksi instance / tag anak) dengan benar. Ini berarti Anda harus mengetahui struktur XML dari file Excel, yang sangat rumit. Lebih mudah menggunakan pembungkus seperti EPPlus, yang disebutkan di atas, yang menyederhanakan banyak hal.
Tsahi Asher
2
Contoh hebat dari Microsoft Open XML SDK - Open XML Writer dapat ditemukan di polymathprogrammer.com/2012/08/06/… Atau lihat solusi Stack Overflow stackoverflow.com/questions/11370672/…
Greg
4
Saya menemukan Microsoft Open XML Writer Open XML SDK menjadi hebat. Menggunakan solusi di atas, (Terutama sampel Vincent Tom (Poly Math)), mudah untuk membangun seorang penulis yang mengalir melalui set besar data, dan menulis catatan dengan cara yang serupa dan tidak terlalu jauh lebih kompleks dengan apa yang akan Anda lakukan untuk CSV; tetapi Anda malah menulis xml. Open XML adalah pola pikir yang oleh Microsoft menganggap itu format Office baru. Dan Anda selalu dapat mengubah nama dari file .xslx ke .zip jika Anda ingin menyodok konten XML mereka.
Greg
167

Saya telah menggunakan dengan sukses proyek open source berikut:

  • ExcelPackage untuk format OOXML (Office 2007)

  • NPOI untuk format .XLS (Office 2003). NPOI 2.0 (Beta) juga mendukung XLSX.

Lihatlah posting blog saya:

Membuat lembar kerja Excel .XLS dan .XLSX di C #

NPOI dengan Tabel Excel dan Bagan dinamis

Leniel Maccaferri
sumber
6
Catatan tentang NPOI - Referensi Baris dan Kolom berbasis nol. Bekerja dengan baik untuk mengisi template yang ada.
John M
108

Anda dapat menggunakan OLEDB untuk membuat dan memanipulasi file Excel. Periksa ini: Membaca dan Menulis Excel menggunakan OLEDB .

Contoh umum:

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 - Beberapa lagi tautan:

Panos
sumber
4
Adakah yang bisa mengkonfirmasi apakah ini berfungsi saat berjalan di x64? Saya cukup yakin Jet hanya berfungsi jika aplikasi Anda dikompilasi atau dijalankan dalam mode 32-bit.
Lamar
2
Saya baru saja menguji koneksi ini dan gagal pada Windows Server 2008 R2 x64 RC, sepertinya kita harus menginstal Driver Sistem Office 2007: Komponen Konektivitas Data [ microsoft.com/downloads/…
Chris Richner
25
Berhati-hatilah dengan ini - ini adalah dempul jelek yang besar (misalnya, terkadang menebak jenis kolom dan membuang semua data yang tidak sesuai).
dbkk
9
Seseorang harus sangat berhati-hati jika menggunakan metode ini. Saya merasa sangat rapuh untuk data yang tidak dalam format yang sempurna.
Kenny Mann
9
Sebagai orang yang harus menggunakan OleDb dalam proyek besar, saya katakan TINGGAL JAUH DARI ITU! Terkadang tidak dapat mengambil nilai sel hanya karena tidak dapat memahami formatnya. Itu tidak memiliki operasi penghapusan. Ini bekerja sangat berbeda dan tidak dapat diprediksi bahkan dengan perubahan penyedia sedikit pun. Saya akan mengatakan pergi untuk solusi komersial yang terbukti.
Caner Öncü
80

Solusi komersial, SpreadsheetGear untuk .NET akan melakukannya.

Anda dapat melihat langsung sampel ASP.NET (C # dan VB) di sini dan unduh versi evaluasi di sini .

Penafian: Saya memiliki SpreadsheetGear LLC

Joe Erickson
sumber
10
Anda memiliki produk hebat, tetapi saya pikir banyak orang di sini mengharapkan solusi gratis. Itu mungkin menjelaskan suara turun.
md1337
65

Beberapa opsi yang saya gunakan:

Jika XLSX adalah suatu keharusan: ExcelPackage adalah awal yang baik tetapi mati ketika pengembang berhenti bekerja di atasnya. ExML mengambil dari sana dan menambahkan beberapa fitur. ExML bukan pilihan yang buruk, saya masih menggunakannya di beberapa situs web produksi.

Untuk semua proyek baru saya, saya menggunakan NPOI , .NET port dari Apache POI . NPOI 2.0 (Alpha) juga mendukung XLSX.

Nate
sumber
Hati-hati dengan ExcelPackage jika Anda perlu mendukung XLS. Saya mengalami kesulitan dengan itu dan akhirnya beralih ke ExcelLibrary.
Jeremy
Jelas benar. ExcelPackage / ExML hanya opsi yang baik jika Anda memerlukan dukungan XLSX.
Nate
5
Perhatikan bahwa ExcelPackage memiliki penerus: EPPlus ( epplus.codeplex.com ) yang mendukung XLSX. Satu-satunya kekhawatiran saya, dibandingkan dengan NPOI misalnya, adalah kinerja, misalnya ketika ada banyak kolom.
Pragmateek
63

Opsi yang sangat ringan mungkin menggunakan tabel HTML. Cukup buat tag kepala, badan, dan tabel dalam file, dan simpan sebagai file dengan ekstensi .xls. Ada atribut khusus Microsoft yang dapat Anda gunakan untuk mendesain output, termasuk formula.

Saya menyadari bahwa Anda mungkin tidak mengkodekan ini dalam aplikasi web, tetapi di sini adalah contoh komposisi file Excel melalui tabel HTML. Teknik ini dapat digunakan jika Anda membuat kode aplikasi konsol, aplikasi desktop, atau layanan.

Lupa Titik Koma
sumber
6
Ini sangat ad hoc tetapi berhasil (belum lagi excel mengeluarkan peringatan pada pembukaan) dan sangat sederhana, layak mendapat tempat sebagai solusi. Meskipun hanya untuk menunjukkan bahwa Anda dapat mengekspor file excel :))
Luka Ramishvili
3
Solusi ini bekerja dengan baik untuk saya, hanya perhatikan Anda tidak dapat menggunakan ekstensi .xlsx
Jill
Beberapa orang di organisasi saya tidak dapat membuka file excel dengan cara ini di Office 2010 dan di atasnya. Tidak tahu apa masalahnya, tapi saya harus memutar implementasi OpenXML saya sendiri. (lihat jawaban Sogger)
Kristen Hammack
49

Jika Anda membuat file Excel 2007/2010, cobalah proyek sumber terbuka ini: https://github.com/closedxml/closedxml

Ini menyediakan cara berorientasi objek untuk memanipulasi file (mirip dengan VBA) tanpa berurusan dengan kerepotan Dokumen XML. Ini dapat digunakan oleh bahasa .NET seperti C # dan Visual Basic (VB).

ClosedXML memungkinkan Anda membuat file Excel 2007/2010 tanpa aplikasi Excel. Contoh khas adalah membuat laporan Excel di server web:

var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
workbook.SaveAs("HelloWorld.xlsx");
Armfoot
sumber
9
Saya mencoba menggunakan ini dalam proyek yang membangun lembar Excel yang cukup besar. Pustaka yang bagus, tetapi kinerjanya sangat buruk. Saya baru saja melakukan perbandingan untuk proyek yang sedang saya kerjakan: ClosedXML (v 0.53.3) mengambil 92.489 ms sedangkan EPPlus (v 2.9.03, untuk pengujian - kami tidak dapat menggunakan karena itu GPL) membutuhkan 16.500 ms.
Druid
1
@Druid, lisensinya LGPL dengan asumsi Anda tidak mengubah kode sumber menjadi ClosedXML, bebas menggunakan epplus.codeplex.com/license
Chris Marisic
48

Anda bisa menggunakan ExcelXmlWriter .

Ini bekerja dengan baik.

Petr Snobelt
sumber
47

Anda sebenarnya mungkin ingin memeriksa kelas interop yang tersedia dalam C # (mis Microsoft.Office.Interop.Excel. Anda mengatakan tidak OLE (yang ini bukan), tetapi kelas interop sangat mudah digunakan. Lihat Dokumentasi C # di sini (Interop untuk Excel dimulai pada halaman 1072 dari C # PDF).

Anda mungkin terkesan jika Anda belum mencobanya.

Harap diingatkan sikap Microsoft tentang hal ini:

Microsoft saat ini tidak merekomendasikan, dan tidak mendukung, Otomatisasi aplikasi Microsoft Office dari aplikasi atau komponen klien non-interaktif yang tidak dijaga (termasuk ASP, ASP.NET, DCOM, dan Layanan NT), karena Office mungkin menunjukkan perilaku yang tidak stabil dan / atau jalan buntu saat Office dijalankan di lingkungan ini.

GEOCHET
sumber
6
Tetapi Anda harus memastikan bahwa Anda membuang semuanya secara manual, jika tidak, Anda akan membocorkan memori
MagicKat
8
@ Ricky B: Juga, dalam pengalaman saya dengan interop adalah ia menggunakan excel. Setiap kali kami menggunakannya, jika Excel tidak diinstal pada mesin, kami akan mendapatkan pengecualian COM.
MagicKat
1
Dengan OLE, bahkan dengan pembuangan yang sangat hati-hati, akhirnya kebocoran memori atau crash. Ini bisa dibilang OK untuk aplikasi / workstation yang dihadiri, tetapi untuk server tidak disarankan (MS memiliki KB yang menyatakan ini). Untuk server kami, kami hanya perlu reboot setiap malam. Sekali lagi, itu berfungsi dengan baik.
Jennifer Zouak
11
@ Geoffrey: ah OK, Anda akan membuat saya bekerja untuk itu :) -> support.microsoft.com/kb/257757 Microsoft saat ini tidak merekomendasikan, dan tidak mendukung, Otomasi aplikasi Microsoft Office dari sembarang pengawalan, non- aplikasi klien interaktif ...
Jennifer Zouak
4
Saya datang ke diskusi ini setelah berjuang lebih dari seminggu di interop, dan kecuali kebutuhan Anda sangat sederhana, ini tidak akan berhasil. Dukungan untuk memformat spreadsheet Anda tidak masuk akal, yang bisa menjadi alasan untuk menghasilkan file .xls dan bukan hanya file .csv yang rata. Misalnya, sudahkah Anda mencoba menghasilkan lebih dari 911 karakter dalam sel, atau apakah Anda mencoba mengatur lebar sel yang digabungkan secara konsisten? Saya sudah, dan saya tidak bisa memberi tahu Anda betapa saya membenci omong kosong ini sekarang ... Tolong diri Anda dan pergi dengan salah satu perpustakaan gratis yang disebutkan dalam diskusi ini.
md1337
34

Berikut adalah perpustakaan C # yang sepenuhnya gratis, yang memungkinkan Anda mengekspor dari DataSet, DataTableatauList<> ke file Excel 2007 .xlsx asli, menggunakan pustaka OpenXML:

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

Kode sumber lengkap disediakan - gratis - bersama dengan instruksi, dan aplikasi demo.

Setelah menambahkan kelas ini ke aplikasi Anda, Anda dapat mengekspor DataSet Anda ke Excel hanya dalam satu baris kode:

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

Itu tidak menjadi jauh lebih sederhana dari itu ...

Dan itu bahkan tidak memerlukan Excel untuk hadir di server Anda.

Mike Gledhill
sumber
1
Ini tampaknya agak menyesatkan, karena Anda meminta sumbangan untuk mendapatkan semua fitur.
UrbanEsc
Itu sebagian benar: Versi gratis sepenuhnya akan menghasilkan file .xlsx yang sempurna untuk Anda, dan semua kode sumber disediakan. Jika Anda menyumbangkan $ 10 atau lebih ke salah satu dari dua badan amal itu (yang saya tidak menerima apa-apa sama sekali), maka Anda mendapatkan versi "lebih baik" yang menunjukkan cara melakukan format, tanggal, dll. Mengingat biaya produk pihak ketiga, saya rasa menyumbang $ 10 untuk tujuan yang baik malah sangat berharga!
Mike Gledhill
23

Anda mungkin ingin melihat GemBox . Spreadsheet .

Mereka memiliki versi gratis dengan semua fitur tetapi dibatasi hingga 150 baris per lembar dan 5 lembar per buku kerja, jika itu sesuai dengan kebutuhan Anda.

Saya belum perlu menggunakannya sendiri, tetapi memang terlihat menarik.

ManiacZX
sumber
21

Syncfusion Essential XlsIO dapat melakukan ini. Tidak memiliki ketergantungan pada Microsoft office dan juga memiliki dukungan khusus untuk platform yang berbeda.

Contoh kode:

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

Seluruh rangkaian kontrol tersedia secara gratis melalui program lisensi komunitas jika Anda memenuhi syarat (pendapatan kurang dari 1 juta USD). Catatan: Saya bekerja untuk Syncfusion.

Davis Jebaraj
sumber
18

Baik,

Anda juga dapat menggunakan perpustakaan pihak ketiga seperti Aspose .

Pustaka ini memiliki manfaat bahwa itu tidak memerlukan Excel untuk diinstal pada mesin Anda yang akan ideal dalam kasus Anda.

Dimi Toulakis
sumber
Untuk lebih tepatnya, Anda dapat menggunakan Aspose.Cells untuk .NET untuk membuat file Excel (XLS, XLSX) di aplikasi .NET Anda.
Shahzad Latif
9
Ya Anda bisa, jika Anda tidak keberatan membayar biaya lisensi minimum $ 999. Coba pustaka MikesKnowledgeBase ... yang mana lebih murah $ 999 dari ini !!
Mike Gledhill
17

OpenXML juga merupakan alternatif yang baik yang membantu menghindari menginstal MS Excel di Server. Open XML SDK 2.0 yang disediakan oleh Microsoft menyederhanakan tugas memanipulasi paket Open XML dan elemen skema Open XML yang mendasarinya dalam sebuah paket. Open XML Application Programming Interface (API) merangkum banyak tugas umum yang dilakukan pengembang pada paket Open XML.

Lihat ini OpenXML: Alternatif yang membantu menghindari menginstal MS Excel di Server

Sachin Dhir
sumber
17

Berbagai pustaka Office 2003 XML yang tersedia tersedia dengan cukup baik untuk file excel yang lebih kecil. Namun, saya menemukan ukuran tipis dari buku kerja besar yang disimpan dalam format XML menjadi masalah. Misalnya, buku kerja tempat saya bekerja dengan ukuran 40 MB dalam format XLSX yang baru (dan tentunya lebih padat) menjadi file XML 360MB.

Sejauh penelitian saya telah mengambil saya, ada dua paket komersial yang memungkinkan output ke format file biner yang lebih lama. Mereka:

Tidak ada yang murah (masing-masing 500USD dan 800USD, saya pikir). tetapi keduanya bekerja independen dari Excel itu sendiri.

Apa yang saya ingin tahu tentang adalah modul output Excel untuk orang-orang seperti OpenOffice.org. Saya ingin tahu apakah mereka dapat diangkut dari Jawa ke .Net.

biozinc
sumber
Yang ini bekerja pada kedua .net dan java, dan tidak mahal. SmartXLS smartxls.com
liya
15

Saya baru saja digunakan FlexCel.NET dan menemukannya sebagai pustaka yang sangat baik! Saya tidak mengatakan itu tentang terlalu banyak produk perangkat lunak. Tidak ada gunanya memberikan seluruh penjualan di sini, Anda dapat membaca semua fitur di situs web mereka.

Ini adalah produk komersial, tetapi Anda mendapatkan sumber lengkap jika Anda membelinya. Jadi saya kira Anda bisa mengkompilasinya ke dalam perakitan Anda jika Anda benar-benar menginginkannya. Kalau tidak, itu hanya satu rakitan tambahan untuk xcopy - tidak ada konfigurasi atau instalasi atau semacamnya.

Saya tidak berpikir Anda akan menemukan cara untuk melakukan ini tanpa perpustakaan pihak ketiga sebagai .NET framework, jelas, tidak dibangun untuk mendukungnya dan OLE Automation hanya seluruh dunia yang menyakitkan.

EMP
sumber
15

Saya telah menulis kode sederhana untuk mengekspor dataset ke excel tanpa menggunakan objek excel dengan menggunakan System.IO.StreamWriter.

Di bawah ini adalah kode yang akan membaca semua tabel dari dataset dan menuliskannya ke lembar satu per satu. Saya mengambil bantuan dari artikel ini .

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();
    }
Harsha.Vaswani
sumber
1
Seperti yang dikatakan artikel itu, XML itulah yang akan dibaca Excel daripada benar-benar menjadi file XLS, yang berarti itu mungkin hanya berfungsi di Excel dan bukan program lain yang membaca spreadsheet. Tapi itu mungkin lebih baik daripada jawaban tabel HTML yang setara di sini!
Rup
Mendukung xlsx ? OpenXML ?
Kiquenet
14

Hanya ingin menambahkan referensi lain ke solusi pihak ketiga yang secara langsung mengatasi masalah Anda: http://www.officewriter.com

(Penafian: Saya bekerja untuk SoftArtisans, perusahaan yang membuat OfficeWriter)

Eisbaer
sumber
13

IKVM + POI

Atau, Anda dapat menggunakan Interop ...

MagicKat
sumber
12

Berikut cara untuk melakukannya dengan LINQ ke XML, lengkap dengan kode sampel:

Impor dan Ekspor Data Excel dengan cepat dengan LINQ ke XML

Agak rumit, karena Anda harus mengimpor ruang nama dan lain-lain, tetapi itu memungkinkan Anda menghindari ketergantungan eksternal.

(Juga, tentu saja, itu VB. NET, bukan C #, tetapi Anda selalu dapat mengisolasi VB. NET dalam proyek sendiri untuk menggunakan XML Literals, dan melakukan segala sesuatu yang lain dalam C #.)

Kyralessa
sumber
12

Beberapa vendor komponen pihak ketiga seperti Infragistics atau Syncfusion menyediakan kemampuan ekspor Excel yang sangat baik yang tidak memerlukan Microsoft Excel untuk diinstal.

Karena vendor ini juga menyediakan komponen kisi UI canggih, komponen ini sangat berguna jika Anda ingin gaya dan tata letak ekspor excel untuk meniru kondisi kisi saat ini dalam antarmuka pengguna aplikasi Anda.

Jika ekspor Anda dimaksudkan untuk dieksekusi di sisi server dengan penekanan pada data yang akan diekspor dan tanpa tautan ke UI, maka saya akan memilih salah satu opsi open source gratis (mis. ExcelLibrary).

Saya sebelumnya telah terlibat dengan proyek-proyek yang berusaha menggunakan otomatisasi sisi server pada suite Microsoft Office. Berdasarkan pengalaman ini saya akan sangat merekomendasikan terhadap pendekatan itu.

Simen S
sumber
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);
            }
        }
    }
}

Hai solusi ini adalah untuk mengekspor tampilan grid Anda ke file excel Anda mungkin dapat membantu Anda

Gaurav
sumber
7
Tidak, ini menghasilkan HTML yang ditandai sebagai file Excel dan bukan file Excel yang sebenarnya. Ya, Excel sendiri akan membuka OK itu tetapi program lain yang menggunakan spreadsheet - misalnya, penampil Excel gratis dari Microsoft - tidak akan menerimanya. Anda sebaiknya membuat file Excel nyata menggunakan salah satu perpustakaan di sini.
Rup
Anda juga harus menggunakan System.Net.Mime.ContentDisposition untuk menghasilkan teks header disposisi-konten daripada menambahkan string - yang akan mengatasi nama file yang berisi spasi dll dengan benar.
Rup
12

Anda dapat membuat file Excel yang diformat dengan baik menggunakan perpustakaan ini: http://officehelper.codeplex.com/documentation
Lihat contoh di bawah ini:

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

tempat sampel terlihat seperti ini:

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};
    }
}
tidak diketahui
sumber
10

Cara termudah dan tercepat untuk membuat file Excel dari C # adalah dengan menggunakan Alat Produktivitas Open XML. Open XML Productivity Tool hadir dengan instalasi Open XML SDK. Alat ini membalikkan semua file Excel menjadi kode C #. Kode C # kemudian dapat digunakan untuk menghasilkan kembali file itu.

Gambaran umum proses yang terlibat adalah:

  1. Instal Open XML SDK dengan alat.
  2. Buat file Excel menggunakan klien Excel terbaru dengan tampilan yang diinginkan. Beri nama DesiredLook.xlsx.
  3. Dengan alat terbuka DesiredLook.xlsxdan klik tombol Reflect Code di dekat bagian atas. masukkan deskripsi gambar di sini
  4. Kode C # untuk file Anda akan dihasilkan di panel kanan alat. Tambahkan ini ke solusi C # Anda dan hasilkan file dengan tampilan yang diinginkan.

Sebagai bonus, metode ini berfungsi untuk semua file Word dan PowerPoint. Sebagai pengembang C #, Anda kemudian akan membuat perubahan pada kode yang sesuai dengan kebutuhan Anda.

Saya telah mengembangkan aplikasi WPF sederhana di github yang akan berjalan di Windows untuk tujuan ini. Ada kelas placeholder yang disebut GeneratedClasstempat Anda bisa menempelkan kode yang dihasilkan. Jika Anda kembali satu versi file, itu akan menghasilkan file excel seperti ini:

masukkan deskripsi gambar di sini

Taterhead
sumber
1
Saya belum mencoba solusi Open XML SDK ini tetapi Wow, saya pasti akan memeriksanya. Saya telah bekerja dengan alat seperti ini selama bertahun-tahun dan tidak tahu tentang ini. Saya telah menerbitkan FOSS sederhana saya sendiri untuk mengonversi file ke XLSX dengan .NET: github.com/TonyGravagno/NebulaXConvert
TonyG