您当前的位置:首页 > 互联网教程

excel中的编程和c语言编程是不是一样有何区别

发布时间:2025-05-12 06:32:56    发布人:远客网络

excel中的编程和c语言编程是不是一样有何区别

一、excel中的编程和c语言编程是不是一样有何区别

新术语:“宏”,指一系列EXCEL能够执行的VBA语句。

以下将要录制的宏非常简单,只是改变单元格颜色。请完成如下步骤:

1)打开新工作簿,确认其他工作簿已经关闭。

2)选择A1单元格。调出“常用”工具栏。

3)选择“工具”—“宏”—“录制新宏”。

4)输入“改变颜色”作为宏名替换默认宏名,单击确定,注意,此时状态栏中显示“录制”,特别是“停止录制”工具栏也显示出来。替换默认宏名主要是便于分别这些宏。

★宏名最多可为255个字符,并且必须以字母开始。其中可用的字符包括:字母、数字和下划线。宏名中不允许出现空格。通常用下划线代表空格。

5)选择“格式”的“单元格”,选择“图案”选项中的红色,单击“确定”。

6)单击“停止录制”工具栏按钮,结束宏录制过程。

※如果“停止录制”工具栏开始并未出现,请选择“工具”—“宏”—“停止录制”。

录制完一个宏后就可以执行它了。

当执行一个宏时,EXCEL按照宏语句执行的情况就像VBA代码在对EXCEL进行“遥控”。但VBA的“遥控”不仅能使操作变得简便,还能使你获得一些使用EXCEL标准命令所无法实现的功能。而且,一旦熟悉了EXCEL的“遥控”,你都会奇怪自己在没有这些“遥控”的情况下,到底是怎么熬过来的。要执行刚才录制的宏,可以按以下步骤进行:

1)选择任何一个单元格,比如A3。

2)选择“工具”—“宏”—“宏”,显示“宏”对话框。

3)选择“改变颜色”,选择“执行”,则A3单元格的颜色变为红色。试着选择其它单元格和几个单元格组成的区域,然后再执行宏,以便加深印象。

到底是什么在控制EXCEL的运行呢?你可能有些疑惑.好,让我们看看VBA的语句吧.

1)选择“工具”—“宏”—“宏”,显示“宏”对话框。

2)单击列表中的“改变颜色”,选择“编辑”按钮。

此时,会打开VBA的编辑器窗口(VBE)。关于该编辑器,以后再详细说明,先将注意力集中到显示的代码上。代码如下:(日期和姓名会有不同)

.PatternColorIndex= xlAutomatic

将来会十分熟悉这种代码,虽然现在它们看上去像一种奇怪的外语。学习VBA或编程语言在某种程度上比较像在学习一种外语。

中间的以“'”开头的五行称为“注释”,它在录制宏时自动产生。

以With开头到End With结束的结构是With结构语句,这段语句是宏的主要部分。注意单词“selection”,它代表“突出显示的区域”(即:选定区域)。With Selection.Interior:它读作“选择区域的的内部”.这整段语句设置该区域内部的一些“属性”

优点(1)继承了C语言的全部优点。(2)完全的可视化。(3)极强的兼容性,支持OWL、VCL和MFC三大类库。(4)编译速度非常快。缺点由于推出的时间太短,关于它的各种资料还不太多。综述:我认为C++ Builder是最好的编程工具。它既保持了C语言编程的优点,又做到了完全的可视化。

二、如何将C语言的输出倒入Excel工作表

可以先用C语言格式化输出为EXCEL可以导入的文本文件,再使用EXCEL手工导入。具体导入方法可参阅《往Excel中导入TXT文本数据的三种方法》:

这种方法最简单,但自动化程度低,不能集成到你的C程序中去.

如果用C/C++创建EXCEL,可以使用ADO或者ODBC.

如果用C++/ODBC,可参阅《直接通过ODBC读写Excel表格文件》:

还有《针对Excel表格文件操作的编程实现》:

如果你的程序是用C++写的,推荐使用以上方法.

如果用C/ODBC,稍微麻烦一点。我以前写过一个,好像是根据一个C++的类改写成C的,时间太长,记不得出处了.现在给你做参考:

OpenExcel():创建或打开Excel文件的一个工作表

AppendExcel():向工作表中加入数据记录

main()中示例的是建立test.xls文件,其中两个工作表.我这里源程序用VC6.0编译,得到的结果在Excel 2003中可以使用.

#pragma comment(lib,"odbc32.lib")

enum errtype{ ERRORFREE, ERRACTION, XLSBUSY, TXTBUSY, TXTOPENERROR,

SQLHANDLEENVERROR, SQLSETENVERROR, SQLHANDLEDBCERROR,

SQLCONNECTERROR, SQLALLOCSTMTERROR, SQLCREATEERROR,

SQLSELECTERROR, SQLBINDERROR};

//------------------------------------------------------------------------------------------------------------

static void dbError( LPSTR lp, SQLSMALLINT handleType, SQLHANDLE handle)

SQLGetDiagRec( handleType,handle, 1, sqlstate, NULL,buf, sizeof(buf),NULL);

fprintf(stderr,"%s:%s SQLSTATE=%s\n",lp, buf, sqlstate);

//------------------------------------------------------------------------------------------------------------

SQLFreeStmt(hstmt, SQL_UNBIND);

SQLFreeHandle(SQL_HANDLE_STMT,hstmt);

SQLFreeHandle(SQL_HANDLE_DBC,hdbc);

if(henv!= SQL_NULL_HANDLE) SQLFreeHandle(SQL_HANDLE_ENV,henv);

//------------------------------------------------------------------------------------------------------------

static void dbErrorCleanup( LPSTR lp,SQLSMALLINT handleType, SQLHENV henv,SQLHDBC hdbc,SQLHSTMT hstmt)

if(handle!= SQL_NULL_HANDLE) dbError( lp, handleType, handle);

dbCleanup(henv, hdbc, hstmt);

//---------------------------------------------------------

static BOOL isFileOpen(const BYTE*fileName)

//以非共享方式打开文件.检查EXCEL文件当前是否在使用中...........

hFile= CreateFile(fileName,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);

if(hFile== INVALID_HANDLE_VALUE){

if(GetLastError()== ERROR_SHARING_VIOLATION) return TRUE;//使用中

else return FALSE;//未使用中,或者无此文件(现在可以创建)

int OpenExcel(BYTE*szExcelName, BYTE*szSheetName, BYTE*szFieldName[], BYTE*szFieldType[], int nColCount)

BYTE szSql[512],*pszSql=szSql;

henv= hdbc= hstmt= SQL_NULL_HANDLE;

if( isFileOpen(szExcelName)) return XLSBUSY;

retcode= SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&henv);

dbErrorCleanup("SQLAllocHandle(ENV)",SQL_HANDLE_ENV,henv,hdbc,hstmt);

retcode= SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,0);

dbErrorCleanup("SQLSetEnvAttr()",SQL_HANDLE_ENV,henv,hdbc,hstmt);

retcode= SQLAllocHandle(SQL_HANDLE_DBC, henv,&hdbc);

dbErrorCleanup("SQLAllocHandle(DBC)",SQL_HANDLE_ENV,henv,hdbc,hstmt);

//与数据库建立连接------------------

sprintf(szdatabase,"DRIVER=Microsoft Excel Driver(*.xls);CREATE_DB=%s;DBQ=%s;READONLY=FALSE;EXCLUSIVE=Yes;",

//fprintf(stderr,"DATABASE:%s\n", szdatabase);

retcode= SQLDriverConnect(hdbc, NULL,(SQLCHAR*)szdatabase,(short)(strlen(szdatabase)+1), NULL, 0, NULL, SQL_DRIVER_NOPROMPT);

if(retcode!= SQL_SUCCESS&& retcode!= SQL_SUCCESS_WITH_INFO){

dbErrorCleanup("SQLDriverConnect()",SQL_HANDLE_DBC,henv,hdbc,hstmt);

retcode= SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);

dbErrorCleanup("SQLAllocHandle(STMT)",SQL_HANDLE_DBC,henv,hdbc,hstmt);

//构造执行 CREATE TABLE语句----------------------

pszSql= szSql+ sprintf(szSql,"CREATE TABLE%s(", szSheetName);

for(i=0; i<nColCount;++i){

pszSql+= sprintf(pszSql,"%s%s", szFieldName[i], szFieldType[i]);

//fprintf(stderr,"STATEMENT: [%s]\n", szSql);

retcode= SQLExecDirect(hstmt, szSql, SQL_NTS);

SQLGetDiagField( SQL_HANDLE_STMT, hstmt,1,SQL_DIAG_SQLSTATE,sqlState,sizeof(sqlState),NULL);

if( lstrcmpiA(sqlState,"42S01")!= 0){// Already existing...

dbErrorCleanup(" SQLExecDirect()",SQL_HANDLE_STMT,henv,hdbc,hstmt);

int AppendExcel(BYTE*szSheetName, BYTE*szFieldName[], int nColCount, BYTE*szData)

BYTE szSql[512],*s,*p,*d,*psz;

//构造 INSERT INTO语句--------------------------------

psz= szSql+ sprintf(szSql,"INSERT INTO%s(", szSheetName);

for(i=0; i<nColCount;++i){

psz+= sprintf(psz,"%s", szFieldName[i]);

psz+= sprintf(psz,") VALUES(%s)", szData);

//fprintf(stderr,"STATEMENT:%s\n", szSql);

rc=(int) SQLExecDirect(hstmt, szSql, SQL_NTS);

dbError(" SQLExecDirect()",SQL_HANDLE_STMT,hstmt);

//fprintf(stderr,"CleanUp: henv=%08X; hdbc=%08X, hstmt=%08X.\n", henv, hdbc, hstmt);

//------------------ Test data---------------------------------------

static BYTE szExcelName[]="Test.xls";// Excel文件名

static BYTE szSheetNameA[]="名单";//工作表名

static BYTE*szFieldNameA[]={"姓名","年龄"};//字段名

static BYTE*szFieldTypeA[]={"TEXT","NUMBER"};//字段类型

static BYTE szSheetNameB[]="日程";//工作表名

static BYTE*szFieldNameB[]={"日期","时间","安排"};//字段名

static BYTE*szFieldTypeB[]={"TEXT","TEXT","TEXT"};//字段类型

if(OpenExcel(szExcelName, szSheetNameA, szFieldNameA, szFieldTypeA, 2)==0)

AppendExcel(szSheetNameA, szFieldNameA, 2,"'张三',33");

AppendExcel(szSheetNameA, szFieldNameA, 2,"'李四',44");

printf("Excel文件[%s]中的工作表[%s]操作成功.\n", szExcelName, szSheetNameA);

if(OpenExcel(szExcelName, szSheetNameB, szFieldNameB, szFieldTypeB, 3)==0)

AppendExcel(szSheetNameB, szFieldNameB, 3,"'五月三日','18:00','饭局'");

printf("Excel文件[%s]中的工作表[%s]操作成功.\n", szExcelName, szSheetNameB);

---------------------------------------

BYTE*szExcelName,//Excel文件名

BYTE*szFieldName[],//字段名(数组)

BYTE*szFieldType[],//字段类型(数组)

BYTE*szFieldName[],//字段名(数组)

如使用图形界面,可把#include<stdio.h>去掉, printf/fprintf改为用 MessageBox提供必要的输出信息或干脆删掉。

三、c语言怎么调用excel的数据

1、要使用C语言进行Excel文件的读取,要用到专门的函数,并使用指针做内存位移操作;

2、在执行读取Excel文件的操作时,需要使用函数有:

fopen:此函数用来打开指定的文件,返回文件指针

fseek:这个函数主要用来进行文件随机定位,通过定位,读取指定位置的数据

fscanf:用来从指定位置获取数据

3、fseek函数的一般调用格式如下:fseek(文件指针,位移量,起始位置);

其中参数位移量,是指重新定位时的字节偏移数,表示相对于基址的字符数,通常是一个长整型数,可以是整形常量,整形表达式等。

4、对于fseek函数的起始位置参数,是指重新定位时的基准点,也就是基址,用整数或符合常量表示,包括:

0:符号常量为SEEK_SET,表示文件开头

1:符号常量为SEEK_CUR,表示文件指针的当前位置

2:符号常量为SEEK_END,表示文件末尾

函数使用如下例: fseek(fp, 10L, 0);