DataGridView中拖放带有图片的Excel,实现数据批量导入

1、带有DataGridView的窗体,界面如下

2、编写DataGridView支持拖放的代码

    Private Sub DataGridView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragEnterIf e.Data.GetDataPresent(DataFormats.FileDrop) ThenDim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())If files IsNot Nothing AndAlso files.Any(Function(f) _String.Equals(Path.GetExtension(f), ".xlsx", StringComparison.OrdinalIgnoreCase)) Thene.Effect = DragDropEffects.CopyEnd IfEnd IfEnd SubPrivate Sub DataGridView1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragDropTryDim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())If files IsNot Nothing AndAlso files.Length > 0 ThenDim excelPath = files(0)If String.Equals(Path.GetExtension(excelPath), ".xlsx", StringComparison.OrdinalIgnoreCase) ThenReadExcelToDataGridView(excelPath)ElseMessageBox.Show("仅支持.xlsx格式的Excel文件")End IfEnd IfCatch ex As ExceptionMessageBox.Show("处理失败:{0}" & ex.Message)End TryEnd Sub

3、使用OLEDB读取Excel文件

' 使用OLEDB读取Excel文件Private Sub ReadExcelToDataGridView(ByVal excelPath As String)DataGridView1.Rows.Clear()Dim connectionString As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES""",excelPath)Using connection As New OleDbConnection(connectionString)Tryconnection.Open()Dim sheetName = GetExcelSheetName(connection)If String.IsNullOrEmpty(sheetName) ThenMessageBox.Show("无法获取Excel工作表名称")ReturnEnd If'这里指定要读取excel的工作表标签名为sheetNameDim query = String.Format("SELECT * FROM [{0}]", sheetName)Dim adapter As New OleDbDataAdapter(query, connection)Dim dataTable As New DataTable()adapter.Fill(dataTable)' 填充DataGridView(跳过标题行)For i As Integer = 0 To dataTable.Rows.Count - 1Dim row = dataTable.Rows(i)Dim id = If(IsDBNull(row(0)), "", row(0).ToString())Dim name = If(IsDBNull(row(1)), "", row(1).ToString())Dim imgPath = If(IsDBNull(row(2)), "", row(2).ToString())Dim img As Image = NothingIf Not String.IsNullOrEmpty(imgPath) AndAlso File.Exists(imgPath) Thenimg = Image.FromFile(imgPath)Elseimg = My.Resources.NoImage  ' 需要在项目中添加默认图片资源End IfDataGridView1.Rows.Add(id, name, img)NextCatch ex As ExceptionMessageBox.Show("读取Excel失败:{ex.Message}")End TryEnd UsingEnd Sub' 获取Excel第一个工作表名称Private Function GetExcelSheetName(ByVal connection As OleDbConnection) As StringTryDim dataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)If dataTable IsNot Nothing AndAlso dataTable.Rows.Count > 0 ThenReturn dataTable.Rows(0)("TABLE_NAME").ToString()End IfReturn String.EmptyCatchReturn String.EmptyEnd TryEnd Function

4、创建一个Excel文件,这里要求为Excel第一个工作表

5、最终效果

6、完整代码如下:

Imports System.IO
Imports System.Windows.Forms
Imports System.Data.OleDb  ' 使用OLEDB访问ExcelPublic Class Form3Private Sub MainForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load' 初始化DataGridViewDataGridView1.AllowDrop = TrueDataGridView1.Columns.Add("ID", "编号")DataGridView1.Columns.Add("Name", "名称")' 添加图片列Dim imgCol As New DataGridViewImageColumnimgCol.HeaderText = "图片"imgCol.ImageLayout = DataGridViewImageCellLayout.ZoomDataGridView1.Columns.Add(imgCol)End SubPrivate Sub DataGridView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragEnterIf e.Data.GetDataPresent(DataFormats.FileDrop) ThenDim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())If files IsNot Nothing AndAlso files.Any(Function(f) _String.Equals(Path.GetExtension(f), ".xlsx", StringComparison.OrdinalIgnoreCase)) Thene.Effect = DragDropEffects.CopyEnd IfEnd IfEnd SubPrivate Sub DataGridView1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragDropTryDim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())If files IsNot Nothing AndAlso files.Length > 0 ThenDim excelPath = files(0)If String.Equals(Path.GetExtension(excelPath), ".xlsx", StringComparison.OrdinalIgnoreCase) ThenReadExcelToDataGridView(excelPath)ElseMessageBox.Show("仅支持.xlsx格式的Excel文件")End IfEnd IfCatch ex As ExceptionMessageBox.Show("处理失败:{0}" & ex.Message)End TryEnd Sub' 使用OLEDB读取Excel文件Private Sub ReadExcelToDataGridView(ByVal excelPath As String)DataGridView1.Rows.Clear()Dim connectionString As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES""",excelPath)Using connection As New OleDbConnection(connectionString)Tryconnection.Open()Dim sheetName = GetExcelSheetName(connection)If String.IsNullOrEmpty(sheetName) ThenMessageBox.Show("无法获取Excel工作表名称")ReturnEnd If'这里指定要读取excel的工作表标签名为sheetNameDim query = String.Format("SELECT * FROM [{0}]", sheetName)Dim adapter As New OleDbDataAdapter(query, connection)Dim dataTable As New DataTable()adapter.Fill(dataTable)' 填充DataGridView(跳过标题行)For i As Integer = 0 To dataTable.Rows.Count - 1Dim row = dataTable.Rows(i)Dim id = If(IsDBNull(row(0)), "", row(0).ToString())Dim name = If(IsDBNull(row(1)), "", row(1).ToString())Dim imgPath = If(IsDBNull(row(2)), "", row(2).ToString())Dim img As Image = NothingIf Not String.IsNullOrEmpty(imgPath) AndAlso File.Exists(imgPath) Thenimg = Image.FromFile(imgPath)Elseimg = My.Resources.NoImage  ' 需要在项目中添加默认图片资源End IfDataGridView1.Rows.Add(id, name, img)NextCatch ex As ExceptionMessageBox.Show("读取Excel失败:{ex.Message}")End TryEnd UsingEnd Sub' 获取Excel第一个工作表名称Private Function GetExcelSheetName(ByVal connection As OleDbConnection) As StringTryDim dataTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)If dataTable IsNot Nothing AndAlso dataTable.Rows.Count > 0 ThenReturn dataTable.Rows(0)("TABLE_NAME").ToString()End IfReturn String.EmptyCatchReturn String.EmptyEnd TryEnd Function
End Class

最后说明,Excel中如果使用图片的绝对路径,Excel放在任何位置都行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创新点!贝叶斯优化、CNN与LSTM结合,实现更准预测、更快效率、更高性能!

能源与环境领域的时空数据预测面临特征解析与参数调优双重挑战。CNN-LSTM成为突破口:CNN提取空间特征,LSTM捕捉时序依赖,实现时空数据的深度建模。但混合模型超参数(如卷积核数、LSTM层数)调优复杂,传统方法…

获取点击点所在区域所能容纳最大连续空白矩形面积及顶点坐标需求分析及相关解决方案

近日拿到一个需求,通过分析思考以及查询资料得以解决,趁着不忙记录一下: 需求: 页面上放一个图片控件,载入图片之后,点击图片任何一个白色空间,找出点击点所在区域所能容纳的最大连续空白矩形…

vue-cli 构建打包优化(JeecgBoot-Vue2 配置优化篇)

项目:jeecgboot-Vue2 在项目二次开发后,在本人电脑打包时间为3分35秒左右 webpack5默认优化: Tree Shaking(摇树优化):删除未使用的代码base64 内联: 小于 8KB 的资源(图片等&…

科学养生:解锁现代健康生活新方式

在现代社会,熬夜加班、外卖快餐、久坐不动成了很多人的生活常态,由此引发的亚健康问题日益凸显。其实,遵循科学的养生方式,无需复杂操作,从日常细节调整,就能显著提升健康水平。​ 饮食上,把控…

PostGIS使用小结

文章目录 PostGIS使用小结简介安装配合postgres使用的操作1.python安装gdal PostGIS使用小结 简介 PostGIS 是 PostgreSQL 数据库的地理空间数据扩展,通过为 PostgreSQL数据库增加地理空间数据类型、索引、函数和操作符,使其成为功能强大的空间数据库&…

NNG和DDS

NNG (Nanomsg Next Generation) 和 DDS (Data Distribution Service) 是两种不同的通信协议,各自在不同场景下具有其优势。下面我将对这两种技术进行详细解释,并通过具体的例子来说明它们如何应用在实际场景中。 1. NNG (Nanomsg Next Generation) NNG简…

自制操作系统day7(获取按键编码、FIFO缓冲区、鼠标、键盘控制器(Keyboard Controller, KBC)、PS/2协议)

day7 获取按键编码(hiarib04a) void inthandler21(int *esp) {struct BOOTINFO *binfo (struct BOOTINFO *) ADR_BOOTINFO; // 获取系统启动信息结构体指针unsigned char data, s[4]; // data: 键盘数据缓存&#x…

Javase 基础加强 —— 09 IO流第二弹

本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。 01 缓冲字节…

服务器操作系统调优内核参数(方便查询)

fs.aio-max-nr1048576 #此参数限制并发未完成的异步请求数目,应该设置避免I/O子系统故障 fs.file-max1048575 #该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量 fs.inotify.max_user_watches8192000 #表…

[Windows] 格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具

想要轻松搞定各类媒体文件格式转换?这款 Windows 平台的格式工厂 FormatFactory v5.20 便携版 正是你的不二之选!无需安装,即开即用,为你带来高效便捷的文件处理体验。 全能格式转换,满足多元需求 软件功能覆盖视频、…

[AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)

主流大模型特色对比表 模型核心优势适用场景局限性DeepSeek- 数学/代码能力卓越(GSM8K准确率82.3%)1- 开源生态完善(支持医疗/金融领域)7- 成本极低(API价格仅为ChatGPT的2%-3%)5科研辅助、代码开发、数据…

国际荐酒师(香港)协会亮相新西兰葡萄酒巡展深度参与赵凤仪大师班

国际荐酒师(香港)协会率团亮相2025新西兰葡萄酒巡展 深度参与赵凤仪MW“百年百碧祺”大师班 广州/上海/青岛,2025年5月12-16日——国际荐酒师(香港)协会(IRWA)近日率专业代表团出席“纯净独特&…

Node.js Express 项目现代化打包部署全指南

Node.js Express 项目现代化打包部署全指南 一、项目准备阶段 1.1 依赖管理优化 # 生产依赖安装(示例) npm install express mongoose dotenv compression helmet# 开发依赖安装 npm install nodemon eslint types/node --save-dev1.2 环境变量配置 /…

java基础知识回顾3(可用于Java基础速通)考前,面试前均可用!

目录 一、基本算数运算符 二、自增自减运算符 三、赋值运算符 四、关系运算符 五、逻辑运算符 六、三元运算符 七、 运算符的优先级 八、小案例:在程序中接收用户通过键盘输入的数据 声明:本文章根据黑马程序员b站教学视频做的笔记,可…

随机密码生成器:原理、实现与应用(多语言实现)

在当今数字化的时代,信息安全至关重要。而密码作为保护个人和敏感信息的第一道防线,其安全性直接关系到我们的隐私和数据安全。然而,许多人在设置密码时往往使用简单、易猜的组合,如生日、电话号码或常见的单词,这使得…

TypeScript 泛型讲解

如果说 TypeScript 是一门对类型进行编程的语言,那么泛型就是这门语言里的(函数)参数。本章,我将会从多角度讲解 TypeScript 中无处不在的泛型,以及它在类型别名、对象类型、函数与 Class 中的使用方式。 一、泛型的核…

SQL 每日一题(6)

继续做题! 原始表:employee_resignations表 employee_idresignation_date10012022-03-1510022022-11-2010032023-01-0510042023-07-1210052024-02-28 第一题: 查询累计到每个年度的离职人数 结果输出:年度、当年离职人数、累计…

工业RTOS生态重构:从PLC到“端 - 边 - 云”协同调度

一、引言 在当今数字化浪潮席卷全球的背景下,工业领域正经历着深刻变革。工业自动化作为制造业发展的基石,其技术架构的演进直接关系到生产效率、产品质量以及企业的市场竞争力。传统的PLC(可编程逻辑控制器)架构虽然在工业控制领…

从版本控制到协同开发:深度解析 Git、SVN 及现代工具链

前言:在当今软件开发的浪潮中,版本控制与协同开发无疑扮演着举足轻重的角色。从最初的单兵作战到如今大规模团队的高效协作,一套成熟且得力的版本控制系统以及围绕其构建的现代工具链,已然成为推动软件项目稳步前行的关键引擎。今…

Visual Studio Code插件离线安装指南:从市场获取并手动部署

Visual Studio Code插件离线安装指南:从市场获取并手动部署 一、场景背景二、操作步骤详解步骤1:访问官方插件市场步骤2:定位目标版本步骤3:提取关键参数步骤4:构造下载链接步骤5:下载与安装 三、注意事项 …