方法1.通过后端程序代码录入数据,执行程序后,导出Excel表格。代码参考如下:
//创建一个workbook实例
Workbook wb = new Workbook()
//清除默认的工作表
wb.Worksheets.Clear()
//添加一个工作表并指定表名
Worksheet sheet = wb.Worksheets.Add("职员表")
//横向合并A1到G1的单元格
sheet.Range["A1:G1"].Merge()
//写入数据到A1单元格,设置文字格式及对齐方式
sheet.Range["A1"].Value = "环宇汽车公司员工基本情况登记表"
sheet.Range["A1"].HorizontalAlignment = HorizontalAlignType.Center
sheet.Range["A1"].VerticalAlignment = VerticalAlignType.Center
sheet.Range["A1"].Style.Font.IsBold = true
sheet.Range["A1"].Style.Font.Size = 13F
//设置第一行行高
sheet.Rows[0].RowHeight = 30F
//创建一个DataTable
DataTable dt = new DataTable()
dt.Columns.Add("姓名")
dt.Columns.Add("性别")
dt.Columns.Add("出生日期")
dt.Columns.Add("学历")
dt.Columns.Add("联系电话")
dt.Columns.Add("职务")
dt.Columns.Add("工号")
dt.Rows.Add("王伟", "男", "1990年2月10日", "本科", "13524756854", "销售","0054")
dt.Rows.Add("李宁", "男", "1985年6月8日", "大专", "13259863247", "销售","0055")
dt.Rows.Add("邓家佳", "女", "1989年11月25日", "本科", "13601540352", "销售","0029")
dt.Rows.Add("杜平安", "男", "1978年4月16日", "中专", "13352014060", "保安","0036")
dt.Rows.Add("唐静", "女", "1980年1月21日", "本科", "13635401489", "店长","0010")
//将DataTable数据写入工作表
sheet.InsertDataTable(dt, true, 2, 1, true)
//设置该区域行高
sheet.Range["A2:G7"].RowHeight = 15F
//设置第三列及第五列列宽
sheet.Range["A2:G7"].Columns[2].ColumnWidth = 15F
sheet.Range["A2:G7"].Columns[4].ColumnWidth = 15F
//设置网格线样式及颜色
sheet.Range["A2:G7"].BorderAround(LineStyleType.Medium)
sheet.Range["A2:G7"].BorderInside(LineStyleType.Thin)
sheet.Range["A2:G2"].BorderAround(LineStyleType.Medium)
sheet.Range["A2:G7"].Borders.KnownColor = ExcelColors.Black
//保存为.xlsx文件
wb.SaveToFile("创建Excel.xlsx", FileFormat.Version2013)
方法2. 通过连接数据库,将数据库中的数据导出到Excel。参考如下代码:
//创建一个workbook对象,默认创建03版的Excel
Workbook workbook = new Workbook()
//指定版本信息,07及以上版本最多可以插入1048576行数据
workbook.Version = ExcelVersion.Version2013
//获取第一张sheet
Worksheet sheet = workbook.Worksheets[0]
//得到在datatable里的数据
DataTable dt = GetDataTable()
//从第一行第一列开始插入数据,true代表数据包含列名
sheet.InsertDataTable(dt, true, 1, 1)
//保存文件
workbook.SaveToFile("ExportDataToExcel.xlsx",ExcelVersion.Version2013)
写在最后:通过以上方法,均需要在VS中引入程序集文件Spire.Xls.dll。以上代码参考自原文1、原文2。
可以先用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 提供必要的输出信息或干脆删掉。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)