Membuka file Excel dalam kode telah menjadi pengalaman yang menyakitkan jauh sebelumnya. NET Core datang. Dalam banyak kasus, Anda sebenarnya membutuhkan aplikasi Excel yang diinstal pada mesin target/pengguna untuk dapat membuka file excel melalui kode. Jika Anda pernah menggunakan kueri "OLE DB Jet" sebelumnya, Anda tahu itu bukan pengalaman yang hebat. Untungnya ada beberapa solusi open source yang cukup bagus sekarang yang tidak memerlukan excel pada mesin target. Ini bagus untuk pengguna Windows sehingga Anda tidak perlu menginstal excel di mesin pengguna target atau server web, tetapi juga untuk hosting orang. Aplikasi .NET Core di Linux (Dan bahkan Mac/ARM) – di mana Excel jelas tidak terlihat di mana pun
Metodologi saya untuk artikel ini cukup sederhana. Buat buku kerja excel standar dengan beberapa lembar, beberapa rumus, dan beberapa kasus pemformatan khusus. Baca data yang sama di setiap perpustakaan dan lihat mana yang paling cocok untuk saya. Sederhana. Mari kita pergi
Buat Spreadsheet Magic dengan IronXL – Baca, Tulis, dan Buat dalam C#. BERSIH
Setelah membantu Lego dan NASA dengan kesengsaraan spreadsheet mereka – IronXL memenuhi kebutuhan spreadsheet Anda dengan memvalidasi, mengonversi, menyimpan, dan memodifikasi file Excel. IronXL membaca, menulis, dan membuat file buku kerja excel di C#. NET Core hanya dalam beberapa baris kode. IronXL bekerja dengan banyak format excel seperti XLS/XLSX/CSV/TSV. Uji dan bagikan proyek Anda langsung dengan kunci uji coba gratis IronXL 30 hari atau rasakan manfaat lisensi mulai dari $399 dengan dukungan teknisi 24 jam
Catatan Pada Format CSV
Saya harus mencatat bahwa jika Anda membaca CSV, atau lebih dari satu lembar excel yang tidak memiliki rumus atau apa pun "excel" khusus pada lembar tersebut, Anda sebaiknya menguraikannya menggunakan teknik CSV standar. Kami memiliki artikel bagus di sini tentang parsing CSV di C#. NET yang seharusnya Anda ikuti. Pengurai CSV sangat bagus untuk mengambil data tabular dan membatalkan serialisasinya menjadi objek dan harus digunakan jika memungkinkan
Contoh Data
Saya pikir cara terbaik untuk membandingkan berbagai perpustakaan yang ditawarkan adalah dengan membuat spreadsheet sederhana untuk membandingkan berbagai cara kita dapat membaca data. Spreadsheet akan memiliki dua "lembar", di mana lembar kedua mereferensikan yang pertama
Lembar 1 diberi nama "Lembar Pertama" dan sepertinya begitu
Perhatikan bahwa sel A2 hanyalah angka “1”. Kemudian di kolom B2, kita memiliki referensi ke sel A2. Ini karena kami ingin memeriksa apakah perpustakaan memungkinkan kami untuk tidak hanya mendapatkan "formula" dari sel, tetapi juga nilai yang dihitung seharusnya.
Kami juga menata sel A2 dengan warna font merah, dan B2 memiliki batas penuh (Meskipun sulit dilihat karena saya mencoba menunjukkan fomula). Kami akan mencoba dan mengekstrak elemen gaya ini nanti
Lembar 2 diberi nama "Lembar Kedua" dan sepertinya begitu
Jadi kami melakukan rumus "JUMLAH" sederhana dan mereferensikan lembar pertama. Sekali lagi, ini agar kami dapat menguji mendapatkan rumus dan nilai yang dihitung, tetapi kali ini di lembar yang berbeda. Tidak rumit bagi seseorang yang terbiasa bekerja dengan Excel, tetapi mari kita lihat bagaimana beberapa pustaka menanganinya
Secara umum, dalam pengujian saya, saya mencari keluaran saya untuk selalu mengikuti format yang sama
Sheet 1 Data Cell A2 Value : Cell A2 Color : Cell B2 Formula : Cell B2 Value : Cell B2 Border : Sheet 2 Data Cell A2 Formula : Cell A2 Value :Dengan begitu saat saya menunjukkan kodenya, Anda dapat memilih perpustakaan yang paling masuk akal bagi Anda
EPPlus
Ketika saya pertama kali mulai mencari-cari parsing excel. NET Core, saya ingat menggunakan EPPlus beberapa bulan yang lalu untuk penguraian excel yang sangat ringan. Paket nuget dapat ditemukan di sini. https. // www. nuget. org/paket/EPPlus/. Ini juga open source sehingga Anda dapat membaca kode sumber jika itu yang Anda inginkan di sini. https. //github. com/JanKallman/EPPlus
Kode untuk membaca spreadsheet excel kita terlihat seperti itu
static void Main(string[] args) { using(var package = new ExcelPackage(new FileInfo("Book.xlsx"))) { var firstSheet = package.Workbook.Worksheets["First Sheet"]; Console.WriteLine("Sheet 1 Data"); Console.WriteLine($"Cell A2 Value : {firstSheet.Cells["A2"].Text}"); Console.WriteLine($"Cell A2 Color : {firstSheet.Cells["A2"].Style.Font.Color.LookupColor()}"); Console.WriteLine($"Cell B2 Formula : {firstSheet.Cells["B2"].Formula}"); Console.WriteLine($"Cell B2 Value : {firstSheet.Cells["B2"].Text}"); Console.WriteLine($"Cell B2 Border : {firstSheet.Cells["B2"].Style.Border.Top.Style}"); Console.WriteLine(""); var secondSheet = package.Workbook.Worksheets["Second Sheet"]; Console.WriteLine($"Sheet 2 Data"); Console.WriteLine($"Cell A2 Formula : {secondSheet.Cells["A2"].Formula}"); Console.WriteLine($"Cell A2 Value : {secondSheet.Cells["A2"].Text}"); } }_Jujur apa yang bisa saya katakan. Ini *sangat* mudah dan bekerja langsung di luar kotak. Itu mengambil formula vs teks dengan sempurna. Gaya pada lembar pertama kami juga cukup mudah untuk diterapkan. Perbatasan sedikit mengganggu karena Anda harus memeriksa "Gaya" perbatasan, dan jika itu adalah gaya "Tidak Ada", berarti tidak ada perbatasan (Berlawanan dengan boolean untuk "HasBorder" atau serupa). Tapi saya pikir saya hanya memilih-milih, EPPlus hanya berfungsi
NPOI
NPOI adalah opsi sumber terbuka lainnya dengan Github di sini. https. //github. com/tonyqus/npoi dan Nuget di sini. https. // www. nuget. org/paket/NPOI/. Itu belum dirilis selama lebih dari setahun yang tidak terlalu buruk karena tidak seperti Excel itu sendiri yang memiliki banyak pembaruan sepanjang tahun, tetapi daftar Masalah di Github tumbuh sedikit dengan beberapa bug yang adil, jadi pertahankan itu.
Kode untuk membaca data kita menggunakan NPOI terlihat seperti itu
…
… Sebenarnya kamu tahu apa. Saya menghabiskan banyak waktu untuk mencoba dan mencari cara terbaik untuk menggunakan NPOI dan dokumentasinya sangat buruk. Wikinya ada di sini. https. //github. com/tonyqus/npoi/wiki/Getting-Started-with-NPOI tetapi memiliki beberapa contoh tetapi kebanyakan/semuanya tentang membuat buku kerja excel bukan membacanya. Saya melihat mereka memiliki tautan ke tutorial tentang cara membaca file Excel yang tampak menjanjikan, tetapi itu benar-benar membaca spreadsheet dan kemudian membuang teksnya.
Setelah menggunakan EPPlus, saya tidak melihat alasan untuk melanjutkan dengan yang satu ini. Hampir setiap jawaban google akan mengarahkan Anda ke StackOverflow dengan orang-orang yang menggunakan NPOI dengan kasus penggunaan khusus sehingga tidak pernah benar-benar disatukan untuk saya
ExcelDataReader
ExcelDataReader muncul dalam beberapa jawaban stackoverflow saat membaca excel. Inti BERSIH. Mirip dengan yang lain dalam daftar ini, ini open source di sini. https. //github. com/ExcelDataReader/ExcelDataReader dan di Nuget di sini. https. // www. nuget. org/paket/ExcelDataReader/
Saya ingin membuat ini berhasil tetapi…. Sepertinya tidak intuitif sama sekali. ExcelDataReader bekerja dengan asumsi bahwa Anda membaca "baris" dan "kolom" secara berurutan hampir dengan gaya CSV. Semacam itu berfungsi tetapi jika Anda mencari sel tertentu, itu sangat sulit
Beberapa contoh kode
static void Main(string[] args) { System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); using (var stream = File.Open("Book.xlsx", FileMode.Open, FileAccess.Read)) { using (var reader = ExcelReaderFactory.CreateReader(stream)) { do { while (reader.Read()) //Each ROW { for (int column = 0; column < reader.FieldCount; column++) { //Console.WriteLine(reader.GetString(column));//Will blow up if the value is decimal etc. Console.WriteLine(reader.GetValue(column));//Get Value returns object } } } while (reader.NextResult()); //Move to NEXT SHEET } } }Baris pertama khususnya sangat mengganggu (Semuanya meledak tanpa itu). Tapi Anda akan melihat bahwa kami bergerak melalui baris demi baris (Dan lembar demi lembar) mencoba untuk mendapatkan nilai. Selain itu, memanggil hal-hal seperti "GetString" tidak berfungsi jika nilainya desimal (Cast implisit akan menjadi IMO yang lebih baik). Saya juga tidak dapat menemukan cara untuk mendapatkan rumus sel yang sebenarnya. Di atas hanya mengembalikan hasil yang dihitung
Saya akan bekerja keras dan benar-benar mendapatkan hasil yang kami cari, tetapi itu bukan perpustakaan yang akan saya gunakan
Sinkronisasi
Syncfusion adalah salah satu perusahaan menjengkelkan yang membuat pustaka berbayar untuk digunakan, mengunggahnya ke nuget, lalu dalam cetakan kecil mengatakan Anda perlu membeli lisensi atau lainnya. Secara pribadi, saya ingin melihat Microsoft tidak mengizinkan perpustakaan berbayar ke repo Nuget publik. Saya akan menyertakannya di sini, tetapi lisensinya mulai dari $995 per tahun, per pengembang, jadi saya tidak melihat banyak alasan untuk menggunakannya untuk sebagian besar kasus penggunaan. Halaman nuget dapat ditemukan di sini https. // www. nuget. org/paket/Sinkronisasi. XlsIO. Bersih. Inti/
Kodenya terlihat seperti
static void Main(string[] args) { ExcelEngine excelEngine = new ExcelEngine(); using (var stream = File.Open("Book.xlsx", FileMode.Open, FileAccess.Read)) { var workbook = excelEngine.Excel.Workbooks.Open(stream); var firstSheet = workbook.Worksheets["First Sheet"]; Console.WriteLine("Sheet 1 Data"); Console.WriteLine($"Cell A2 Value : {firstSheet.Range["A2"].DisplayText}"); Console.WriteLine($"Cell A2 Color : {firstSheet.Range["A2"].CellStyle.Font.RGBColor.Name}"); Console.WriteLine($"Cell B2 Formula : {firstSheet.Range["B2"].Formula}"); Console.WriteLine($"Cell B2 Value : {firstSheet.Range["B2"].DisplayText}"); Console.WriteLine($"Cell B2 Border : {firstSheet.Range["B2"].CellStyle.Borders.Value}"); Console.WriteLine(""); var secondSheet = workbook.Worksheets["Second Sheet"]; Console.WriteLine($"Sheet 2 Data"); Console.WriteLine($"Cell A2 Formula : {secondSheet.Range["A2"].Formula}"); Console.WriteLine($"Cell A2 Value : {secondSheet.Range["A2"].DisplayText}"); } }Jadi tidak buruk. Harus saya akui, saya mengutak-atik mencoba memahami cara kerjanya di luar perbatasan (Karena kode di atas tidak berfungsi), tetapi menyerah. Warna font juga memerlukan beberapa utak-atik di mana perpustakaan mengembalikan objek non standar sebagai warnanya. Beberapa properti untuk data aktual juga agak membingungkan di mana Anda memiliki nilai, teks, teks tampilan, dll. Semua mengembalikan hal-hal yang sedikit berbeda sehingga Anda hanya perlu menyemprot dan berdoa dan melihat mana yang berhasil
Jika EPPlus tidak ada, dan Syncfusion tidak terlalu mahal, perpustakaan ini sebenarnya cukup bagus