上一期的例子中使用NI官方的库Excelreport库操作Excel文件,这种方法简单易用,但存在一些不足。那就是不能脱离office环境,运行速度慢。今天实例使用第三方库libxl来操作Excel文件,该库具有原生支持c语言,速度快,不依赖office环境,同时支持跨平台,支持CVS和XLSX格式。
LibXL库使用详解
LibXL可以不依赖EXCEL读取XLS和XLSX文件。包括设置对齐方式、字体、颜色等格式。支持C, C++, C#,Python等语言。并且支持多个平台windows、Linux、Mac等。下面仅介绍windows平台CVI开发环境下,C语言的使用。
image.png
LibXL主要文件介绍
上图是完整libxl库的文件结构,主要有以下几方面的东东:
- bin 32位 动态链接库(需要将其放在可执行文件的目录)
- bin64 64位 动态链接库
- doc 函数说明的文档
- examples 一些使用的例子,用C,C++,C#,python等语言的
- include_c C的头文件
- include_cpp C++的头文件
- lib 32位微软Visual C++的库
- lib64 64位微软Visual C++的库
- net .NET使用的
- stdcall 使用stdcall调用约定的32位动态库
使用libxl创建Excel文件
该实例基本是引用官方例子,把它移植到Cvi环境下,进行编译运行,掌握是libxl的基本方法。
- 记得引用libxl.h文件
-
把c语言需要的头文件、lib文件、dll文件放到项目目录下
image.png
设计项目界面如下:
image.png
软件运行效果如下:
image.png
该项目相对简单,加上函数方法太多,不在一一列述,大家可以查看库目录下文档查询自己想要的函数方法。网上关于libxl使用c语言操作的例子并不多,大部分是c++的。差别就是后者是面向对象的。全部代码如下:
#include <utility.h>
#include <ansi_c.h>
#include <cvirte.h>
#include <userint.h>
#include "libxl.h"
#include "libxlDemo01.h"
static int panelHandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "libxlDemo01.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK panelCB (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK btnExit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK btnNewXLS (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
//声明Excel文件句柄并创建
BookHandle book = xlCreateBook();
//对控件进行授权注册
xlBookSetKey(book,"TommoT", "windows-2421220b07c2e10a6eb96768a2p7r6gc");
if(book)//如果book不为空
{
//声明sheet句柄并创建sheet1
SheetHandle sheet = xlBookAddSheet(book,"Sheet1",0);
if(sheet)//如果sheet不为空
{
//b3单元格输入"hello,world!";
xlSheetWriteStr(sheet,2,1,"Hello,World!",NULL);
//b4单元格输入整数1000;
xlSheetWriteNum(sheet,3,1,1000,NULL);
//b5单元格输入实数3.1415;
xlSheetWriteNum(sheet,4,1,3.1415,NULL);
//b6单元格设为true;
xlSheetWriteBool(sheet,5,1,1,NULL);
//b7单元格设为false;
xlSheetWriteBool(sheet,6,1,0,NULL);
//b8单元格增加注释"how are you?" ;
xlSheetWriteComment(sheet,7,1,"how are you?","kitty",100,50);
//b9单元格设置错误格式;
xlSheetWriteError(sheet,8,1,"you have a Err!",NULL);
//b10单元格设置公式为b4+b5 ;
xlSheetWriteFormula(sheet,9,1,"=B4+B5",NULL);
}
char filename[MAX_PATHNAME_LEN]={0};
GetProjectDir(filename);
strcat(filename,"\\example.xls");
//保存Excel文件;
xlBookSave(book, filename);
//释放存储空间;
xlBookRelease(book);
}
break;
}
return 0;
}
网友评论