C# 或 c++ 不用安装操作 EXCEL的方法
C# 或 c++不用安装操作 EXCEL的方法:c++ 对excel 的操作 非常不理想 要安装excel 而且读写速度也慢net 有很多 免费的开源库 比如 Npoi库(Npoi库 支持c#、vb.net 等语言)
这里我用c# 生成 com 组件 让 c++ 调
首先要学会 c++ 调 c# com组件的方法 (和com注册的方法)
C++调用C#的COM组件(DLL)
下面我举个简单的小例子.我用的是Microsoft Visual Studio 2012,操作系统是Win 7.
首先创建一个C# com组件.实现的功能很简单,就是返回两数相加的和.
1.新建一个C#项目 ,类型就选 类库 .取名 MEI_AddCom
2.在项目中添加一个接口,取名MEI_COM.C++调用com组件中所有的功能只能通过接口来调用,不能直接调用类或函数
具体代码:
using System.Runtime.InteropServices; //记得加这个命名空间
namespace MEI_AddCom
{
// guid的产生可以通过vs自带的工具.点菜单栏上的Tools ->Create GUID,然后选第4个选项.Registry Format.
//点按钮New GUID,再点Copy.这样你就可以把产生的guid复制下来,然后粘贴到这个地方来.当然那个大括号得去掉.后面需要用到guid的地方也用这方式产生
public interface MEI_COM //记得用修饰符public
{
//如果还要添加其他函数就继续来个,加在函数前面
int Plus(int one, int two);
}
}
3.添加一个类MEI_COM_T,继承接口MEI_COM,具体代码
using System.Runtime.InteropServices;
namespace MEI_AddCom
{
public class MEI_COM_T : MEI_COM
{
public int Plus(int a, int b)
{
return a + b ;
}
}
}
4.把AssemblyInfo.cs中的改成.
右击项目名打开属性窗口,在生成里,选中 为COM 互操作注册
5. 生成->生成解决方案
注意 这个时候 生成 非常缓慢
直到 出现 成功 1 个,失败 0 个,为止才 操作一下面内容
---------------------------
1.调用前要先把com组件注册才行.
使用C#创建并注册COM组件C#不能直接创建COM组件,因为其生成的DLL属于程序集,但可通过“使程序集COM可见”选项来支持COM。
以下说明如何通过C# 注册、注销COM组件。
为了能让生成的DLL能够进行COM注册,需要进行强名称签名
打开COMLib项目属性,选择签名,勾选为程序集签名,通过下拉列表选择新建,弹出创建强名称密钥窗口,输入名称,不勾选使用密码保护密钥文件。
创建完成后COMLib项目中将出现后缀为.snk的签名文件。
最后,编译COMLib项目,生成COMLib.dll文件,完成COM组件的制作。注册COM组件:如将COMLib.dll放置D盘根目录下,以管理员身份运行CMD,提示符切换至C:\Windows\Microsoft.NET\Framework\v2.0.50727,输入“RegAsmD:\ COMLib.dll/tlb: COMLib.tlb/codebase”,回车后得到如下图所示结果,表明注册成功。同时D盘根目录还会生成COMLib.tlb文件。
卸载COM组件:
与注册过程基本相同,只需将命令改为“RegAsm/uD:\ COMLib.dll/tlb: COMLib.tlb/codebase”。
2.注册完了就可以在代码中用了,先新建一个C++程序, 类型选 Win32 Console控制台应用程序
名字取MEI_UseCsharpCom,点完成
把MEI_AddCom.tlb文件拷贝到项目的任何目录下.我就放在D:\MEI_UseCsharpCom\MEI_UseCsharpCom.
我们会看到一个MEI_UseCsharpCom.cpp文件,双击打开把默认生成的代码全部删掉.敲入下面代码:
#include "stdafx.h"
#include <windows.h>
#include <string.h>
#import "MEI_AddCom.tlb" named_guids raw_interfaces_only
char* WcharToChar(const wchar_t* wp)//wchar_t转char*
{
char *m_char;
int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL);
m_char=new char;
WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL);
m_char='\0';
return m_char;
}
wchar_t* CharToWchar(const char* c) //char*转wchar_t
{
wchar_t *m_wchar;
int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);
m_wchar=new wchar_t;
MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);
m_wchar='\0';
return m_wchar;
}
void _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
MEI_AddCom::MEI_COMPtr ptr; //类似明志一个指向接口的指针
ptr.CreateInstance(MEI_AddCom::CLSID_MEI_COM_T); //实例化一个类 CLSID_ 类名
//这个地方有一点点奇怪我也还没弄懂.在C#中的函数是int Plus(int,int).但类型在这里都转成long了.另外就是我们不能直接
//来个long a = ptr->Plus(1,2);这样得不到a = 3,反正会出错.
//这里函数Plus的参数变成三个了long Plus(long,long,long *).其中最后一个指针得两数相加的结果
long a = 1;
long * lPtr = &a;
ptr->Plus(1,2,lPtr);
char msg="";
sprintf(msg, "%d",lPtr);
LPCWSTR str=CharToWchar(msg);
MessageBox(NULL,str,_T("123"),MB_ICONWARNING);
}
此时就可以正确运行了.得到结果3
如果没有正常运行,则必须把dll文件拷贝到有MEI_UseCsharpCom.exe这个文件的目录下.
--------------------------------------------------------------
C# Npoi库 操作excel 的代码网上很多
// ----------------------------------------------------------------------
// 使用Npoi创建一个简单的xls文件,写内容
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
using System.IO;
using System.Data;
//using System.Windows.Forms;
namespace CC
{
class Program
{
static void Main(string[] args)
{
//创建工作薄
HSSFWorkbook wk = new HSSFWorkbook();
//创建一个名称为mySheet的表
ISheet tb = wk.CreateSheet("mySheet");
//创建一行,此行为第二行
IRow row = tb.CreateRow(1);
for (int i = 0; i < 20; i++)
{
ICell cell = row.CreateCell(i);//在第二行中创建单元格
cell.SetCellValue(i);//循环往第二行的单元格中添加数据
}
using (FileStream fs = File.OpenWrite(@"c:/myxls.xls")) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件!
{
wk.Write(fs); //向打开的这个xls文件中写入mySheet表并保存。
// MessageBox.Show("提示:创建成功!");
}
}
}
}
// ----------------------------------------------------------------------
// 使用Npoi读一个简单的xls文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
using System.IO;
using System.Data;
namespace CC
{
class Program
{
static void Main(string[] args)
{
StringBuilder sbr = new StringBuilder();
using (FileStream fs = File.OpenRead(@"c:/myxls.xls")) //打开myxls.xls文件
{
HSSFWorkbook wk = new HSSFWorkbook(fs); //把xls文件中的数据写入wk中
for (int i = 0; i < wk.NumberOfSheets; i++)//NumberOfSheets是myxls.xls中总共的表数
{
ISheet sheet = wk.GetSheetAt(i); //读取当前表数据
for (int j = 0; j <= sheet.LastRowNum; j++)//LastRowNum 是当前表的总行数
{
IRow row = sheet.GetRow(j);//读取当前行数据
if (row != null)
{
sbr.Append("-------------------------------------\r\n"); //读取行与行之间的提示界限
for (int k = 0; k <= row.LastCellNum; k++)//LastCellNum 是当前行的总列数
{
ICell cell = row.GetCell(k);//当前表格
if (cell != null)
{
sbr.Append(cell.ToString()); //获取表格中的数据并转换为字符串类型
}
}
}
}
}
}
sbr.ToString();
using (StreamWriter wr = new StreamWriter(new FileStream(@"c:/myText.txt", FileMode.Append)))//把读取xls文件的数据写入myText.txt文件中
{
wr.Write(sbr.ToString());
wr.Flush();
}
}
}
}
然后 自己封装 给 c++用
梅大师,就是叼!
页:
[1]