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

您所在的位置:网站首页 Virtuoso导入文件最简单设置 C# winform Excel 导入导出(方法摘录自别人,这里讲如何使用以及一些注意问题)

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

2024-07-09 23:06| 来源: 网络整理| 查看: 265

最近很多人问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);             }

        }

导入代码

///         /// 读取Excel文件数据到DataTable         ///         /// Excel文件路径         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";

//         /// 执行查询语句,返回DataSet         ///         ///         ///         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;             }         }

        ///         /// 返回DataTable         ///         ///         ///         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的名称

调用方法

///         ///         ///         /// 文件路径         /// 控件DataGridView         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自带控件引用

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

就可以看到



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3