winform下Dataset转Excel文件

    从数据库批量导出Excel文件时需要这样的类,仍然使用了office的接口,不装office不给用。
using System;
using System.Data;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using Microsoft.Win32;
using System.IO;

public class DataBasetoExcel 
{
    /// <summary>
    /// 判断本机是否安装Excel文件方法
    /// </summary>
    /// <returns></returns>
    static private bool isExcelInstalled()
    {
        Type type = Type.GetTypeFromProgID("Excel.Application");
        return type != null;
    }

    /// <summary>
    /// 查询注册表某个键值是否存在,这里查询的是Excel2003/2007版本的键值
    /// </summary>
    /// <returns></returns>
    static private bool exists03Regedit()
    {
        bool ifused = false;
        RegistryKey rk = Registry.LocalMachine;
        RegistryKey akey = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\Office\\11.0\\Word\\InstallRoot\\");
        //RegistryKey akeytwo = rk.OpenSubKey(@"SOFTWARE\\Microsoft\\Office\\12.0\\Word\\InstallRoot\\");
        //检查本机是否安装Office2003
        if (akey != null)
        {
            string file03 = akey.GetValue("Path").ToString();
            if (File.Exists(file03 + "Excel.exe"))
            {
                ifused = true;
            }
        }
        检查本机是否安装Office2007
        //if (akeytwo != null)
        //{
        //    string file07 = akeytwo.GetValue("Path").ToString();
        //    if (File.Exists(file07 + "Excel.exe"))
        //    {
        //        ifused = true;
        //    }
        //}
        return ifused;
    }

    static private bool ExcelNewerThan03()
    {
        bool newer = false;
        _Application tmp = new Microsoft.Office.Interop.Excel.Application();
        newer = double.Parse(tmp.Version) > 11.0;
        tmp.Quit();
        tmp = null;
        return newer;
    }

    /// <summary>
    /// 用指定数据集中的第一个表选择路径生成Excel文件
    /// </summary>
    /// <param name="ds"></param>
    /// <param name="表名"></param>
    /// <param name="打开电子表格"></param>
    static public void DataSetToExcel(DataSet ds , string 表名 , bool 打开电子表格 )
    {
        if (ds == null)
        {
            MessageBox.Show("没能从数据集中取得数据,无法创建电子表格。");
            return;
        }
        if (!isExcelInstalled())
        {
            MessageBox.Show("无法创建Excel对象,请确认已安装Excel。");
            return;
        }
        string saveFileName = "";
        bool fileSaved = false;
        SaveFileDialog saveDialog = new SaveFileDialog();
        saveDialog.DefaultExt = "xls";
        if (ExcelNewerThan03())
        {
            saveDialog.DefaultExt = "xlsx";
            saveDialog.FilterIndex = 2;
        }
        saveDialog.Filter = "Excel文件|*.xls|Excel文件|*.xlsx";
        saveDialog.FileName = 表名;
        if (saveDialog.ShowDialog() != DialogResult.OK)
        {
            return;
        }
        saveFileName = saveDialog.FileName;
        _Application excel = new Microsoft.Office.Interop.Excel.Application();
        excel.Application.Workbooks.Add(true);
        _Workbook 工作簿 = excel.ActiveWorkbook;                  //工作簿赋值为excel中的已激活工作簿
        _Worksheet 工作表 = (_Worksheet)工作簿.ActiveSheet;    //工作表赋值为工作簿中已激活的工作表
        工作表.Name = 表名;         //给工作表取名字
        System.Data.DataTable dt = ds.Tables[0];
        //向工作表填写列名
        for( int i = 0 ; i < dt.Columns.Count ; i++ )
        {
            工作表.Cells[1, 1 + i] = dt.Columns[i].ColumnName;
        }
        //向工作表填写数值
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            for( int j = 0 ; j < dt.Rows.Count ; j++ )
            {
                工作表.Cells[2 + j, 1 + i] = dt.Rows[j][i];
            }
        }
        //将工作簿另存为
        if (saveFileName != "")
        {
            try
            {
                工作簿.Saved = true;
                工作簿.SaveCopyAs(saveFileName);
                fileSaved = true;
                MessageBox.Show("成功创建电子表格。");
            }
            catch (Exception ex)
            {
                fileSaved = false;
                MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
                return;
            }
        }
        else
        {
            fileSaved = false;
        }
        工作簿.Close(null, null, null);                 //关闭工作簿
        excel.Quit();                                   //退出excel
        excel = null;                                   //赋值为NULL
        GC.Collect();//强行销毁
        if ( 打开电子表格 && fileSaved && File.Exists(saveFileName))
        {
            System.Diagnostics.Process.Start(saveFileName); //打开EXCEL
        }
    }


    /// <summary>
    /// 用指定表选择路径生成Excel文件
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="表名"></param>
    /// <param name="打开电子表格"></param>
    static public void DataTableToExcel(System.Data.DataTable dt, string 表名, bool 打开电子表格)
    {
        if (dt == null)
        {
            MessageBox.Show("没能从表中取得数据,无法创建电子表格。");
            return;
        }
        if (!isExcelInstalled())
        {
            MessageBox.Show("无法创建Excel对象,请确认已安装Excel。");
            return;
        }
        string saveFileName = "";
        bool fileSaved = false;
        SaveFileDialog saveDialog = new SaveFileDialog();
        saveDialog.DefaultExt = "xls";
        if (ExcelNewerThan03())
        {
            saveDialog.DefaultExt = "xlsx";
            saveDialog.FilterIndex = 2;
        }
        saveDialog.Filter = "Excel文件|*.xls|Excel文件|*.xlsx";
        saveDialog.FileName = 表名;
        if (saveDialog.ShowDialog() != DialogResult.OK)
        {
            return;
        }
        saveFileName = saveDialog.FileName;
        _Application excel = new Microsoft.Office.Interop.Excel.Application();
        excel.Application.Workbooks.Add(true);
        _Workbook 工作簿 = excel.ActiveWorkbook;                  //工作簿赋值为excel中的已激活工作簿
        _Worksheet 工作表 = (_Worksheet)工作簿.ActiveSheet;    //工作表赋值为工作簿中已激活的工作表
        工作表.Name = 表名;         //给工作表取名字
        //向工作表填写列名
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            工作表.Cells[1, 1 + i] = dt.Columns[i].ColumnName;
        }
        //向工作表填写数值
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            for( int j = 0 ; j < dt.Rows.Count ; j++ )
            {
                工作表.Cells[2 + j, 1 + i] = dt.Rows[j][i];
            }
        }
        //将工作簿另存为
        if (saveFileName != "")
        {
            try
            {
                工作簿.Saved = true;
                工作簿.SaveCopyAs(saveFileName);
                fileSaved = true;
                MessageBox.Show("成功创建电子表格。");
            }
            catch (Exception ex)
            {
                fileSaved = false;
                MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
                return;
            }
        }
        else
        {
            fileSaved = false;
        }
        工作簿.Close(null, null, null);                 //关闭工作簿
        excel.Quit();                                   //退出excel
        excel = null;                                   //赋值为NULL
        GC.Collect();//强行销毁
        if (打开电子表格 && fileSaved && File.Exists(saveFileName))
        {
            System.Diagnostics.Process.Start(saveFileName); //打开EXCEL
        }
    }
 } 
中文变量名的问题,还是请多包涵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值