vc导入导出数据到excel表

vc导入导出数据到excel表,第1张

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

我要在vc中实现将数据插入excel表,从表中查询数据,删除数据,更新数据,会的帮帮忙

解析:

我用的是excel2000

首先利用Visual C++ 6.0,建立一个MFC基于对话框的工程项目,共享DLL,Win32平台。工程名称ExcelTest。在主对话框中加入一个按钮,

ID IDC_EXCELTEST

Caption Test Excel

双击该按钮,增加成员函数void CExcelTestDlg::OnExceltest()。

在BOOL CExcelTestApp::InitInstance()中,dlg.DoModal()之前增加代码:

if (CoInitialize(NULL)!=0)

{

AfxMessageBox("初始化COM支持库失败!")

exit(1)

}

在return FALSE语句前,加入:

CoUninitialize()

选择Menu->View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a type library,选择D:\Program Files\Microsoft Office\office\Excel9.OLB(D:\Program Files\Microsoft Office\是本机上Microsoft Office 2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,分别为_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。

在ExcelTestDlg.cpp文件的头部,#include "ExcelTestDlg.h"语句之下,增加 :

#include "def.h"

#include "Excel9.h"

在void CExcelTestDlg::OnExceltest() 函数中增加如下代码:

void CExcelTestDlg::OnExceltest()

{

_Application ExcelApp

Workbooks wbsMyBooks

_Workbook wbMyBook

Worksheets wssMysheets

_Worksheet wsMysheet

Range rgMyRge

创建Excel 2000服务器(启动Excel)

if (!ExcelApp.CreateDispatch("Excel.Application",NULL))

{

AfxMessageBox("创建Excel服务失败!")

exit(1)

}

利用模板文件建立新文档

wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true)

wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t("g:\\exceltest\\MyTemplate.xlt")))

得到Worksheets

wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true)

得到sheet1

wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true)

得到全部Cells,此时,rgMyRge是cells的 ***

rgMyRge.AttachDispatch(wsMysheet.GetCells(),true)

设置1行1列的单元的值

rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("This Is A Excel Test Program!"))

得到所有的列

rgMyRge.AttachDispatch(wsMysheet.GetColumns(),true)

得到第一列

rgMyRge.AttachDispatch(rgMyRge.GetItem(_variant_t((long)1),vtMissing).pdispVal,true)

设置列宽

rgMyRge.SetColumnWidth(_variant_t((long)200))

调用模板中预先存放的宏

ExcelApp.Run(_variant_t("CopyRow"),_variant_t((long)10),vtMissing,vtMissing,

vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,

vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,

vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,

vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing)

打印预览

wbMyBook.SetSaved(true)

ExcelApp.SetVisible(true)

wbMyBook.PrintPreview(_variant_t(false))

释放对象

rgMyRge.ReleaseDispatch()

wsMysheet.ReleaseDispatch()

wssMysheets.ReleaseDispatch()

wbMyBook.ReleaseDispatch()

wbsMyBooks.ReleaseDispatch()

ExcelApp.ReleaseDispatch()

}

材料/工具:SQL Server

1、打开SQL Server,找到需要导出的数据库。

2、在需要导出的数据库上右击,选择任务选项中的导出数据选项。

3、SQL Server导入和导出向导窗口中,单击下一步按钮。

4、选择数据源对话框中,选择数据源选项中的Microsoft OLE DB Provider for SQL Server选项。

5、选择使用SQL Server身份验证,输入用户名和密码,选择要导出的数据库,单击下一步。

6、选择目标对话框中,选择目标选项中的Microsoft OLE DB Provider for SQL Server选项。

7、选择使用SQL Server身份验证,输入用户名和密码,单击新建按钮。

8、出现的创建数据库窗口中,在名称处输入一个导出数据库的名字,本例为NewData。

9、可以看到在数据库选项中,多出了一个NewData的名称,单击下一步。

10、指定复制或查询对话框中,选择复制一个或多个表或视图的数据选项,单击下一步。

11、选择源表和源视图对话框中,选择自己要导出的表和视图。

12、运行包对话框中,单击完成按钮,数据就成功导出了。

可以先用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 <windows.h>

#include <sqlext.h>

#include <stdio.h>

#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]

intrc, 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=%sDBQ=%sREADONLY=FALSEEXCLUSIVE=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=0i<nColCount++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=0i<nColCount++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=%08Xhdbc=%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 <stdio.h>去掉, printf/fprintf 改为用 MessageBox 提供必要的输出信息或干脆删掉。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9994741.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存