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

How to write data into an Excel file in C++

本文关键字:Excel 文件 数据 何用 C++      更新时间:2023-10-16

我正在使用Microsoft Visual studio 2012 C++进行编程。我的教授让我把程序的结果放在excel文件中,而不是文本文件中。因为别人更容易理解。在我的C++程序中,有没有一些接口可以直接生成excel文件并将数据放入其中?

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

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

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

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

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

一旦你需要文件中的多张纸,"使用csv"建议就会停止工作,就像我的情况一样。

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

示例:

#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">%sn", query);
    /* Prepare SQL query */
    rc = SQLAllocStmt(hDbc,&hStmt);
    if(!SQL_SUCCEEDED(rc)){
        wprintf(L"SQLAllocStmt failedn");
        return FALSE;
    }
    rc = SQLPrepare(hStmt, query, SQL_NTS);   
    if(!SQL_SUCCEEDED(rc)){
        wprintf(L"SQLPrepare failedn");
        SQLFreeHandle(SQL_HANDLE_STMT,hStmt);
        return FALSE;
    }
    /* Excecute the query */
    rc = SQLExecute(hStmt); 
    if (SQL_SUCCEEDED(rc)) {
        wprintf(L"SQL Successn");
        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: %sn",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  %sn", 
        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;
}

有一个名为XLSX I/O的可移植C/C++库,它可以在不安装Excel的情况下写入.XLSX文件。请参阅:https://github.com/brechtsanders/xlsxio

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

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

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

如果希望对图纸的格式或布局进行更多控制,可以使用Excel 2003 XML格式。只需根据自己的喜好创建一个文件模板,并使用它创建自己的模板:它是简单的XML,理解起来相对简单。

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

第一部分是使用MS组件对象模型(COM)。参考本文-Excel C++

#import "C:Program Files (x86)Common Filesmicrosoft sharedOFFICE14mso.dll"  
rename_namespace("Office2003") 
rename("RGB","RGBmso") 
rename("DocumentProperties","DocumentPropertiesmso")
#import "C:Program Files (x86)Common FilesMicrosoft SharedVBAVBA6VBE6EXT.olb"  
rename_namespace("VBE6")
#pragma warning (disable:4278)
#import "C:Program Files (x86)Microsoft OfficeOffice14EXCEL.EXE" 
exclude("IFont", "IPicture") 
rename("RGB","RGBxl") 
rename("DialogBox", "DlgBoxxl")

接下来为Excel::_ApplicationPtr、Excel::_WorkbookPtr和Excel::_WorksheetPtr 创建Excel指针

使用AfxInitExtensionModule()初始化dll

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

向客户端代码公开API以进行读写。这是一个很好的指南https://github.com/jmcnamara/libxlsxwriterC资产负债表

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

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