如何用C ++将数据写入Excel文件

时间:2013-11-28 08:26:35

标签: c++ excel

我使用Visual Studio 2012 C ++进行编程。 我的教授要求我将我的程序结果放入excel文件而不是.txt文件中,因为其他人更容易理解。 我可以在我的C ++程序中使用一些接口来直接生成excel文件并将数据放入其中吗?

7 个答案:

答案 0 :(得分:3)

你的教授会接受一个csv文件吗?这是一个字符分隔值;虽然Excel也会接受制表符,但通常使用逗号作为分隔符。 Excel可以自动加载这些内容并将输入拆分为单独的行和列。我怀疑这就是教授所追求的。

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

答案 1 :(得分:1)

现代EXCEL版本可以读取各种格式,而不仅仅是原生的EXCEL格式,其中一些格式比其他格式更容易制作。

您可以使用自动化生成原生EXCEL文件,但这很困难,繁琐且易碎(有时它会在没有理由的情况下停止工作)。

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

如果您想要更多地控制工作表的格式或布局,可以使用Excel 2003 XML格式。只需根据需要创建文件模板,并使用它创建自己的模板:它是纯XML,相对简单易懂。

答案 2 :(得分:1)

有一个名为XLSX I / O的可移植C / C ++库可以写入.xlsx文件,甚至没有安装Excel。 请参阅:https://sourceforge.net/projects/xlsxio/

答案 3 :(得分:1)

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

第一步是使用MS组件对象模型(COM)。请参阅本文-Excel C++

#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")

接下来,为Excel :: __ ApplicationPtr,Excel :: _ WorkbookPtr和Excel :: __ WorksheetPtr创建Excel指针

使用AfxInitExtensionModule()初始化您的dll

创建一个指向Excel Range-Excel :: RangePtr的指针。这是用于在单元级别访问数据的功能。

将API暴露给客户端代码以进行读写。 这是一个很好的指导 https://github.com/jmcnamara/libxlsxwriter CSpreadSheet

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

答案 4 :(得分:0)

如果您不想使用第三方库或自动化,并且需要某种格式(颜色,字体等等),您只需创建一个开放式办公室xml即可。 http://en.wikipedia.org/wiki/Microsoft_Office_2003_XML_formats

答案 5 :(得分:0)

我一直在Linux中使用这个库:

https://github.com/jmcnamara/libxlsxwriter.git

效果很好,当然,它很快。

一旦您在文件中需要多个工作表,'use csv'建议就会停止工作,就像我的情况一样。

答案 6 :(得分:0)

在Windows上,您可以使用ODBC,它可以将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;
}