1. 程式人生 > >Wpf之Excel匯入匯出資料

Wpf之Excel匯入匯出資料

轉:http://blog.csdn.net/sanjiawan/article/details/6818921
大凡微軟的匯入匯出無論是asp.net、winform、抑或是wpf匯出的方法大致相同。無非就是例項化Excel類,建立工作簿,建立工作表,然後儲存或提取資料。以至於如此簡便的操作感覺都變得理所當然了。

PS:以下基於VS2010+Framework 4.0
先看看wpf是如何匯出資料到Excel檔案裡面的。
匯出資料到Excel
首先引用.net 4.0的元件Microsoft.Office.Interop.Excel;

using Microsoft.Office.Interop.Excel;

private void btnExport_Click(object sender, RoutedEventArgs e)
{

       //首先模擬建立將要匯出的資料,這些資料都存於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();
        row["ID"] = 1;
        row["NickName"] = "sanjiawan";
        row["QNumber"] = "12345678";
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["ID"] = 2;
        row["NickName"] = "人物2";
        row["QNumber"] = "9058307";
        dt.Rows.Add(row);

        //建立Excel

        Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
        Workbook excelWB = excelApp.Workbooks.Add(System.Type.Missing);    //建立工作簿(WorkBook:即Excel檔案主體本身)
          Worksheet excelWS = (Worksheet)excelWB.Worksheets[1];   //建立工作表(即Excel裡的子表sheet) 1表示在子表sheet1裡進行資料匯出

        //excelWS.Cells.NumberFormat = "@";     //  如果資料中存在數字型別 可以讓它變文字格式顯示
        //將資料匯入到工作表的單元格
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                excelWS.Cells[i + 1, j + 1] = dt.Rows[i][j].ToString();   //Excel單元格第一個從索引1開始
            }
        }

        excelWB.SaveAs("D:\\sanjiawan.xlsx");  //將其進行儲存到指定的路徑
          excelWB.Close();
        excelApp.Quit();  //KillAllExcel(excelApp); 釋放可能還沒釋放的程序
    }
注意:因為我們應用了Microsoft.Office.Interop.Excel這個元件,所以裡面有些類名會和System.Data中的類名相同,就容易出現程式執行起來報錯。那麼我們需要做的就是細化這些類到底屬於哪個元件,就像上面的System.Data.DataTable。大家不必擔心並不熟悉這些元件的名稱,VS2010會給出智慧提示。
有時候Excel會長時間佔用程序,那麼我們需要做釋放程序的操作。

region 釋放Excel程序

    public bool KillAllExcel(Microsoft.Office.Interop.Excel.Application excelApp)
    {
        try
        {
            if (excelApp != null)
            {
                excelApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
                //釋放COM元件,其實就是將其引用計數減1   
                //System.Diagnostics.Process theProc;   
                foreach (System.Diagnostics.Process theProc in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
                {
                    //先關閉圖形視窗。如果關閉失敗.有的時候在狀態裡看不到圖形視窗的excel了,   
                    //但是在程序裡仍然有EXCEL.EXE的程序存在,那麼就需要釋放它   
                    if (theProc.CloseMainWindow() == false)
                    {
                        theProc.Kill();
                    }
                }
                excelApp = null;
                return true;
            }
        }
        catch
        {
            return false;
        }
        return true;
    }

#endregion

從上面的程式碼來看,很自然的就完成了Excel的匯出工作,那麼如果我們需要要求設計匯出的樣式我們還可以用到下面程式碼。
匯出Excel的樣式設計
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
Workbook excelWB = excelApp.Workbooks.Add(System.Type.Missing);//建立工作簿(WorkBook:即Excel檔案主體本身)
Worksheet excelWS = (Worksheet)excelWB.Worksheets[1];//建立工作表(即Excel裡的子表sheet) 1表示在子表sheet1裡進行資料匯出
Range range = null;

#region 表格屬性設定
excelWS.Name = "sanjiawan"; //設定工作表名
range = (Range)excelWS.get_Range("A1", "E1"); //獲取Excel多個單元格區域:本例做為Excel表頭 
range.Merge(0); //單元格合併動作   要配合上面的get_Range()進行設計

excelWS.Cells[1, 1] = "Excel單元格賦值"; //Excel單元格賦值 

range.Font.Size = 15; //設定字型大小

range.Font.Underline = true; //設定字型是否有下劃線

range.Font.Name="黑體"; //設定字型的種類 

range.HorizontalAlignment=XlHAlign.xlHAlignCenter; //設定字型在單元格內的對其方式 

range.ColumnWidth=15; //設定單元格的寬度 

range.Cells.Interior.Color = System.Drawing.Color.FromArgb(255, 204, 153).ToArgb(); //設定單元格的背景色 

range.Borders.LineStyle=1; //設定單元格邊框的粗細 

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.XlLineStyle.xlLineStyleNone; //設定單元格上邊框為無邊框 

range.EntireColumn.AutoFit(); //自動調整列寬 

range.WrapText = true; //文字自動換行 

range.Interior.ColorIndex = 39; //填充顏色為淡紫色 

range.Font.Color = System.Drawing.Color.FromArgb(255, 204, 153).ToArgb(); //字型顏色 

excelApp.DisplayAlerts = false; //儲存Excel的時候,不彈出是否儲存的視窗直接進行儲存 
#endregion





//如果需要用到上面的這些樣式 我們還有一種方法匯出的方法可以運用到Range設計出的樣式  

//以下程式碼可以替換上面的“將資料匯入到工作表的單元格”操作
  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.Rows[i][j].ToString();
       }
  }

匯出的功能就到這了,接下來我們來看下Excel檔案中的資料是如何匯入到程式中去
Excel資料匯入到程式
先看下如何獲取到的Excel資料

//獲取表格中的資料
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.0;PageTimeout=5;";  //連線字串  

        //簡單解釋下這個連續字串,Driver={Driver do Microsoft Excel(*.xls)} 這種連線寫法不需要建立一個數據源DSN,DRIVERID表示驅動ID,Excel2003後都使用790,

        //FIL表示Excel檔案型別,Excel2007用excel 8.0,MaxBufferSize表示快取大小, 如果你的檔案是2010版本的,也許會報錯,所以要找到合適版本的引數設定。

        connString += "DBQ=" + pPath; //DBQ表示讀取Excel的檔名(全路徑)
        OdbcConnection conn = new 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);
        DataSet ds = new DataSet();
        try
        {
            da.Fill(ds);
            return ds.Tables[0];    //返回Excel資料中的內容,儲存在DataTable中
        }
        catch (Exception x)
        {
            ds = null;
            throw new Exception("從Excel檔案中獲取資料時發生錯誤!可能是Excel版本問題,可以考慮降低版本或者修改連線字串值");
        }
        finally
        {
            cmd.Dispose();
            cmd = null;
            da.Dispose();
            da = null;
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
            conn = null;
        }
    }

    // 獲取工作表名稱
    private string GetExcelSheetName(string pPath)
    {
        //開啟一個Excel應用
        Microsoft.Office.Interop.Excel.Application excelApp;
        Workbook excelWB;//建立工作簿(WorkBook:即Excel檔案主體本身)
        Workbooks excelWBs;
        Worksheet excelWS;//建立工作表(即Excel裡的子表sheet)

        Sheets excelSts;

        excelApp = new Microsoft.Office.Interop.Excel.Application();
        if (excelApp == null)
        {
            throw new Exception("開啟Excel應用時發生錯誤!");
        }
        excelWBs = excelApp.Workbooks;
        //開啟一個現有的工作薄
        excelWB = excelWBs.Add(pPath);
        excelSts = excelWB.Sheets;
        //選擇第一個Sheet頁
        excelWS = excelSts.get_Item(1);
        string sheetName = excelWS.Name;

        ReleaseCOM(excelWS);
        ReleaseCOM(excelSts);
        ReleaseCOM(excelWB);
        ReleaseCOM(excelWBs);
        excelApp.Quit();
        ReleaseCOM(excelApp);
        return sheetName;
    }

    // 釋放資源
    private void ReleaseCOM(object pObj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pObj);
        }
        catch
        {
            throw new Exception("釋放資源時發生錯誤!");
        }
        finally
        {
            pObj = null;
        }
    }

資料我們已經獲取到了,接下來我們在我們程式應用中只需要傳遞檔案的路徑就可以直接獲取到裡面的資料了

private void btnImport_Click(object sender, RoutedEventArgs e)
{
System.Data.DataTable dt = LoadExcel(“D:\sanjiawan”); //通過路徑獲取到的資料

        //此時我們就可以用這資料進行處理了,比如繫結到顯示資料的控制元件當中去
        MessageBox.Show("匯入成功");
    }

“`
通過獲取Excel資料會發現,其操作機制和資料庫操作機制幾乎一樣。我們可以把Excel當成是資料庫來進行操作。
無論是匯入還是匯出,我們都看到了釋放資源的操作。這樣可以做到及時的程序優化,從而不影響程式的效能。
希望對大家有所幫助

相關推薦

WpfExcel匯入匯出資料

轉:http://blog.csdn.net/sanjiawan/article/details/6818921 大凡微軟的匯入匯出無論是asp.net、winform、抑或是wpf匯出的方法大致相同。無非就是例項化Excel類,建立工作簿,建立工作表,然後儲

資料Sqoop系列Sqoop匯入匯出資料

一、Sqoop介紹 Sqoop是一個用來將關係型資料庫和Hadoop中的資料進行相互轉移的工具,可以將一個關係型資料庫(例如Mysql、Oracle)中的資料匯入到Hadoop(例如HDFS、Hive、Hbase)中,也可以將Hadoop(例如HDFS、Hive、Hbase

Java匯入匯出資料到給定多sheet的excel檔案

JAVA程式實現匯入匯出資料到給定的EXCEL檔案模板中 首先建立一個maven專案,在pom.xml檔案中引入需要的包(這裡3.14版本的poi會有一些問題,在匯入07版本的excel時xmlbeans使用2.6.0及以上版本): <dependency>

Sqoopjava API匯入匯出資料

折騰了一下午終於成功了,這裡做一下總結 專案依賴: <dependency> <groupId>org.apache.sqoop</groupId> <artifactId>sqoop-client</arti

Javaexcel匯入資料同時相容.xls和.xlsx

前幾天寫了一個java中用poi操作excel匯入資料的小例子,後來發現並不能相容兩種版本的excel,經過改進發現了兩種方法都可以。 第一種,這種直接用了Workbook的工廠方法。 // 建立對Excel工作簿檔案的引用 //直接用HSSFWorkb

報表開發批量匯入匯出Excel

在日常使用報表過程中,會有這樣一種情況,你將Excel表分發給各個員工,員工填完後,統一整理成多個Excel,你需要將這些資料,用報表的填報功能,提交錄入到資料庫中,這樣一來可避免到伺服器機房錄資料的繁瑣步驟,但是無論是批量匯入和還是匯出Excel,這對諸多報表軟體或稱整合報

資料泵使用的注意事項遠端匯入匯出

1、遠端匯入匯出的一般方法 要求:將A庫中的sehcme=user1中的所有物件遷移到B庫; 說明:表空間DB只有一個scheme=user1,所以直接將表空間DB匯入B。 步驟     1. 首先在A將表空間DB設定為只讀,避免資料更新;     2. 在B上建立表空間

用SQL查詢分析器操縱Excel匯入匯出資料

SQL SERVER 和EXCEL的資料匯入匯出 通常的方法是使用圖形介面的dts工具,但發覺有些使用命令列介面的方式更簡單 1、在SQL SERVER裡查詢Excel資料: -- ===============================================

springboot2整合easypoi,實現Excel匯入匯出

1.新增Maven依賴 <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <v

Oracle利用exp和imp,資料泵impdp和expdp匯入匯出資料,spool匯出資料

Oracle利用exp和imp,資料泵impdp和expdp匯入匯出資料,spool匯出資料 注意: (1)imp只能匯入exp匯出的檔案 ,imp,exp是客戶端程式,操作少量資料  (2)impdp只能匯入expdp匯出的檔案,impdp,expdp是伺服器端程式,操作適量大的

JAVA:Excel匯入匯出詳解(3)--匯出

Excel匯出 一、設定查詢條件 注意:無法通過Ajax下載 jsp程式碼 <form class="col-sm-2" action="/manage/order/download" method="post" onsubmit="checkForm()"

JAVA:Excel匯入匯出詳解(2)--匯入

1. 瀏覽資料夾,選擇需要上傳的檔案 程式碼 jsp <li class="col-sm-1"> <span>上&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&a

TP5操作Excel匯入匯出資料庫

匯入: <?phpnamespace app\index\controller;use think\Controller;use think\Db;use think\Loader;class Upload extends Controller{ public function upload()

開發指南專題十五 JEECG微雲快速開發平臺EXCEL匯入匯出

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

原始碼的excel匯入匯出

       獲取所有資料,將資料進行有序切割,在進行遍歷,將其匯出。 //設定header header("content-type:text/html;charset=utf-8"); //連線資料庫 $link=mysqli_connec

POI-Excel匯入匯出 詳細實現程式碼

1.介面效果:                   1)點選批量匯入,彈出檔案選擇框,選擇檔案,點選開啟,檔案開始上傳。           &nb

Vue中excel匯入匯出

npm安裝 npm install -S file-saver xlsx(這裡其實安裝了2個依賴) npm install -D script-loader 在src下建立一個資料夾,包含兩個檔案: Blob.js,Export2Excel.js下載地址:https://gitee

Spring使用POI實現Excel匯入匯出

Apache POI 是建立和維護操作各種符合Office Open XML(OOXML)標準和微軟的OLE 2複合文件格式(OLE2)的Java API。用它可以使用Java讀取和建立,修改MS Excel檔案.而且,還可以使用Java讀取和建立MS Word和MSPowerPoint檔案。Ap

cmd命令列下mongodb匯入匯出資料操作語句

針對集合(表)操作:   mongoexport:匯出集合   mongoimport:匯入集合 針對資料庫操作:(資料庫匯出來的是二進位制檔案,看不懂的)   mongodump:匯出資料庫   mongorestore:匯入資料庫 (1)匯出集合資料: d:\mongodb\bin&g

hive 的匯入匯出資料的命令彙總

一.匯入資料 從本地檔案匯入資料到 hive表: LOAD DATA LOCAL INPATH '本地檔案路徑' INTO TABLE 表名稱 PARTITION(分割槽欄位名='分割槽值');   表要提前建