Wpf之Excel导入导出数据

8 篇文章 0 订阅

转: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当成是数据库来进行操作。
无论是导入还是导出,我们都看到了释放资源的操作。这样可以做到及时的进程优化,从而不影响程序的性能。
希望对大家有所帮助

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: WPF是一种用于开发桌面应用程序的技术,而NPOI是一个用于处理Excel文件的开源库。通过结合使用WPF和NPOI,我们可以在WPF应用程序中实现Excel文件的导入导出功能。 要使用NPOI导入Excel文件,首先需要引入NPOI库。我们可以通过NuGet包管理器将NPOI库添加到我们的WPF项目中。然后,我们可以使用NPOI的API来读取和解析Excel文件。我们需要创建一个Workbook对象,并选择要读取的特定Sheet,然后使用循环遍历每一行,并读取每个单元格的值。 在WPF中,我们可以创建一个界面并添加一个按钮,用于触发Excel文件导入功能。当用户点击按钮时,我们将使用NPOI库打开文件选择对话框,允许用户选择要导入Excel文件。一旦我们获取了用户选择的文件路径,我们可以使用NPOI的API来读取Excel文件,然后将数据绑定到WPF应用程序中的相应控件上。 要使用NPOI导出Excel文件,在WPF中,我们可以将数据绑定到DataGrid或ListView等控件上。当用户点击导出按钮时,我们可以使用NPOI的API来创建一个Workbook对象,并选择要导出的Sheet。然后,我们可以使用循环遍历来将数据WPF控件中导出Excel文件的每一行。 最后,我们可以将导出Excel文件保存到硬盘上的特定路径。使用NPOI的API,我们可以设置导出文件的格式和样式,例如设置单元格的字体、颜色、边框等。 总之,通过使用NPOI库,我们可以在WPF应用程序中实现Excel文件的导入导出功能。这个过程涉及到引入NPOI库、读取和解析Excel文件、将数据绑定到WPF控件上、使用NPOI导出数据Excel文件等步骤。 ### 回答2: WPF是一种用于构建Windows应用程序的开发框架,而NPOI是一个支持读取和写入Microsoft Office格式文件的库。使用NPOI库可以在WPF应用程序中实现Excel文件的导入导出功能。 首先需要在WPF项目中引用NPOI库,可以通过NuGet包管理器或手动引用DLL文件的方式进行添加。 要导入Excel文件,我们可以使用NPOI库提供的类来读取和解析文件。首先需要创建一个ExcelWorkbook对象,然后通过获取工作表和行、单元格的方式来获取数据。可以使用循环遍历的方法将数据导入WPF应用程序中的数据结构中,如数据表或集合。 要导出Excel文件,我们可以使用NPOI库提供的类来创建和写入Excel文件。首先需要创建一个ExcelWorkbook对象,然后创建工作表和行对象,并将数据写入到单元格中。最后,可以使用流将Excel文件保存到指定的位置。 需要注意的是,导入导出Excel文件时需要处理一些异常情况,如文件格式错误、IO异常等,可以使用try-catch语句来捕获并处理这些异常。 总结来说,使用NPOI库可以方便地在WPF应用程序中实现Excel文件的导入导出功能。通过引用NPOI库,并使用它提供的类和方法,我们可以读取和解析Excel文件的数据,以及创建和写入Excel文件。这使得我们可以更加灵活和高效地处理Excel文件,满足特定的需求。 ### 回答3: WPF是一种使用XAML语言和.NET框架开发桌面应用程序的技术。NPOI是一个用于操作Microsoft Office格式文件的开源库,可以在WPF应用程序中使用NPOI来实现Excel文件的导入导出。 在使用NPOI导入Excel文件时,首先需要引入NPOI的相关命名空间,然后通过创建一个Workbook对象来加载Excel文件。可以使用Workbook的GetSheetAt方法获取具体的工作表,并通过遍历行和列的方式获取单元格的数据。再通过将数据存储到一个集合或数据表中,便可以在WPF应用程序中进行进一步的处理和展示。 在使用NPOI导出Excel文件时,首先需要创建一个Workbook对象,并在其中创建一个工作表。然后通过遍历数据集合或数据表,使用NPOI提供的方法在工作表中添加行和列,并设置相应的单元格数值。最后,使用Workbook的Write方法将数据写入到Excel文件中,并通过保存文件的方式实现导出功能。 此外,还可以根据需求设置单元格的样式、字体、颜色等属性,以及合并单元格、设置边框等操作。通过熟悉NPOI库的API文档,可以灵活地操作Excel文件,并在WPF应用程序中实现导入导出Excel的功能。 总之,通过使用NPOI库,可以在WPF应用程序中方便地实现Excel文件的导入导出功能,提高了应用程序的灵活性和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值