WPF導入導出Excel_第1頁
WPF導入導出Excel_第2頁
WPF導入導出Excel_第3頁
WPF導入導出Excel_第4頁
WPF導入導出Excel_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、大凡微軟的導入導出無論是、winform、抑或是wpf導出的方法大致相同。無非就是實例化Excel類,創(chuàng)建工作簿,創(chuàng)建工作表,然后保存或提取數(shù)據(jù)。以至于如此簡便的操作感覺都變得理所當然了。PS:以下基于VS2010+Framework 4.0先看看wpf是如何導出數(shù)據(jù)到Excel文件里面的。導出數(shù)據(jù)到Excel 首先引用.net 4.0的組件Microsoft.Office.Interop.Excel;csharp view plaincopyprint?using Microsoft.Office.Interop.Excel; private void btnExport_Click(obj

2、ect sender, RoutedEventArgs e) /首先模擬建立將要導出的數(shù)據(jù),這些數(shù)據(jù)都存于DataTable中 System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Add(ID, typeof(int); dt.Columns.Add(NickName, typeof(string); dt.Columns.Add(QNumber, typeof(string); DataRow row = dt.NewRow(); rowID = 1; rowNickName = sanjiawan; rowQ

3、Number = 12345678; dt.Rows.Add(row); row = dt.NewRow(); rowID = 2; rowNickName = 人物2; rowQNumber = 9058307; dt.Rows.Add(row); /創(chuàng)建Excel Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); Workbook excelWB = excelApp.Workbooks.Add(System.Type.Missing

4、); /創(chuàng)建工作簿(WorkBook:即Excel文件主體本身) Worksheet excelWS = (Worksheet)excelWB.Worksheets1; /創(chuàng)建工作表(即Excel里的子表sheet) 1表示在子表sheet1里進行數(shù)據(jù)導出 /excelWS.Cells.NumberFormat = ; / 如果數(shù)據(jù)中存在數(shù)字類型 可以讓它變文本格式顯示 /將數(shù)據(jù)導入到工作表的單元格 for (int i = 0; i dt.Rows.Count; i+) for (int j = 0; j dt.Columns.Count; j+) excelWS.Cellsi + 1, j

5、 + 1 = dt.Rowsij.ToString(); /Excel單元格第一個從索引1開始 excelWB.SaveAs(D:sanjiawan.xlsx); /將其進行保存到指定的路徑 excelWB.Close(); excelApp.Quit(); /KillAllExcel(excelApp); 釋放可能還沒釋放的進程 using Microsoft.Office.Interop.Excel; private void btnExport_Click(object sender, RoutedEventArgs e) /首先模擬建立將要導出的數(shù)據(jù),這些數(shù)據(jù)都存于DataTable中

6、 System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Add(ID, typeof(int); dt.Columns.Add(NickName, typeof(string); dt.Columns.Add(QNumber, typeof(string); DataRow row = dt.NewRow(); rowID = 1; rowNickName = sanjiawan; rowQNumber = 12345678; dt.Rows.Add(row); row = dt.NewRow(); rowID =

7、 2; rowNickName = 人物2; rowQNumber = 9058307; dt.Rows.Add(row); /創(chuàng)建Excel Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); Workbook excelWB = excelApp.Workbooks.Add(System.Type.Missing); /創(chuàng)建工作簿(WorkBook:即Excel文件主體本身) Worksheet excelWS = (Worksheet

8、)excelWB.Worksheets1; /創(chuàng)建工作表(即Excel里的子表sheet) 1表示在子表sheet1里進行數(shù)據(jù)導出 /excelWS.Cells.NumberFormat = ; / 如果數(shù)據(jù)中存在數(shù)字類型 可以讓它變文本格式顯示 /將數(shù)據(jù)導入到工作表的單元格 for (int i = 0; i dt.Rows.Count; i+) for (int j = 0; j dt.Columns.Count; j+) excelWS.Cellsi + 1, j + 1 = dt.Rowsij.ToString(); /Excel單元格第一個從索引1開始 excelWB.SaveAs(

9、D:sanjiawan.xlsx); /將其進行保存到指定的路徑 excelWB.Close(); excelApp.Quit(); /KillAllExcel(excelApp); 釋放可能還沒釋放的進程 注意:因為我們應用了Microsoft.Office.Interop.Excel這個組件,所以里面有些類名會和System.Data中的類名相同,就容易出現(xiàn)程序運行起來報錯。那么我們需要做的就是細化這些類到底屬于哪個組件,就像上面的System.Data.DataTable。大家不必擔心并不熟悉這些組件的名稱,VS2010會給出智能提示。有時候Excel會長時間占用進程,那么我們需要做釋放

10、進程的操作。csharp view plaincopyprint?#region 釋放Excel進程 public bool KillAllExcel(Microsoft.Office.Interop.Excel.Application excelApp) try if (excelApp != null) excelApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); /釋放COM組件,其實就是將其引用計數(shù)減1 /System.Diagnostics.Process theProc; fo

11、reach (System.Diagnostics.Process theProc in System.Diagnostics.Process.GetProcessesByName(EXCEL) /先關閉圖形窗口。如果關閉失敗.有的時候在狀態(tài)里看不到圖形窗口的excel了, /但是在進程里仍然有EXCEL.EXE的進程存在,那么就需要釋放它 if (theProc.CloseMainWindow() = false) theProc.Kill(); excelApp = null; return true; catch return false; return true; #endregion

12、#region 釋放Excel進程 public bool KillAllExcel(Microsoft.Office.Interop.Excel.Application excelApp) try if (excelApp != null) excelApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); /釋放COM組件,其實就是將其引用計數(shù)減1 /System.Diagnostics.Process theProc; foreach (System.Diagnostics.Process

13、 theProc in System.Diagnostics.Process.GetProcessesByName(EXCEL) /先關閉圖形窗口。如果關閉失敗.有的時候在狀態(tài)里看不到圖形窗口的excel了, /但是在進程里仍然有EXCEL.EXE的進程存在,那么就需要釋放它 if (theProc.CloseMainWindow() = false) theProc.Kill(); excelApp = null; return true; catch return false; return true; #endregion從上面的代碼來看,很自然的就完成了Excel的導出工作,那么如果我

14、們需要要求設計導出的樣式我們還可以用到下面代碼。導出Excel的樣式設計csharp view plaincopyprint?Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();Workbook excelWB = excelApp.Workbooks.Add(System.Type.Missing);/創(chuàng)建工作簿(WorkBook:即Excel文件主體本身)Worksheet excelWS = (Worksheet)excelWB.Wor

15、ksheets1;/創(chuàng)建工作表(即Excel里的子表sheet) 1表示在子表sheet1里進行數(shù)據(jù)導出Range range = null;#region 表格屬性設置excelWS.Name = sanjiawan; /設置工作表名range = (Range)excelWS.get_Range(A1, E1); /獲取Excel多個單元格區(qū)域:本例做為Excel表頭 range.Merge(0); /單元格合并動作 要配合上面的get_Range()進行設計excelWS.Cells1, 1 = Excel單元格賦值; /Excel單元格賦值 range.Font.Size = 15;

16、/設置字體大小range.Font.Underline = true; /設置字體是否有下劃線range.Font.Name=黑體; /設置字體的種類 range.HorizontalAlignment=XlHAlign.xlHAlignCenter; /設置字體在單元格內(nèi)的對其方式 range.ColumnWidth=15; /設置單元格的寬度 range.Cells.Interior.Color = System.Drawing.Color.FromArgb(255, 204, 153).ToArgb(); /設置單元格的背景色 range.Borders.LineStyle=1; /設置

17、單元格邊框的粗細 range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThick, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.FromArgb(255, 204, 153).ToArgb(); /給單元格加邊框 range.Borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop).LineStyle = Microsoft.Office.Interop.Excel

18、.XlLineStyle.xlLineStyleNone; /設置單元格上邊框為無邊框 range.EntireColumn.AutoFit(); /自動調(diào)整列寬 range.WrapText = true; /文本自動換行 range.Interior.ColorIndex = 39; /填充顏色為淡紫色 range.Font.Color = System.Drawing.Color.FromArgb(255, 204, 153).ToArgb(); /字體顏色 excelApp.DisplayAlerts = false; /保存Excel的時候,不彈出是否保存的窗口直接進行保存 #end

19、region/如果需要用到上面的這些樣式 我們還有一種方法導出的方法可以運用到Range設計出的樣式 /以下代碼可以替換上面的“將數(shù)據(jù)導入到工作表的單元格”操作 Range range = null; range = excelWS.get_Range(A1, System.Type.Missing); /設置表格左上角開始顯示的位置 for (int i = 0; i table.Rows.Count; i+) for (int j = 0; j table.Columns.Count; j+) range.get_Offset(i, j).Cells.Value = table.Rowsi

20、j.ToString(); Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();Workbook excelWB = excelApp.Workbooks.Add(System.Type.Missing);/創(chuàng)建工作簿(WorkBook:即Excel文件主體本身)Worksheet excelWS = (Worksheet)excelWB.Worksheets1;/創(chuàng)建工作表(即Excel里的子表sheet) 1表示在子表sheet1里進行數(shù)

21、據(jù)導出Range range = null;#region 表格屬性設置excelWS.Name = sanjiawan; /設置工作表名range = (Range)excelWS.get_Range(A1, E1); /獲取Excel多個單元格區(qū)域:本例做為Excel表頭 range.Merge(0); /單元格合并動作 要配合上面的get_Range()進行設計excelWS.Cells1, 1 = Excel單元格賦值; /Excel單元格賦值 range.Font.Size = 15; /設置字體大小range.Font.Underline = true; /設置字體是否有下劃線ra

22、nge.Font.Name=黑體; /設置字體的種類 range.HorizontalAlignment=XlHAlign.xlHAlignCenter; /設置字體在單元格內(nèi)的對其方式 range.ColumnWidth=15; /設置單元格的寬度 range.Cells.Interior.Color = System.Drawing.Color.FromArgb(255, 204, 153).ToArgb(); /設置單元格的背景色 range.Borders.LineStyle=1; /設置單元格邊框的粗細 range.BorderAround(XlLineStyle.xlContinu

23、ous, XlBorderWeight.xlThick, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.FromArgb(255, 204, 153).ToArgb(); /給單元格加邊框 range.Borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop).LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlLineStyleNone; /設置單元格上邊框為無邊框 range

24、.EntireColumn.AutoFit(); /自動調(diào)整列寬 range.WrapText = true; /文本自動換行 range.Interior.ColorIndex = 39; /填充顏色為淡紫色 range.Font.Color = System.Drawing.Color.FromArgb(255, 204, 153).ToArgb(); /字體顏色 excelApp.DisplayAlerts = false; /保存Excel的時候,不彈出是否保存的窗口直接進行保存 #endregion/如果需要用到上面的這些樣式 我們還有一種方法導出的方法可以運用到Range設計出的樣

25、式 /以下代碼可以替換上面的“將數(shù)據(jù)導入到工作表的單元格”操作 Range range = null; range = excelWS.get_Range(A1, System.Type.Missing); /設置表格左上角開始顯示的位置 for (int i = 0; i table.Rows.Count; i+) for (int j = 0; j table.Columns.Count; j+) range.get_Offset(i, j).Cells.Value = table.Rowsij.ToString(); 導出的功能就到這了,接下來我們來看下Excel文件中的數(shù)據(jù)是如何導入到

26、程序中去的Excel數(shù)據(jù)導入到程序先看下如何獲取到的Excel數(shù)據(jù)csharp view plaincopyprint?/獲取表格中的數(shù)據(jù) public System.Data.DataTable LoadExcel(string pPath) string connString = Driver=Driver do Microsoft Excel(*.xls);DriverId=790;SafeTransactions=0;ReadOnly=1;MaxScanRows=16;Threads=3;MaxBufferSize=2024;UserCommitSync=Yes;FIL=excel 8

27、.0;PageTimeout=5; /連接字符串 /簡單解釋下這個連續(xù)字符串,Driver=Driver do Microsoft Excel(*.xls) 這種連接寫法不需要創(chuàng)建一個數(shù)據(jù)源DSN,DRIVERID表示驅(qū)動ID,Excel2003后都使用790, /FIL表示Excel文件類型,Excel2007用excel 8.0,MaxBufferSize表示緩存大小, 如果你的文件是2010版本的,也許會報錯,所以要找到合適版本的參數(shù)設置。 connString += DBQ= + pPath; /DBQ表示讀取Excel的文件名(全路徑) OdbcConnection conn = n

28、ew OdbcConnection(connString); OdbcCommand cmd = new OdbcCommand(); cmd.Connection = conn; /獲取Excel中第一個Sheet名稱,作為查詢時的表名 string sheetName = this.GetExcelSheetName(pPath); string sql = select * from + sheetName.Replace(., #) + $; cmd.CommandText = sql; OdbcDataAdapter da = new OdbcDataAdapter(cmd); Da

29、taSet ds = new DataSet(); try da.Fill(ds); return ds.Tables0; /返回Excel數(shù)據(jù)中的內(nèi)容,保存在DataTable中 catch (Exception x) ds = null; throw new Exception(從Excel文件中獲取數(shù)據(jù)時發(fā)生錯誤!可能是Excel版本問題,可以考慮降低版本或者修改連接字符串值); finally cmd.Dispose(); cmd = null; da.Dispose(); da = null; if (conn.State = ConnectionState.Open) conn.C

30、lose(); conn = null; / 獲取工作表名稱 private string GetExcelSheetName(string pPath) /打開一個Excel應用 Microsoft.Office.Interop.Excel.Application excelApp; Workbook excelWB;/創(chuàng)建工作簿(WorkBook:即Excel文件主體本身) Workbooks excelWBs; Worksheet excelWS;/創(chuàng)建工作表(即Excel里的子表sheet) Sheets excelSts; excelApp = new Microsoft.Office.Interop.Excel.Application(); if (excelApp = null) throw new Exception(打開Excel應用時發(fā)生錯誤!); excelWBs = excelApp.Workbo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論