使用C#如何導(dǎo)入導(dǎo)出Excel文件?
問題描述
使用C#如何導(dǎo)入導(dǎo)出Excel文件?
問題解答
回答1:使用C#如何導(dǎo)入導(dǎo)出Excel文件?-PHP中文網(wǎng)問答-使用C#如何導(dǎo)入導(dǎo)出Excel文件?-PHP中文網(wǎng)問答
圍觀一下哦,學(xué)習(xí)一下。
回答2:OleDB是微軟的戰(zhàn)略性的通向不同的數(shù)據(jù)源的低級應(yīng)用程序接口。支持很多種數(shù)據(jù)庫,此客戶端中DBF文件的輸入輸出也是使用了此數(shù)據(jù)庫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文件的中間處理過程因需求而異,在此不再贅述處理方式。在輸入過程中,將文件中的數(shù)據(jù)轉(zhuǎn)化成了Datatable數(shù)據(jù)類型的格式,它是一個(gè)臨時(shí)保存數(shù)據(jù)的網(wǎng)格虛擬表,處理非常方便。
xlsx文件的輸出:xlsx文件的輸出過程并不是很順利,先后使用了三種方式。
第一種方式自然就是OleDB了,有始有終嘛。但是真正使用的過程中發(fā)現(xiàn)此方式不僅要求程序運(yùn)行本機(jī)必須安裝Excel,而且對Excel版本要求非常高,如果刪注冊表很容易弄巧成拙,我改注冊表就直接玩壞了Excel。事實(shí)上我們并不能保證客戶的機(jī)器上一定安裝了對應(yīng)版本的Excel,所以如果使用OleDB輸出文件,此客戶端的兼容性將非常的低劣。
經(jīng)過一番溝通和掙扎決定還是換一種方式,決定改用第三方組件。由于JAVA方使用的是POI,所以這邊直接使用POI項(xiàng)目的.NET版本,NPOI。網(wǎng)上教程很多,很好實(shí)現(xiàn),但是經(jīng)過測試之后,此種方式對大文件的輸入輸出支持的不是很好,處理DEMO文件沒有問題,但是換成了真正客戶提供的十萬行級甚至百萬行級的文件,客戶端直接在輸出的過程中崩掉。
查詢資料后,網(wǎng)友們對于大文件都建議使用EPPlus。教程也是一抓一大把,我沒有繼續(xù)加大文件大小測試,不過客戶給我們提供的十來個(gè)文件全部測試通過,基本上都是百萬級以下的。
上代碼吧:
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);//創(chuàng)建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 }}
相關(guān)文章:
1. 數(shù)組按鍵值封裝!2. java - web項(xiàng)目中,用戶登陸信息存儲(chǔ)在session中好 還是cookie中好,取決于什么?3. angular.js - webpack build后的angularjs路由跳轉(zhuǎn)問題4. mysql - 大部分?jǐn)?shù)據(jù)沒有行溢出的text字段是否需要拆表5. mysql federated引擎無法開啟6. mysql 新增用戶 主機(jī)名設(shè)定 失敗7. 單擊登錄按鈕無反應(yīng)8. ubuntu - mysql 連接問題9. mysql - 查詢字段做了索引為什么不起效,還有查詢一個(gè)月的時(shí)候數(shù)據(jù)都是全部出來的,如果分拆3次的話就沒問題,為什么呢。10. mysql儲(chǔ)存json錯(cuò)誤
