C# winform Excel 导入导出(方法摘录自别人,这里讲如何使用以及一些注意问题)

最近很多人问excel导入导出问题,关于这方面我原来很早发布过一个博客,但是显然,错误很多,导致大家复用之后出现各种各样的问题,做了无用功,这就很抱歉,所以这次我重新发一个尽量大家可以通用的。
我目前所了解的方法有三种:

1.vs本身自带的控件 Microsoft.Office.Interop.Excel

    A.这种数据量一多会牵扯到一个效率问题

    B.会遇到版本问题比较多(例如xls与xlsx,因为版本问题,可能那个格式就导入不进去)

2.NPOI控件(这种具体没怎么用过,大家可以下去试试)

3.Aspose控件(这种感觉还是比较实用,特别是效率方面很友好)

下面我们讲代码:

加载界面代码

private void frmImput_Load(object sender, EventArgs e)
        {
            //清楚下拉框数据
            cmb_inTbName.Items.Clear();
            //获取当前数据所有表名
            strSql = "select table_name from information_schema.tables where table_schema='dbo'";
            System.Data.DataTable dsTableName = DBHelper.getTable(strSql);//此处调用自己写的方法
            //存入下拉框方便查询            
            foreach (DataRow dr in dsTableName.Rows)
            {
                cmb_inTbName.Items.Add(dr[0].ToString());
                cmb_outTbName.Items.Add(dr[0].ToString());
            }

        }

 

导入界面(摘录自某同学)

界面上实际用到的只有文件路径/预览/导入,数据展示中是数据集合DataGridView,

这里做的操作就是将Excel表中数据展示到DataGridView

点击预览

当中代码

private System.Windows.Forms.OpenFileDialog openFileDialog = new OpenFileDialog();//打开文件

 //---导入操作---
        private void btn_inDataShow_Click(object sender, EventArgs e)
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)//判断是否选择打开文件
            {
                this.txt_inFileSelectPath.Text = openFileDialog.FileName;//将文件路径赋与文本框txt_inFileSelectPath                
                Import_Excel(openFileDialog.FileName);
            }

        }

导入代码

/// <summary>
        /// 读取Excel文件数据到DataTable
        /// </summary>
        /// <param name="filePath">Excel文件路径</param>
        private void Import_Excel(string filePath)
        {
            
            string sqlconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
           // string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Server.MapPath("ExcelFiles/Mydata2007.xlsx") + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串

            string sql = @"select * from [Sheet1$]";

            try
            {
                using (OleDbConnection conn = new OleDbConnection(sqlconn))
                {
                    using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, conn))
                    {
                        System.Data.DataTable dt = new System.Data.DataTable();
                        adapter.Fill(dt);
                        dgvMain.DataSource = dt;//将数据展示到DataGridView
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("打开文件出错,错误信息:" + ex.Message.ToString(), "提示");
            }

        }

这个版本测试过后缀为xls的Excel文件正常使用。

可能大部分新手就是需要这块的代码

至于如何将DataGridView数据导入数据库, 就是最基础的增加数据,这里就不贴代码了,只是说一下思路

1.遍历当前DataGirdView获取所有数据(for或者foreace)

2.将当前数据按对应名称依次  inset into 存入,这里可以一条一条加入,也可以批量添加

连接和增删改的方法写入到DBHelp中,然后调用就行,减少数据库重复调用。

基本直接复用,不用修改什么(除了你的数据库连接)

 static private string connString = @"Data Source=LAPTOP-H1AVCBFB\SQLSERVER;Initial Catalog=yao;User Id=sa;Pwd=123";

// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param name="SQLString"></param>
        /// <returns></returns>
        public static DataSet Query(string SQLString)
        {
            using (SqlConnection connection = new SqlConnection(connString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
                    command.Fill(ds, "ds");
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }

        /// <summary>
        /// 返回DataTable
        /// </summary>
        /// <param name="SQLString"></param>
        /// <returns></returns>
        public static DataTable getTable(string SQLString)
        {
            DataTable rtv = null;
            DataSet ds = Query(SQLString);
            if (ds.Tables.Count > 0)
            {
                rtv = ds.Tables[0];
            }
            return rtv;
        }

 

 

关于导出(摘录自某同学)

这里是先根据下拉框查询出数据库所有表,点击查询按钮,将数据展示到DataGridView中,点击导出,导出Excel

当前查询代码

//查询当前表
        private void btn_outSelect_Click(object sender, EventArgs e)
        {
            //清空Sql
            strB.Clear();
            //判断是否选择表名
            if (cmb_outTbName.SelectedIndex > -1)
            {
                strB.Append("select * from  " + cmb_outTbName.Text + "");
                dgv_outMain.DataSource = DBHelper.getTable(strB.ToString());
            }
            else
            {
                MsgBoxErr("请选择表名!", "");
            }
        }

报错信息提示:

 public static void MsgBoxErr(string paraMsg, string paraTitle)
        {
            if (string.IsNullOrEmpty(paraTitle))
            {
                paraTitle = "提示";
            }
            MessageBox.Show(paraMsg, paraTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

 

根据查询当前数据已经展示到DataGridView中,下面导出

点击导出按钮:

 private void btn_outExcel_Click(object sender, EventArgs e)
        {

            //string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            ExportExcels(cmb_outTbName.Text, dgv_outMain);


        }

这里传递的是当前下拉框的值和当前DataGridView的名称

调用方法

/// <summary>
        ///
        /// </summary>
        /// <param name="fileName">文件路径</param>
        /// <param name="myDGV">控件DataGridView</param>
        private void ExportExcels(string fileName, DataGridView myDGV)
        {
            string saveFileName = "";
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.DefaultExt = "xls";
            saveDialog.Filter = "Excel文件|*.xls";
            saveDialog.FileName = fileName;
            saveDialog.ShowDialog();
            saveFileName = saveDialog.FileName;
            if (saveFileName.IndexOf(":") < 0) return; //被点了取消
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            if (xlApp == null)
            {
                MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
                return;
            }
            Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
            Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
            //写入标题
            for (int i = 0; i < myDGV.ColumnCount; i++)
            {
                worksheet.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;
            }
            //写入数值
            for (int r = 0; r < myDGV.Rows.Count; r++)
            {
                for (int i = 0; i < myDGV.ColumnCount; i++)
                {
                    worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;
                }
                System.Windows.Forms.Application.DoEvents();
            }
            worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
            if (saveFileName != "")
            {
                try
                {
                    workbook.Saved = true;
                    workbook.SaveCopyAs(saveFileName);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
                }
            }
            xlApp.Quit();
            GC.Collect();//强行销毁
            MessageBox.Show("文件: " + fileName + ".xls 保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

这里基本直接复用就可以。

 

关于VS自带控件引用

右键-添加引用-程序集-扩展

就可以看到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值