可以先用C语言格式化输出为EXCEL可以导入的文本文件,再使用EXCEL手工导入。具体导入方法可参阅《往Excel中导入TXT文本数据的三种方法》:http://tech.sina.com.cn/s/2006-05-12/1042934532.shtml

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

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

如果用C++/ODBC, 可参阅《直接通过ODBC读写Excel表格文件》:http://www.vckbase.com/document/viewdoc/?id=421

还有《针对Excel表格文件操作的编程实现》:http://www.vckbase.com/document/viewdoc/?id=693

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

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

三个接口函数:

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

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

CloseExcel(): 结束处理

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

#include

#include

#include

#ifdef _MSC_VER

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

#define SQLLEN SQLINTEGER

#endif

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

SQLHANDLEENVERROR, SQLSETENVERROR, SQLHANDLEDBCERROR,

SQLCONNECTERROR, SQLALLOCSTMTERROR, SQLCREATEERROR,

SQLSELECTERROR, SQLBINDERROR } ;

SQLHENV henv;

SQLHDBC hdbc;

SQLHSTMT hstmt;

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

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

{

BYTE buf[250], sqlstate[15];

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

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

}

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

static void dbCleanup()

{

if (hstmt != SQL_NULL_HANDLE) {

SQLFreeStmt(hstmt, SQL_UNBIND);

SQLFreeHandle(SQL_HANDLE_STMT,hstmt);

}

if (hdbc != SQL_NULL_HANDLE) {

SQLDisconnect(hdbc);

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)

{

SQLHANDLE handle;

switch (handleType) {

case SQL_HANDLE_STMT:

handle = hstmt;

break;

case SQL_HANDLE_DBC:

handle = hdbc;

break;

default:

handle = henv;

}

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

dbCleanup(henv, hdbc, hstmt );

}

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

static BOOL isFileOpen(const BYTE *fileName)

{

HANDLE hFile;

// 以非共享方式打开文件. 检查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; // 未使用中,或者无此文件(现在可以创建)

} else {

CloseHandle(hFile);

return FALSE;

}

}

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

{

SQLRETURN retcode;

BYTE szSql[512], *pszSql=szSql;

BYTE szdatabase[256];

int rc, i;

henv = hdbc = hstmt = SQL_NULL_HANDLE;

if ( isFileOpen(szExcelName) ) return XLSBUSY;

// 准备环境 -------------------

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

if (retcode != SQL_SUCCESS) {

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

return SQLHANDLEENVERROR;

}

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

if (retcode != SQL_SUCCESS) {

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

return SQLSETENVERROR;

}

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

if (retcode != SQL_SUCCESS) {

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

return SQLHANDLEDBCERROR;

}

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

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

szExcelName, szExcelName);

//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);

return SQLCONNECTERROR;

}

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

if (retcode != SQL_SUCCESS) {

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

return SQLALLOCSTMTERROR;

}

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

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

for (i=0; i

if (i) *pszSql++ = ',';

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

}

*pszSql++ = ')';

*pszSql = '\0';

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

retcode = SQLExecDirect(hstmt, szSql, SQL_NTS);

if (retcode != SQL_SUCCESS) {

SQLCHAR sqlState[15];

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);

return SQLCREATEERROR;

}

}

return 0;

}

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

{

int i, rc;

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

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

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

for (i=0; i

if (i) *psz++ = ',';

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);

if (rc != SQL_SUCCESS) {

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

}

return rc;

}

void CloseExcel()

{

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

dbCleanup();

}

//------------------ 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" }; // 字段类型

int main()

{

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);

CloseExcel();

}

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

{

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

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

CloseExcel();

}

printf(" ----- 完了.");

return 0;

}

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

有关函数的调用参数:

int OpenExcel( //成功:返回0

BYTE *szExcelName, //Excel文件名

BYTE *szSheetName, //工作表名

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

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

int nColCount) //字段数

int AppendExcel( //成功:返回0

BYTE *szSheetName, //工作表名

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

int nColCount, //字段数

BYTE *szData) //数据字串

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

取消

评论

c语言程序导出到excel里,怎么将C语言的输出倒入Excel工作表相关推荐

  1. 可运行的C语言程序的拓展名,可运行的c语言程序的扩展名为什么?

    可运行的c语言程序的扩展名为".exe".c语言程序经过"编译程序"编译之后,生成一个后缀为".obj"的二进制文件:然后由"连接 ...

  2. 【tkGo】将Excel里的图片链接替换为图片(Excel嵌入图片)

    1 背景 因为某些原因,我们的Excel里会放入一些图片链接,但查看的时候需要一个个点开,通过浏览器显示,非常麻烦. 我们可以通过python的openpyxl这个库来解决此问题,一键替换所有链接为图 ...

  3. php datatable导出excel,C#_C#实现将DataTable内容输出到Excel表格的方法,本文实例讲述了C#实现将DataTabl - phpStudy...

    C#实现将DataTable内容输出到Excel表格的方法 本文实例讲述了C#实现将DataTable内容输出到Excel表格的方法.分享给大家供大家参考.具体如下: 1.关于本文 本文描述了一个函数 ...

  4. 200个c语言程序(由简单到复杂),200个c语言程序(由简单到复杂)

    200个C语言程序(由简单到复杂)从简单到难的200来个经典C程序csdn上的不过那里要资源分,自己下了下来,放到论坛里.有需要的童鞋可以下载学习学习.第一部分 基础篇 001 第一个C程序 002 ...

  5. c语言程序设教材计 乌云高娃,C语言程序设计教学课件作者第3版乌云高娃演示文稿C语言程序设计教学课件作者第3版乌云高娃演示文稿演示文稿第1章C语言程序设计基础课件.ppt...

    C语言程序设计教学课件作者第3版乌云高娃演示文稿C语言程序设计教学课件作者第3版乌云高娃演示文稿演示文稿第1章C语言程序设计基础课件.ppt 主要内容 课程概述 为什么选择C语言作为入门课程? C语言 ...

  6. 每个c语言程序写完后 都要按照,c语言基础学习小结(习题总结)(5页)-原创力文档...

    书山有路勤为径 学海无涯苦作舟 一.思考题. 1.你如何向别人解释清楚什么是编程.什么是计算机语言? 2.什么是C语言? 二.解答题. 1.用C语言编写程序:求任意两个整数的和.如果是小数的话,要求输 ...

  7. c语言程序中的错误可分为,《C语言程序设计(本)》模拟试卷1.doc

    <C语言程序设计(本)>模拟试卷1 <C语言程序设计(本)>模拟试卷1 总分:100分 时间:90分钟 一.单项选择题 :(每题2分,共18分) 1.下列字符列中,可以作为&q ...

  8. C需语言程序中的基本控制结构有哪些,C语言程序的基本控制结构1.ppt

    第三讲 C语言程序的 基本控制结构,参考书 <计算机程序设计基础>第三章 <C程序设计>第四章.第五章,本讲主要内容,结构化程序设计 if 语句 switch 语句 while ...

  9. python语言程序设计基础嵩天答案第二章_python语言程序设计基础(嵩天版),第二章程序练习题...

    python语言程序设计基础(嵩天版),第二章程序练习题 欢迎访问江南烧酒的博客 2.2汇率兑换程序.按照1美元=6人民币汇率编写一个美元和人民币的双向兑换程序. """ ...

最新文章

  1. STM32学习之路-感觉自己走到了一个天大的坑里了!
  2. php 对象字面量,js的字面量对象和JSON的区别
  3. CAP 3.0 版本正式发布
  4. 我要带徒弟学写JAVA架构,引路架构师之路(Jeecg开源社区)
  5. PHY芯片88EE1111 MDIO接口调试
  6. 为什么机器学习很难学习因果关系?
  7. 序列划分c语言,一篇“get”C语言八大排序算法
  8. 关于自定义函数的创建和调用
  9. 如何用Java解压缩WAR文件
  10. i2cdetect i2cdump i2cget i2cset用法
  11. 基于原理图法的全加器设计
  12. 高速单行道 IN Name Id”:道路入口有一辆车请求进入
  13. 三角肌前束(05):杠铃颈前推举
  14. 1-23 Socket编程
  15. Collections集合
  16. 使用matlab分析一段声音信号的均方根
  17. 去掉图片水印方法 小技巧
  18. OPENMV 开源项目简介
  19. DataTables+Ajax分页简单应用
  20. C语言实现根据阳历(公历)显示农历,干支,生肖

热门文章

  1. React-Native生命周期的触发场景和一些小建议
  2. Qt无故卡死关闭解决办法
  3. 常见函数带佩亚诺余项泰勒公式
  4. .Net 关于 InfoPath 的基本使用
  5. 写程序可以看出一个人的人品有多糟糕!
  6. 计算机优先启动项,bios怎么设定usb为优先启动项
  7. 适用于Android的最佳视频播放器
  8. unity室内效果烘焙和设置【2020】
  9. matlabR2019b怎么调整字体大小
  10. matlab multiple animatedline,matlab画图详解