据我浅薄的知识,之前只知道两种操作excel的方法:

一。ODBC操作excel
看下图:

1.ODBC
由于初期连接不同的数据库通过vb.net教程各种不同的API,ODBC就是将各种不同的API封装成统一的接口。当sql语句进入接口时驱动器管理器会判断将他们送入对应的驱动器(driver),由对应的驱动将sql语句送入对应的数据库。
缺点:不同版本的excel,需要添加不同的ODBC数据源。

2.OLEDB与ODBC
OLEDB:一个基于COM(Componet Object Model,DOS可执行命令文件)的数据存储对象,能提供对所有类型的数据的操作。
我们必须知道,ODBC 是为访问关系型数据库而专门开发的,OLE DB 则用于访问关系型和非关系型信息源,例如主机 ISAM/VSAM 和层次数据库,电子邮件和文件系统存储,文本、图形和地理数据以及自定义业务对象。
OLEDB其实和ODBC类似,都是负责数据库连接的低级接口。而OLEDB不仅支持结构化数据库如SQL server,Oracel Access等,而且还支持非结构化数据源的连接如EXCEL等。
OLEDB(对象连接和嵌入数据库),是一组对象的集合,一种读写数据的方法。在使用OLEDB时,使用步骤为:初始化OLE、连接到数据源、发出命令、处理结果、释放数据源对象并停止初始化OLE。他可以通过ODBC连接到数据库,也可以之间连接到数据库。当不通过ODBC时,这时在这其中并不涉及到驱动器的成分,因此,此时的数据库连接速度会更快。同时,我们可以知道,只要支持ODBC的数据源是一定能够支持OLEDB的。但是反过来则不一定。
也就是说OLEDB包含ODBC

3。ADO
是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。

二。OLEDB
这种方式的有点速度非常快,但是excel数据量大的时候,会非常占用内存。当内存不够时会抛出内存溢出异常。
缺点是不能设置单元格格式。
1、操作Excel2007以前(不含2007)的连接字符串
string strConn = “Provider=Microsoft.Jet.OleDb.4.0;” + “data source=” + excelFilePath + “;Extended Properties=‘Excel 8.0; HDR=Yes; IMEX=1’”; //此连接只能操作Excel2007之前(.xls)文件
2、操作2007以后的Excel的连接字符串
string strConn = “Provider=Microsoft.Ace.OleDb.12.0;” + “data source=” + excelFilePath + “;Extended Properties=‘Excel 12.0; HDR=Yes; IMEX=1’”; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)

三。终极方法NOPI
终于来到重点了。

NOPI 是开源的 用C#编写的读写excel、word等微软的OLE2组件文档的项目。
准备:
NOPI nuget 包:https://www.nuget.org/packages/NPOI

注意:2.2.1亲测支持 .net 3.5,其余不确定,2.4.0不支持 .net 3.5,其余不确定。
用到再说。

步骤
1。导入NOPI Nuget包,具体见,https://blog.csdn.net/weixin_43553234/article/details/85108137。

2。调用用例,下面是我写的vb.net导出到EXCEL的类。

Imports System.Reflection
Imports NPOI.SS.UserModel
Imports NPOI.XSSF.UserModel
Imports NPOI.HSSF.UserModel
Imports System.IO

Public Class NopiExcel

Private workbook As IWorkbook   '’工作簿
Private sheetList As List(Of ISheet) = New List(Of ISheet)()  '’sheet列表
Private Shared suffixName As String = ".xls"Public Sub New(ByVal suffixName As String)If suffixName = ".xlsx" Thenworkbook = New XSSFWorkbook()ElseIf suffixName = ".xls" Thenworkbook = New HSSFWorkbook()End IfsuffixName = suffixName
End Sub''' <summary>
''' 共享方法,得到此计算机EXCEL表的后缀名
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function getSuffixName()Dim version As Double = checkExcelVer()If version = -1 ThensuffixName = ".xls"ElseIf version >= 12 ThensuffixName = ".xlsx"ElsesuffixName = ".xls"End IfReturn suffixName
End Function''' <summary>
''' 创建sheet表
''' </summary>
''' <param name="sheetName">sheet名</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function creatSheet(ByVal sheetName As String) As ISheetIf workbook Is Nothing ThenMsgBox("IWorkbook的实例为nothing", , "错误")Return NothingEnd IfDim sheet As ISheet = workbook.CreateSheet(sheetName)sheetList.Add(sheet)Return sheet
End Function''' <summary>
''' 把dataTable的值写到excel
''' </summary>
''' <remarks></remarks>
Public Sub write(ByVal dataTable As DataTable, ByVal sheet As ISheet)If sheet Is Nothing ThenMsgBox("ISheet的实例为nothing", , "错误")ReturnEnd IfIf dataTable Is Nothing ThenMsgBox("DataTable的实例为nothing", , "错误")ReturnEnd If''表头  Dim row As IRow = sheet.CreateRow(0)For j = 0 To dataTable.Columns.Count - 1Dim cell As ICell = row.CreateCell(j)cell.SetCellValue(dataTable.Columns(j).ColumnName.ToString)NextFor i = 0 To dataTable.Rows.Count - 1row = sheet.CreateRow(i + 1)For j = 0 To dataTable.Columns.Count - 1Dim cell As ICell = row.CreateCell(j)cell.SetCellValue(dataTable.Rows(i).Item(j).ToString)NextNextEnd Sub''' <summary>
''' excel 工作簿保存
''' </summary>
''' <param name="fileAddress">保存路径</param>
''' <remarks></remarks>
Public Sub save(ByVal fileAddress As String)''转为字节数组  Dim stream As MemoryStream = New MemoryStream()workbook.Write(stream)Dim buf = stream.ToArray()Dim fs As FileStream = New FileStream(fileAddress, FileMode.Create, FileAccess.Write)''保存为Excel文件  Using (fs)fs.Write(buf, 0, buf.Length)fs.Flush()End Using
End Sub''' <summary>
''' 检测此计算机EXCEL的版本号
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function checkExcelVer() As DoubleDim objExcelType As Type = Type.GetTypeFromProgID("Excel.Application")Dim objApp = Activator.CreateInstance(objExcelType)If objApp Is Nothing ThenReturn 0End IfDim objVer = objApp.GetType().InvokeMember("Version", BindingFlags.GetProperty, Nothing, objApp, Nothing)If objVer Is Nothing ThenReturn -1End IfDim iVer As Double = Convert.ToDouble(objVer)Return iVerEnd Function''' <summary>
''' 得到EXCEL版本
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function getExcelVerStr() As StringDim s1 As StringDim excelver As Doubleexcelver = checkExcelVer()s1 = " Office "If excelver = Nothing ThenMessageBox.Show("無法識別Excel的版本", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Information)s1 = "無法識別 office 版本"ElseIf (excelver >= 14) Thens1 += "2010或以上"ElseIf (excelver >= 12) Thens1 += "2007"ElseIf (excelver >= 11) Thens1 += "2003"ElseIf (excelver >= 10) Thens1 += "XP"ElseIf (excelver >= 9) Thens1 += "2000"ElseIf (excelver >= 8) Thens1 += "97"ElseIf (excelver >= 7) Thens1 += "95"End IfMsgBox(excelver)Return s1
End Function''' <summary>
''' 合并单元格
''' </summary>
''' <param name="sheet">sheet名</param>
''' <param name="colIndex">要合并的列序号</param>
''' <param name="beginRowsIndex">开始的行序号</param>
''' <param name="endRowsIndex">结束的行序号</param>
''' <returns>开始和结束行序号的-维数组的量表</returns>
''' <remarks></remarks>
Public Function mergerCell(ByVal sheet As ISheet, ByVal colIndex As Integer, ByVal beginRowsIndex As Integer, ByVal endRowsIndex As Integer) As List(Of Integer())Dim preCellValue As String = sheet.GetRow(beginRowsIndex).Cells(colIndex).ToStringDim beginIndex As Integer = beginRowsIndexDim beginEndArray As Integer(,) = NothingDim beginEndList As List(Of Integer()) = New List(Of Integer())For i = beginRowsIndex To endRowsIndexDim currentCellValue As String = sheet.GetRow(i).Cells(colIndex).ToStringIf Not currentCellValue = preCellValue ThenIf i > beginIndex + 1 Thensheet.AddMergedRegion(New NPOI.SS.Util.CellRangeAddress(beginIndex, i - 1, colIndex, colIndex))''***之前用数组实现的现在用List***'Dim len0 As Integer = 0'If beginEndArray Is Nothing Then'    len0 = 0'Else'    len0 = beginEndArray.GetLength(0)'End If'Dim tempArray As Integer(,) = beginEndArray'ReDim beginEndArray(len0, 1)'If Not tempArray Is Nothing Then'    For index = 0 To tempArray.GetLength(0) - 1'        For j = 0 To tempArray.GetLength(1) - 1'            beginEndArray(index, j) = tempArray(index, j)'        Next'    Next'End If'beginEndArray(len0, 0) = beginIndex'beginEndArray(len0, 1) = i - 1beginEndList.Add({beginIndex, i - 1})End IfbeginIndex = ipreCellValue = currentCellValueEnd If''当遍历到表格最后一行时If i = endRowsIndex And i > beginIndex Thensheet.AddMergedRegion(New NPOI.SS.Util.CellRangeAddress(beginIndex, i, colIndex, colIndex))''***之前用数组实现的现在用List***'Dim len0 As Integer = 0'If beginEndArray Is Nothing Then'    len0 = 0'Else'    len0 = beginEndArray.GetLength(0)'End If'Dim tempArray As Integer(,) = beginEndArray'ReDim beginEndArray(len0, 1)'If Not tempArray Is Nothing Then'    For index = 0 To tempArray.GetLength(0) - 1'        For j = 0 To tempArray.GetLength(1) - 1'            beginEndArray(index, j) = tempArray(index, j)'        Next'    Next'End If'beginEndArray(len0, 0) = beginIndex'beginEndArray(len0, 1) = ibeginEndList.Add({beginIndex, i})End IfNextReturn beginEndList
End Function

End Class

vb.net读取写入EXCEl的终极方法-NOPI。相关推荐

  1. vb.net读取写入EXCEl的终极方法-NOPI

    据我浅薄的知识,之前只知道两种操作excel的方法: 一.ODBC操作excel 看下图: 1.ODBC 由于初期连接不同的数据库通过各种不同的API,ODBC就是将各种不同的API封装成统一的接口. ...

  2. C#读取写入excel单元格

    c# 读取写入excel单元格(包括对excel的一些基本操作) 以下是一些对excel的一些基本操作 1:工程对excel类库的导入,如:c:\program files\Microsoft off ...

  3. Python读取Json字典写入Excel表格的方法

    需求: 因需要将一json文件中大量的信息填入一固定格式的Excel表格,单纯的复制粘贴肯定也能完成,但是想偷懒一下,于是借助Python解决问题. 环境: Windows7 +Python2.7 + ...

  4. java excel row遍历空_Java poi读取,写入Excel,处理row和cell可能为空的情况

    首先需要导入包 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.NP ...

  5. Openpyxl:读取/写入Excel文件的Python模块

    Python openpyxl module is a native library to work with excel files. We can read excel files as well ...

  6. R语言批量读取写入Excel数据 r导出输出写入excel多个sheet 导出excel 导入 excel 读入excel 表格

    前一段,写过一篇:R语言中写入Excel的不同sheet表格,最近学习了tidyverse的方法,感觉需要总结一下,更新一下知识结构. 本文准备用实际数据,做一下操作: 「批量读取:」 批量读取多个E ...

  7. python将panadas写入excel_python pandas写入excel文件的方法示例

    pandas读取.写入csv数据非常方便,但是有时希望通过excel画个简单的图表看一下数据质量.变化趋势并保存,这时候csv格式的数据就略显不便,因此尝试直接将数据写入excel文件. pandas ...

  8. MATLAB读取写入文本数据最佳方法 | Best Method for Loading Saving Text Data Using MATLAB

    MATLAB读取文件有很多方法.然而笔者在过去进行数据处理中,由于函数太多,相互混杂,与C#,Python等语言相比,反而认为读取文本数据比较麻烦.C#和Python等高级语言中,对于大部分的文本数据 ...

  9. php怎么从文件中读取数据库连接,PHP连接 读取 写入mysql数据库的方法 附常用代码...

    MYSQL一般都是和PHP配套使用用来建设网站,这里提供PHP连接MySQL数据库以及读取写入数据库的方法,供大家参考使用: 1.为了更好地设置数据连接,一般会将数据连接所涉及的值定义成变量. $my ...

  10. JXL读取,写入Excel

    JXL读取,写入Excel2003 相关阅读: poi 读写excel2003:http://www.cnblogs.com/gavinYang/p/3576739.html poi 读写excel2 ...

最新文章

  1. Oracle连接查询
  2. wps如何自己制作流程图_自己如何制作APP软件
  3. springboot 使用的配置
  4. mysql pydev_pydev-python 链接mysql数据库(mac系统)
  5. python中的数据结构之deque
  6. 卷积神经网络(CNN)介绍与实践
  7. 苹果主题商店_看厌了官方皮肤,快试试微信QQ半透明主题!不仅会动还有声音!...
  8. EasyRecovery15永久免费数据恢复软件
  9. tkmybatis详细教程(一篇就明白)
  10. GAN生成手写字体识别
  11. 一种设想:打造小程序版本公号和自托管的公号,将你的网站/blog做到微信/微信公号里且与PC端合一
  12. 域外计算机无法连接远程桌面,如何开启域内计算机的远程桌面连接?
  13. Pytorch关于高维tensor的dim上操作的理解--以cosine_similarity的dim参数为例
  14. b哩b哩视频弹幕爬虫程序(python)
  15. 云智慧陆兴海:统一运维体系为数字政府建设保驾护航
  16. STC89C52单片机串口通信以及代码演示
  17. C语言计算两纬线间子午线弧长1/2
  18. Python数据分析笔记----第六章pandas文件操作
  19. 开利网络受邀参与广州市候鸟基金会公益节目录制活动
  20. 小白借助视频云平台搭建企业级连锁监控平台

热门文章

  1. 网站地图在线生成html,sitemap_网站地图_站点地图_在线生成_专注在线服务工具开发与同步部署 - sitemap 生成器...
  2. 苹果carplay下载_苹果宣布推出CarPlay
  3. 5%和1%精度的贴片电阻标称阻值表
  4. 希尔伯特变换到底有什么用
  5. 个人博客网站搭建详细视频教程和源码
  6. pta求阶乘序列前n项和_求极限方法总结
  7. Tomcat7升级到Tomcat9
  8. matlab imagesc 保存,在matlab中保存imagesc的精确图像输出
  9. 基于Matlab科技论文绘图:plot、imagesc
  10. vue3 three ts 全景图