GVKun编程网logo

一个简单的C#DLL-如何从Excel,Access,VBA,VB6调用它?(c# dll调用)

17

对于一个简单的C#DLL-如何从Excel,Access,VBA,VB6调用它?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍c#dll调用,并为您提供关于C#读取Excel,Access数据

对于一个简单的C#DLL-如何从Excel,Access,VBA,VB6调用它?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍c# dll调用,并为您提供关于C#读取Excel,Access数据库、C#,VB.NET 如何将Excel转换为Text、Excel VBA,加速一个范围内的 For 循环、Excel2010如何调用VBA?excel调用vba方法的有用信息。

本文目录一览:

一个简单的C#DLL-如何从Excel,Access,VBA,VB6调用它?(c# dll调用)

一个简单的C#DLL-如何从Excel,Access,VBA,VB6调用它?(c# dll调用)

我有一个用C#编写的简单类库。

using System;namespace TestDll{    public class Test    {        public string HelloWorld        {            get            {                return "Hello World";            }        }    }}

我的问题是如何从Microsoft Office Visual Basic(我认为是VB6)中调用此HelloWorld函数?

我的第一步是添加DLL作为参考-但是在浏览和选择编译的DLL时,显示消息“无法向指定文件添加参考”。被扔了。

谁能为我指出正确的方向,说明为什么/如何使其正常工作?

在此先感谢!

答案1

小编典典

您不能通过COM互操作访问静态成员。实际上,您的代码甚至都没有编译,该方法应该在一个类中。这是您可以执行的操作:

[InterfaceType(ComInterfaceType.InterfaceIsDual)][Guid("01A31113-9353-44cc-A1F4-C6F1210E4B30")]  //Allocate your own GUIDpublic interface _Test{    string HelloWorld { get; }}[ClassInterface(ClassInterfaceType.None)][Guid("E2F07CD4-CE73-4102-B35D-119362624C47")]  //Allocate your own GUID[ProgId("TestDll.Test")]public class Test : _Test{    public string HelloWorld { get { return "Hello, World! "; } }}

在项目属性的“构建”选项卡上,选择“注册COM互操作”。这样您可以快速查看结果。要将dll安装在另一台计算机上,您需要使用regasm。

要消耗掉这个:

Dim o : Set o = CreateObject("TestDll.Test")MsgBox o.HelloWorld

您还可以引用dll并使用早期绑定:

Dim o As TestDll.TestSet o = New TestDll.TextMsgBox o.HelloWorld

C#读取Excel,Access数据库

C#读取Excel,Access数据库

使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2007 测试文件:d:/97-2003.xls和d:/2007.xlsx,两个文件的内容是一模一样的。 测试环境:SQL Server 2000 / 2005。 接口类型 语法一览 注册表设置 单一数据类型列的类型解析 混合数据类型列的自然解析 混

使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2007

测试文件:d:/97-2003.xls和d:/2007.xlsx,两个文件的内容是一模一样的。

测试环境:SQL Server 2000 / 2005。


  • 接口类型
  • 语法一览
  • 注册表设置
  • 单一数据类型列的类型解析
  • 混合数据类型列的自然解析
  • 混合数据类型列的强制解析——IMEX=1
  • 如何解决 NULL 值问题
  • SQL Server 2000 中的列顺序问题
  • 如何访问隐藏的 Sheet
  • 如何访问非常规命名的 Sheet
  • 关于Excel导入的HDR=YES; IMEX=1详解
  • C#读取Access数据库

接口类型

有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎)。

Jet 引擎大家都很熟悉,可以访问 Office 97-2003,但不能访问 Office 2007。

ACE 引擎是随 Office 2007 一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问 Office 97-2003。

另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。

Microsoft.ACE.OLEDB.12.0 安装文件:

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=7554f536-8c28-4598-9b72-ef94e038c891

 


语法一览

使用 Jet 引擎或 ACE 引擎访问,在语法上没有什么的区别。

--> Jet 引擎访问 Excel 97-2003
select * from OpenRowSet(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls'', ''select * from [Sheet1$]'')
select * from OpenRowSet(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls'', [Sheet1$])
select * from OpenDataSource(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls'')...[Sheet1$]
select * from OpenDataSource(''Microsoft.Jet.OLEDB.4.0'', ''Data Source=D:/97-2003.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"'')...[Sheet1$]

--> ACE 引擎访问 Excel 97-2003
select * from OpenRowSet(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls'', ''select * from [Sheet1$]'')
select * from OpenRowSet(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls'', [Sheet1$])
select * from OpenDataSource(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls'')...[Sheet1$]
select * from OpenDataSource(''Microsoft.ACE.OLEDB.12.0'', ''Data Source=D:/97-2003.xls;Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"'')...[Sheet1$]

--> ACE 引擎访问 Excel 2007
select * from OpenRowSet(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;HDR=Yes;IMEX=1;Database=D:/2007.xlsx'', ''select * from [Sheet1$]'')
select * from OpenRowSet(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;HDR=Yes;IMEX=1;Database=D:/2007.xlsx'', [Sheet1$])
select * from OpenDataSource(''Microsoft.ACE.OLEDB.12.0'', ''Excel 12.0;HDR=Yes;IMEX=1;Database=D:/2007.xlsx'')...[Sheet1$]
select * from OpenDataSource(''Microsoft.ACE.OLEDB.12.0'', ''Data Source=D:/2007.xlsx;Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"'')...[Sheet1$]
登录后复制

Excel 2007 工作簿文件的扩展名是:xlsx

HDR=Yes/No

可选参数,指定 Excel 表的第一行是否列名,缺省为 Yes,可以在注册表中修改缺省的行为。

IMEX=1

可选参数,将 Excel 表中混合 Intermixed 数据类型的列强制解析为文本。


注册表设置

Microsoft.Jet.OLEDB.4.0

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel

Microsoft.ACE.OLEDB.12.0

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/12.0/Access Connectivity Engine/Engines/Excel

FirstRowHasNames

设置 HDR 参数的缺省行为,默认为 Yes。

ImportMixedTypes

设置混合列的强制解析类型,默认为文本 Text。

TypeGuessRows

设置用于解析数据类型的取样行数,默认取样前 8 行。如果设置为 0,将分析所有数据行,但不建议这样做,会影响引擎的性能。

注意:Excel 表数据列是单一列数据类型还是混合列数据类型列,是由取样行决定,而不是整列数据决定。


单一数据类型列的类型解析

Sheet1 的内容如下图所示,涵盖了大部分 Excel 的数据类型,其中 longtext 分别有 256 个 A 和 B。

 

C#读取Excel,Access数据库

C#,VB.NET 如何将Excel转换为Text

C#,VB.NET 如何将Excel转换为Text

 

在工作中,有时我们需要转换文档的格式,之前已经跟大家介绍过了如何将Excel转换为PDF。今天将与大家分享如何将Excel转换为Text。这次我使用的依然是免费版的Spire.XLS for .NET组件。

Free Spire.XLS for .NET组件可以使开发人员在任何.NET应用程序上创建、管理和操作Excel文档。即使不安装Microsoft Office,它也能将Excel转换为PDF,HTML,Image,CSV以及XML等。如需下载,请访问:https://www.e-iceblue.com/Download/download-excel-for-net-free.html

 

详细步骤:

步骤1:新建一个工作簿

Workbook workbook = new Workbook();

步骤2:加载需要转换的Excel文档

workbook.LoadFromFile(@"C:\Users\Administrator\Desktop\国家分布.xlsx");

步骤3:获取第一个工作表

Worksheet sheet = workbook.Worksheets[0];

步骤4:将第一个工作表保存为.txt文档格式

sheet.SavetoFile("ExceltoTxt.txt"," 以下是转换前和转换后的对比图:

                                                                          转换前

                                                                    转换后

          

 

C#完整代码:

using Spire.Xls;
 System;
 System.Collections.Generic;
 System.Linq;
 System.Text;

namespace excel_to_text
{
    class Program
    {
        static void Main(string[] args)
        {
            Workbook workbook = new Workbook();
            workbook.LoadFromFile(");
            Worksheet sheet = workbook.Worksheets[0];
            sheet.SavetoFile(,Encoding.UTF8);

        }
    }
}

 

VB.NET完整代码:

Imports Spire.Xls
 System.Collections.Generic
 System.Linq
 System.Text

Namespace excel_to_text
    Class Program
        Private Shared Sub Main(args As String())
            Dim workbook New Workbook()
            workbook.LoadFromFile()
            Dim sheet As Worksheet = workbook.Worksheets()
            sheet.SavetoFile(End Sub
    End Class
End Namespace


感谢您的浏览。

总结

以上是小编为你收集整理的C#,VB.NET 如何将Excel转换为Text全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Excel VBA,加速一个范围内的 For 循环

Excel VBA,加速一个范围内的 For 循环

如何解决Excel VBA,加速一个范围内的 For 循环?

我有一个单页 Excel 文件,其中包含 105 列和 6,000 多行(并且还在不断增加)。

每一列代表一个资源,每一行代表一个时间戳。

每个单元格包含一个 1(资源已满)或一个 0(资源空)

我需要计算一列从 1 变为 0 或从 0 变为 1 的次数。

我目前使用两个循环来允许我按列循环遍历一个范围。

cLAST = Range("XFD2").End(xlToLeft).Column
rLAST = Range("B65536").End(xlUp).Row
Application.ScreenUpdating = False
Application.Calculation = xlManual
    Set rng = Range("B5",Cells(rLAST,cLAST))
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
TimerStart = Timer
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
    For lLoop = 1 To rng.Columns.Count
        TimerStart = Timer
        For Each i In rng.Columns(lLoop).Cells
            If Cells(3,i.Column).Value = 0 Then
                GoTo MidLoop
            End If
            If Len(i.Offset(1,0).Value) > 0 Then
                If i.Value <> i.Offset(1,0).Value Then
                    i.Value = "Pass"
                End If
            End If
MidLoop:
            If i.Row Mod 1000 = 0 Then
                Debug.Print i.Row,rLAST,i.Column,cLAST
            End If
    Next i
    TimerStop = Timer
    Debug.Print TimerStop - TimerStart
Next lLoop
objXL.Application.Calculation = xlAutomatic
objXL.Application.ScreenUpdating = True

每列的循环大约需要 60 秒或整个过程大约 1 小时 45 分钟。

任何有关加快速度的想法将不胜感激。

谢谢, 凯文

解决方法

这是基于您发布的代码(但忽略检查每列的第 3 行值,因为我不太清楚要做什么):

Sub Tester()

    Dim lastCol As Long,lastRow As Long,numRows As Long,nxt
    Dim ws As Worksheet,data,colNum As Long,rowNum As Long
    Dim t,Rng As Range

    t = Timer
    
    Set ws = ActiveSheet ''or whatever
    lastCol = ws.Cells(2,ws.Columns.Count).End(xlToLeft).Column
    lastRow = ws.Cells(ws.Rows.Count,"B").End(xlUp).Row
    Set Rng = ws.Range("B5",ws.Cells(lastRow,lastCol))
    numRows = Rng.Rows.Count
    
    data = Rng.Value ''read the whole range
    
    For colNum = 1 To Rng.Columns.Count
        For rowNum = 1 To numRows - 1
            nxt = data(rowNum + 1,colNum)
            If Len(nxt) > 0 Then
                If nxt <> data(rowNum,colNum) Then
                    data(rowNum,colNum) = "Pass"
                End If
            End If
        Next rowNum
    Next colNum
    
    Rng.Value = data ''return the data
    
    Debug.Print "Done in " & (Timer - t) & " secs"
    
End Sub

这在大约一秒钟内处理了大约 6k 行 x 100 列。

Excel2010如何调用VBA?excel调用vba方法

Excel2010如何调用VBA?excel调用vba方法

打开Excel 2010,默认状态下,你是找不到VBA的,因为这个东西太不常用了,于是,Excel 2010也把它隐藏了,从07版开始,这个功能就被隐藏了,但隐藏方法还不太一样。

步骤

1、默认情况下,打开Excel 2010的菜单栏是这样的。

2、找到VBA之前,你需要把“ 开发工具 ”菜单调出来,选择“ 文件 ”,找到“ 选项 ”。

3、在Excel选项对话框,切换到“ 自定义功能区 ”。

4、勾选“ 开发工具 ”,然后点下面的确定。

5、好了,如图,VBA在这里了。

以上就是excel调用vba方法介绍,操作很简单的,大家按照上面步骤进行操作即可,希望能对大家有所帮助!

关于一个简单的C#DLL-如何从Excel,Access,VBA,VB6调用它?c# dll调用的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于C#读取Excel,Access数据库、C#,VB.NET 如何将Excel转换为Text、Excel VBA,加速一个范围内的 For 循环、Excel2010如何调用VBA?excel调用vba方法等相关内容,可以在本站寻找。

本文标签: