学习使用winform实现excel表格的导入导出功能,制作一个小demo。
先画一个简单的界面:表名comboBox中的值为数据库中的表名[‘student’,‘teacher’,‘class’,‘school’],
针对选中的表名进行查询,上传和下载。查询到的数据在dataGridView控件中显示。

Form1.cs 代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;namespace ExcelControlWindowsFormsApp
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void import_button_Click(object sender, EventArgs e){//设置对话框的初始目录为C盘this.openFileDialog1.InitialDirectory = "C:\\";//筛选字符串为所有文件this.openFileDialog1.Filter = "所有文件(*.*)|*.*";this.openFileDialog1.RestoreDirectory = true;if (this.openFileDialog1.ShowDialog() == DialogResult.OK){string PicFileName = this.openFileDialog1.FileName.Trim();bool resule = Import(PicFileName);if (resule){MessageBox.Show("上传成功!");}}}/// <summary>/// 导入Excel文件/// </summary>/// <param name="filePath"></param>/// <returns></returns>private bool Import(string filePath){OleDbConnection con = null;try{string strFileType = System.IO.Path.GetExtension(filePath);string strConn = "";//Excel就好比一个数据源一般使用if (strFileType == ".xls"){ // Excel 2003 版本连接字符串strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2;'";}else { // Excel 2007 以上版本连接字符串//HDR:Yes 表示第一行包含列名,在计算行数时就不包含第一行。NO 则完全相反。//IMEX:0 写入模式;1 读取模式;2 读写模式。如果报错为“不能修改表 sheet1 的设计。它在只读数据库中”,那就去掉这个,问题解决。strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2;'";}con = new OleDbConnection(strConn);con.Open();string[] names = GetExcelSheetNames(filePath);if (names.Length > 0){foreach (string name in names){using (OleDbDataAdapter adapter = new OleDbDataAdapter(string.Format(" select * from [{0}$]", name), con)) {System.Data.DataTable dt = new System.Data.DataTable();adapter.Fill(dt);//将数据入库insertExcelData(dt);}}}return true;}catch (Exception ex){MessageBox.Show(ex.Message);return false;}finally{con.Close();}}/// <summary>/// 获取excel文件中的sheet名/// </summary>/// <param name="filePath"></param>/// <returns></returns>private string[] GetExcelSheetNames(string filePath){Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();Microsoft.Office.Interop.Excel.Workbooks wbs = excelApp.Workbooks;Microsoft.Office.Interop.Excel.Workbook wb = wbs.Open(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing, Type.Missing);int count = wb.Worksheets.Count;string[] names = new string[count];for (int i = 1; i <= count; i++){names[i - 1] = ((Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[i]).Name;}return names;}/// <summary>/// 将数据入库/// </summary>/// <param name="dataTable"></param>private void insertExcelData(DataTable dataTable) {string tableName = this.tableName_comboBox.Text.Trim();string columnName = "";int i = 0;int count = dataTable.Columns.Count;foreach (DataColumn col in dataTable.Columns) {if (i == count - 1) {columnName += "[" + col.ColumnName.Trim() + "]";}else{columnName += "[" + col.ColumnName.Trim() + "],";}i++;}foreach (DataRow row in dataTable.Rows) {string valueData = "";for (int j = 0; j < count; j++){if (j == count - 1){valueData += "'" + row[j].ToString().Trim() + "'";}else{valueData += "'" + row[j].ToString().Trim() + "',";}}string sql = "INSERT INTO [dbo].["+ tableName + "] ("+ columnName + ") VALUES ("+ valueData + ")";SqlHelper sqlHelper = new SqlHelper();sqlHelper.ExecuteNonQuery(sql, CommandType.Text, null);}}/// <summary>/// 查询数据库中的数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void select_button_Click(object sender, EventArgs e){DataTable dt = selectData();showDataGridView(dt);}private void export_button_Click(object sender, EventArgs e){string localFilePath = "", fileNameExt = "", FilePath = "";SaveFileDialog saveFileDialog = new SaveFileDialog();//设置文件类型//书写规则例如:txt files(*.txt)|*.txtsaveFileDialog.Filter = "txt files(*.txt)|*.txt|xls files(*.xls)|*.xls|xlsx files(*.xlsx)|*.xlsx|All files(*.*)|*.*";//设置默认文件名(可以不设置)saveFileDialog.FileName = this.tableName_comboBox.Text.Trim()+"Data";//主设置默认文件extension(可以不设置)saveFileDialog.DefaultExt = "xls";//获取或设置一个值,该值指示如果用户省略扩展名,文件对话框是否自动在文件名中添加扩展名。(可以不设置)saveFileDialog.AddExtension = true;//设置默认文件类型显示顺序(可以不设置)saveFileDialog.FilterIndex = 2;//保存对话框是否记忆上次打开的目录saveFileDialog.RestoreDirectory = true;// Show save file dialog boxDialogResult result = saveFileDialog.ShowDialog();//点了保存按钮进入if (result == DialogResult.OK){//获得文件路径localFilePath = saveFileDialog.FileName.ToString();//获取文件名,不带路径fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf("\\") + 1);//获取文件路径,不带文件名FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("\\"));//在文件名里加字符//saveFileDialog.FileName.Insert(1,"dameng");//第一种写入方法---输入流//为用户使用 SaveFileDialog 选定的文件名创建读/写文件流。//System.IO.FileStream fs = (System.IO.FileStream)saveFileDialog.OpenFile();//输出文件//fs可以用于其他要写入的操作//第二种写入方法---使用Microsoft.Office.Interop.ExcelDataTable dataTable = selectData();bool resule = DataTableToExcel(localFilePath, dataTable, true);if (resule) {MessageBox.Show("下载成功!");}}}/// <summary>/// 导出Excel文件/// </summary>/// /// <param name="dataSet"></param>/// <param name="dataTable">数据集</param>/// <param name="isShowExcle">导出后是否打开文件</param>/// <returns></returns>private bool DataTableToExcel(string filePath, DataTable dataTable, bool isShowExcle){//System.Data.DataTable dataTable = dataSet.Tables[0];int rowNumber = dataTable.Rows.Count;int columnNumber = dataTable.Columns.Count;int colIndex = 0;if (rowNumber == 0){return false;}Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];excel.Visible = isShowExcle;Microsoft.Office.Interop.Excel.Range range;foreach (DataColumn col in dataTable.Columns){colIndex++;excel.Cells[1, colIndex] = col.ColumnName;}object[,] objData = new object[rowNumber, columnNumber];for (int r = 0; r < rowNumber; r++){for (int c = 0; c < columnNumber; c++){objData[r, c] = dataTable.Rows[r][c];}}range = worksheet.Range[excel.Cells[2, 1], excel.Cells[rowNumber + 1, columnNumber]];range.Value2 = objData;range.NumberFormatLocal = "@";worksheet.SaveAs(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);//excel.Quit();return true;}/// <summary>/// 从数据库中查询数据/// </summary>/// <returns></returns>private DataTable selectData() {DataTable dataTable = new DataTable();SqlHelper sqlHelper = new SqlHelper();string tableName = this.tableName_comboBox.Text.Trim();string sql = "select * from " + tableName;dataTable = sqlHelper.ExecuteDataTable(sql, CommandType.Text, null);return dataTable;}private void Form1_Load(object sender, EventArgs e){//初始化 comboBox 数据this.tableName_comboBox.Text = "student";//初始化 datagridview 数据DataTable dataTable = selectData();showDataGridView(dataTable);}/// <summary>/// 表格数据填充/// </summary>/// <param name="dt"></param>private void showDataGridView(DataTable dt) {this.dataGridView1.Columns.Clear();this.dataGridView1.Rows.Clear();this.dataGridView1.Columns.Add("RowState", "rowstate");//添加新列foreach (DataColumn col in dt.Columns){this.dataGridView1.Columns.Add(col.ColumnName, col.ColumnName);}this.dataGridView1.Rows.Clear();this.dataGridView1.Rows.Add(dt.Rows.Count);//增加同等数量的行数int i = 0;foreach (DataRow row in dt.Rows)//逐个读取单元格的内容;{DataGridViewRow r1 = this.dataGridView1.Rows[i];r1.Cells[0].Value = row.RowState.ToString();for (int j = 0; j < dt.Columns.Count; j++){r1.Cells[j + 1].Value = row[j].ToString();}i++;}}}
}

其中SqlHelper.cs在之前的文章中写过。文章链接:
https://blog.csdn.net/weixin_41561640/article/details/106142100

在调试过程中出现的问题
1、下载功能:
报错:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。
解决方法:
控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCom配置-》找到Microsoft Excel 应用程序
之后单击属性打开此应用程序的属性对话框。 单击标识选项卡,然后选择交互式用户。
2、如果在Dcom配置中找不到Microsoft Excel:
在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Microsoft Excel程序,这主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的。
解决方法:
可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,这里就能看到excel组件了
3、上传功能:
报错:System.InvalidOperationException: 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。
解决方法:
下载微软数据控件,然后安装就行了
参考文章:
https://blog.csdn.net/weixin_44668267/article/details/91489903

C# winform实现excel导入导出 及实现过程中的问题解决相关推荐

  1. jeesite html导入excel,JeeSite中Excel导入导出

    在各种管理系统中,数据的导入导出是经常用到的功能,通常导入导出以Excel.CSV格式居多.如果是学习的过程中,最好是自己实现数据导入与导出的功能,然而在项目中,还是调用现成的功能比较好.近期一直使用 ...

  2. excel winform 导入 导出_强大的 Excel 导入导出工具 hutool

    " 最近项目上需要用到 Excel 的导入导出功能,想着之前使用的都有点麻烦,所以结合多方资料,终于找到了这个还算不错的 Excel 处理工具,一起来看" 今日安利好物名为 Hut ...

  3. 注解+反射优雅的实现Excel导入导出(通用版)

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/youzi1394046585/ article/details/86670203 日常在做后 ...

  4. java超级简单到爆的Excel导入导出(easypoi)

    场景: 在日常工作中,excel导入导出,是十分常见的,有两种主流的技术,一种是jxl,另一种是poi,而easypoi就是对poi进行了封装,使得导入导出变得更加的简单,阿里巴巴也有封装的工具名叫E ...

  5. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  6. easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单

    做积极的人,而不是积极废人! 来源:jianshu.com/p/8f3defdc76d4EasyExcelGitHub上的官方说明快速开始maven仓库地址导入导出总结 EasyExcel 在做exc ...

  7. easypoi 多sheet导入_程序员接私活利器 玩转excel导入导出

    为什么会写Easypoi 以前的以前(岁月真TMD的快)我虽然写了不少代码但还是很少写poi,然后跳到一家公司之后就和业务人员聊上了,来这个需要个报表,这个报表样式是这样的,这个表头是这样的,就这样我 ...

  8. SpringBoot集成EasyPoi实现Excel导入导出

    作者介绍: 本人Java特工,代号:Cris Li : 中文名:克瑞斯理 简书地址: 消失的码农 - 简书 CSDN地址: https://blog.csdn.net/jianli95 个人纯洁版博客 ...

  9. SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!

    在我们平时工作中经常会遇到要操作Excel的功能,比如导出个用户信息或者订单信息的Excel报表.你肯定听说过POI这个东西,可以实现.但是POI实现的API确实很麻烦,它需要写那种逐行解析的代码(类 ...

最新文章

  1. Scala学习 day01 Scala的类/方法/对象/单例对象
  2. VirtualBox——在Win7的HOST上安装配置虚拟机CentOS7
  3. 国密算法椭圆曲线参数
  4. Android学习指南
  5. python中的索引从几开始计数_计算机为什么要从 0 开始计数?
  6. 使用 custom element 创建自定义元素
  7. Bootstrap3 静态模态对话框
  8. 特殊的栈GetMin
  9. 扫码枪测试软件,有线条码扫码枪的测试方法
  10. Java高级工程师面试题总结及参考答案
  11. 网络文学格局已定?未必
  12. 谷歌打开微信定位服务器地址,使用Chrome修改user agent模拟微信内置浏览器
  13. 13 款免费但好用到哭的项目管理工具
  14. MacBook Air下载easyconnect软件后双击打不开后发生的问题
  15. 「前端代码简洁之路」后台系统之详情页设计
  16. SAP请求一键传输程序
  17. 深信服研发、市场等大量岗位社招、校招内推
  18. 诊断故障码(Diagnostic Trouble Code-DTC)
  19. 去健身房健身戴什么耳机好、最适合运动健身的健身房耳机推荐
  20. 3阶魔方阵c语言算法,3阶魔方阵的算法

热门文章

  1. mysql截取前几个字符串_MySql中截取字符串中的某几个字符
  2. math: 判断两个向量之间夹角是逆时针或顺时针
  3. 论文浅尝 | 常识问答中的忠诚知识图解释
  4. 带 Touch ID 的新款 iMac 妙控键盘可以单独购买
  5. 圆与圆的位置关系题目含答案_高中数学直线、圆的位置关系的测试题及答案
  6. 渗透测试和红蓝对抗是什么意思?有什么区别?
  7. 来自潘帕斯草原的雄鹰
  8. 数据库设计之E-R图和关系表
  9. Impinj及Accruent医疗合作推出医疗设备跟踪方案
  10. B树和B+树傻傻分不清楚?