C# winform Excel 导入导出(方法摘录自别人,这里讲如何使用以及一些注意问题) |
您所在的位置:网站首页 › Virtuoso导入文件最简单设置 › 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); } } 导入代码 /// /// 读取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 |