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