15757753770 发表于 2016-12-11 14:57:16

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++用























f1405602 发表于 2017-3-6 19:21:55

梅大师,就是叼!
页: [1]
查看完整版本: C# 或 c++ 不用安装操作 EXCEL的方法