如何将数据写入C++; 我用微软Visual Studio 2012 C++编程。 我的教授让我把程序的结果放进excel文件而不是文本文件。因为它更容易让别人理解。 是否有一些接口可以在我的C++程序中直接生成Excel文件并把数据放在里面? < P>你的教授是否接受CSV文件?这是一个字符分隔值;通常使用逗号作为分隔符,尽管Excel也接受制表符。Excel可以自动加载这些内容,并将输入拆分为单独的行和列。我想那就是教授想要的

如何将数据写入C++; 我用微软Visual Studio 2012 C++编程。 我的教授让我把程序的结果放进excel文件而不是文本文件。因为它更容易让别人理解。 是否有一些接口可以在我的C++程序中直接生成Excel文件并把数据放在里面? < P>你的教授是否接受CSV文件?这是一个字符分隔值;通常使用逗号作为分隔符,尽管Excel也接受制表符。Excel可以自动加载这些内容,并将输入拆分为单独的行和列。我想那就是教授想要的,c++,excel,C++,Excel,否则,使用Excel的组件对象模型(COM)是另一种途径。但这要复杂得多。现代EXCEL版本可以读取多种格式,不仅是原生EXCEL格式,而且其中一些格式比其他格式更容易生成 您可以使用自动化生成本机EXCEL文件,但这是困难的、繁琐的和脆弱的(有时它会无缘无故地停止工作) 如果只想填充几个单元格,最简单的方法是编写CSV文件 如果希望对图纸的格式或布局进行更多控制,可以使用Excel 2003 XML格式。只要创建一个您喜欢的文件模板,并使用它来创建您自己的:它是纯XML,相对简单易懂。如果您不

否则,使用Excel的组件对象模型(COM)是另一种途径。但这要复杂得多。

现代EXCEL版本可以读取多种格式,不仅是原生EXCEL格式,而且其中一些格式比其他格式更容易生成

您可以使用自动化生成本机EXCEL文件,但这是困难的、繁琐的和脆弱的(有时它会无缘无故地停止工作)

如果只想填充几个单元格,最简单的方法是编写CSV文件


如果希望对图纸的格式或布局进行更多控制,可以使用Excel 2003 XML格式。只要创建一个您喜欢的文件模板,并使用它来创建您自己的:它是纯XML,相对简单易懂。

如果您不想使用第三方库或自动化,并且需要某种格式(颜色、字体等),您只需创建一个开放的office XML即可。
有一个名为XLSX I/O的可移植C/C++库,它可以写入.XLSX文件,甚至不用安装Excel。
请参阅:

我一直在Linux中使用此库:

它工作得很好,当然也很快

“使用csv”建议会在文件中需要多个工作表时立即停止工作,这是我的情况。

在您可以使用的Windows上,允许将Excel工作表作为常规数据库表使用。它只处理数据,而不是格式化、图表等。标准ODBC驱动程序只支持xls文件;要创建xlsx文件,必须安装Microsoft Access 2010+数据库引擎可再发行

例如:

#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <Windows.h>
#include <sqlext.h>

WCHAR szDSN[] = L"Driver={Microsoft Excel Driver (*.xls)};DSN='';CREATE_DB=\"C:\\test\\newfile.xls\";DBQ=C:\\test\\newfile.xls;READONLY=0;";

BOOL ExecuteSql(HDBC hDbc, LPWSTR query){

    RETCODE rc;
    HSTMT hStmt;
    WCHAR bufstate[10]=L"";
    WCHAR buferr[1024]=L"";
    SQLINTEGER i;
    SQLSMALLINT cch;
    BOOL result;

    wprintf(L">%s\n", query);

    /* Prepare SQL query */
    rc = SQLAllocStmt(hDbc,&hStmt);

    if(!SQL_SUCCEEDED(rc)){
        wprintf(L"SQLAllocStmt failed\n");
        return FALSE;
    }

    rc = SQLPrepare(hStmt, query, SQL_NTS);   

    if(!SQL_SUCCEEDED(rc)){
        wprintf(L"SQLPrepare failed\n");
        SQLFreeHandle(SQL_HANDLE_STMT,hStmt);
        return FALSE;
    }

    /* Excecute the query */
    rc = SQLExecute(hStmt); 

    if (SQL_SUCCEEDED(rc)) {
        wprintf(L"SQL Success\n");
        result = TRUE;
    }
    else{       
        SQLGetDiagRec(SQL_HANDLE_STMT,hStmt,1,bufstate,&i,buferr,sizeof(buferr)/sizeof(buferr[0]),&cch);
        wprintf(L"SQL Error. Code: %d; Message: %s\n",i,buferr);    
        result = FALSE;
    }

    SQLFreeHandle(SQL_HANDLE_STMT,hStmt);
    return result;
}

int _tmain(int argc, _TCHAR* argv[])
{    
setlocale(LC_ALL,"Russian");
HENV    hEnv;
HDBC    hDbc;

/* ODBC API return status */
RETCODE rc;

int     iConnStrLength2Ptr;
WCHAR    szConnStrOut[256];

/* Allocate an environment handle */
rc = SQLAllocEnv(&hEnv);
/* Allocate a connection handle */
rc = SQLAllocConnect(hEnv, &hDbc);

/* Connect to the database */
rc = SQLDriverConnect(hDbc, NULL, (WCHAR*)szDSN, 
    SQL_NTS, (WCHAR*)szConnStrOut, 
    255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);

if (SQL_SUCCEEDED(rc)) 
{
    wprintf(L"Successfully connected to database. Data source name: \n  %s\n", 
        szConnStrOut);  

    ExecuteSql(hDbc,L"CREATE TABLE [Test] ([Name] TEXT, [Surname] TEXT)");  
    ExecuteSql(hDbc,L"INSERT INTO [Test] VALUES ('John','Smith')");    
}
else
{
    wprintf(L"Couldn't connect to %s.\n",szDSN);
}

/* Disconnect and free up allocated handles */
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);

getchar();
return 0;
}
#包括
#包括
#包括
#包括
#包括
WCHAR szDSN[]=L“驱动程序={Microsoft Excel驱动程序(*.xls)};DSN='';创建\u DB=\“C:\\test\\newfile.xls\;DBQ=C:\\test\\newfile.xls;只读=0;”;
BOOL ExecuteSql(HDBC HDBC,LPWSTR查询){
RETCODE-rc;
HSTMT-HSTMT;
WCHAR bufstate[10]=L';
WCHAR buferr[1024]=L”“;
sqli;
SQLSMALLINT-cch;
布尔结果;
wprintf(L“>%s\n”,查询);
/*准备SQL查询*/
rc=SQLAllocStmt(hDbc和hStmt);
如果(!SQL_成功(rc)){
wprintf(L“SQLAllocStmt失败\n”);
返回FALSE;
}
rc=SQLPrepare(hStmt、查询、SQL);
如果(!SQL_成功(rc)){
wprintf(L“SQLPrepare失败\n”);
SQLFreeHandle(SQL\u HANDLE\u STMT,hStmt);
返回FALSE;
}
/*排除查询*/
rc=SQLExecute(hStmt);
如果(SQL_成功(rc)){
wprintf(L“SQL成功”\n);
结果=真;
}
否则{
SQLGetDiagRec(SQL\u HANDLE\u STMT,hStmt,1,bufstate,&i,buferr,sizeof(buferr)/sizeof(buferr[0]),&cch);
wprintf(L“SQL错误。代码:%d;消息:%s\n”,i,buferr);
结果=假;
}
SQLFreeHandle(SQL\u HANDLE\u STMT,hStmt);
返回结果;
}
int _tmain(int argc,_TCHAR*argv[]
{    
setlocale(法语,俄语);
HENV-HENV;
HDBC-HDBC;
/*ODBC API返回状态*/
RETCODE-rc;
int IConnstrllengt2PTR;
WCHAR szConnStrOut[256];
/*分配一个环境句柄*/
rc=SQLAllocEnv(&hEnv);
/*分配一个连接句柄*/
rc=SQLAllocConnect(hEnv和hDbc);
/*连接到数据库*/
rc=SQLDriverConnect(hDbc,NULL,(WCHAR*)szDSN,
SQL(WCHAR*)szConnStrOut,
255,(SQLSMALLINT*)和iconstrlengt2ptr,SQL\u驱动程序\u NOPROMPT);
如果(SQL_成功(rc))
{
wprintf(L)“已成功连接到数据库。数据源名称:\n%s\n”,
szConnStrOut);
ExecuteSql(hDbc,L“创建表[Test]([Name]文本,[姓氏]文本)”);
ExecuteSql(hDbc,L“插入到[测试]值('John','Smith')”);
}
其他的
{
wprintf(L“无法连接到%s。\n”,szDSN);
}
/*断开并释放分配的句柄*/
SQLDisconnect(hDbc);
sqlfreehold(SQL\u HANDLE\u DBC,hDbc);
sqlfreehold(SQL\u HANDLE\u ENV,hEnv);
getchar();
返回0;
}

我参加聚会迟到了,但我尝试了上述几种解决方案,这似乎对我很有效。我也从其他网站得到了灵感

第一部分是使用MS组件对象模型(COM)。请参阅本文件-

接下来为Excel::_应用程序PTR、Excel::_工作簿PTR和Excel::_工作表PTR创建Excel指针

使用AfxInitExtensionModule()初始化dll

创建指向Excel范围-Excel::RangePtr的指针。这是用于在单元级别访问数据的内容

向客户端代码公开API以进行读写。 这是一个很好的指南


对于性能POV,我能够在155秒内写入约33k条记录

最简单的方法是写下CSV文件并将其导入EXCEL。可能不是你所寻找的,但是…对于更多的特性,比如细胞格式化等等,存在C++的库也像LIXXL。谢谢你回答我的问题。我在使用XML时发现了另一个问题。例如,我的原始数据是2057121.414067134,但当我将这个数字放入.xml文件时,它会自动变成2057100。我试着让它输出8位小数,但是数字变成了20570100.00000000。你知道如何解决这个问题吗?你写过这样的东西吗:2057121.414067101?(注意SS:Type)不,我没有直接写这个数字,我写的数据:我的C++程序中的数据=20570121.414067101,当你打开一个文本编辑器上的XML文件时,你有20570121.414067101个吗?也许是你的问题
#import "C:\Program Files (x86)\Common Files\microsoft shared\OFFICE14\mso.dll"  \
rename_namespace("Office2003") \
rename("RGB","RGBmso") \
rename("DocumentProperties","DocumentPropertiesmso")
#import "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.olb"  \
rename_namespace("VBE6")
#pragma warning (disable:4278)
#import "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" \
exclude("IFont", "IPicture") \
rename("RGB","RGBxl") \
rename("DialogBox", "DlgBoxxl")