excel中的编程和c语言编程是不是一样有何区别
发布时间:2025-05-12 06:32:56 发布人:远客网络
一、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);