使用C#如何導入導出Excel文件?
問題描述
使用C#如何導入導出Excel文件?
問題解答
回答1:使用C#如何導入導出Excel文件?-PHP中文網問答-使用C#如何導入導出Excel文件?-PHP中文網問答
圍觀一下哦,學習一下。
回答2:OleDB是微軟的戰略性的通向不同的數據源的低級應用程序接口。支持很多種數據庫,此客戶端中DBF文件的輸入輸出也是使用了此數據庫API。使用OleDB記得添加上命名空間:
using System.Data.OleDb;
xlsx文件的輸入:
private void inputXlsx(){ string strConn2; string filePath = inPath; FileInfo fileInfo = new FileInfo(filePath); string directory = fileInfo.DirectoryName; strConn2 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}'; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;';"; string strConnection = string.Format(strConn2, inPath); OleDbConnection conn = new OleDbConnection(strConnection); try {conn.Open();String tableName = null;DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);tableName = dt.Rows[0][2].ToString().Trim();OleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + tableName + "]", strConnection);oada.Fill(dtOld);conn.Close(); } catch (Exception ex) {conn.Close(); }}
xlsx文件的中間處理過程因需求而異,在此不再贅述處理方式。在輸入過程中,將文件中的數據轉化成了Datatable數據類型的格式,它是一個臨時保存數據的網格虛擬表,處理非常方便。
xlsx文件的輸出:xlsx文件的輸出過程并不是很順利,先后使用了三種方式。
第一種方式自然就是OleDB了,有始有終嘛。但是真正使用的過程中發現此方式不僅要求程序運行本機必須安裝Excel,而且對Excel版本要求非常高,如果刪注冊表很容易弄巧成拙,我改注冊表就直接玩壞了Excel。事實上我們并不能保證客戶的機器上一定安裝了對應版本的Excel,所以如果使用OleDB輸出文件,此客戶端的兼容性將非常的低劣。
經過一番溝通和掙扎決定還是換一種方式,決定改用第三方組件。由于JAVA方使用的是POI,所以這邊直接使用POI項目的.NET版本,NPOI。網上教程很多,很好實現,但是經過測試之后,此種方式對大文件的輸入輸出支持的不是很好,處理DEMO文件沒有問題,但是換成了真正客戶提供的十萬行級甚至百萬行級的文件,客戶端直接在輸出的過程中崩掉。
查詢資料后,網友們對于大文件都建議使用EPPlus。教程也是一抓一大把,我沒有繼續加大文件大小測試,不過客戶給我們提供的十來個文件全部測試通過,基本上都是百萬級以下的。
上代碼吧:
private void outputXlsx(){ FileInfo newFile = new FileInfo(dtNew.TableName + ".xlsx"); if (newFile.Exists) {newFile.Delete();newFile = new FileInfo(dtNew.TableName + ".xlsx"); } using (ExcelPackage package = new ExcelPackage(newFile)) {ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(dtNew.TableName);//創建worksheet for (int m = 0; m < dtNew.Columns.Count; m++){ worksheet.Cells[1, m + 1].Value = dtNew.Columns[m];}int i = 1;foreach (DataRow dr in dtNew.Rows){ for (int j = 0; j < dtNew.Columns.Count; j++) {worksheet.Cells[i + 1, j + 1].Value = dr[j]; } i++;}package.Save();//保存excel }}
相關文章:
1. javascript - js 有什么優雅的辦法實現在同時打開的兩個標簽頁間相互通信?2. css3 - 在sublime text里, 如何讓emmet生成的帶前綴css屬性垂直對齊?3. mac連接阿里云docker集群,已經卡了2天了,求問?4. javascript - weex和node,js到底是怎樣一個關系呢?5. javascript - 一個抽獎的效果(如圖)?6. javascript - 這是什么插件能把能把cli里面的webpack打包信息格式化?7. 想找個php大神仿個網站。8. javascript - 怎樣限制同一個瀏覽器不能登錄兩個賬號9. html5和Flash對抗是什么情況?10. javascript - jquery怎么給select option一個點擊時觸發的事件,如圖 如果選擇自定義觸發一個時間?
