C中如何提取excel中的信息

qiuyemm 2008-09-20 11:37:54
C中如何提取excel中的信息并把每一行都放到一个数组的一个元素里?
比如
雄鹿公牛
猛龙76人

谢谢了急,在线等
...全文
448 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
donkey2004112103 2008-10-09
  • 打赏
  • 举报
回复
又一次拜读了星羽的代码,学习了
星羽 2008-09-21
  • 打赏
  • 举报
回复
胡乱写一个,问题可能很多,仅供参考

文件字段以空格隔开

如文件 test.txt


雄鹿 公牛
猛龙 76人
网 奇才
猛龙 76人
老鹰 魔术
热火 尼克斯
太阳 马刺
雄鹿 超音速
国王 森林狼



#include "stdlib.h"

int get_row(FILE* ifile)
{
long s = ftell(ifile);
int row = 0;
char buf[1024];

fseek(ifile, 0, SEEK_SET);
while (fgets(buf, 1024, ifile) != 0)
if (*buf && *buf != '\n')
++row;
fseek(ifile, s, SEEK_SET);
return row;
}

int get_col(FILE* ifile)
{
long s = ftell(ifile);
int col = 0;
char buf[1024];

fseek(ifile, 0, SEEK_SET);
if (fgets(buf, 1024, ifile))
{
char* p = buf;
while (*p)
{
if (*p == ' ' || *p == '\n')
++col;
++p;
}
}
fseek(ifile, s, SEEK_SET);
return col;
}

int main()
{
FILE* ifile = fopen("test.txt", "r");
int row = 0;
int col = 0;
int r = 0;
int c = 0;
char buf[1024];

char (**ary)[64] = 0;

if (!ifile)
return 1;

row = get_row(ifile);
col = get_col(ifile);

ary = (char(**)[64])malloc(sizeof(char(*)[64]) * row);
for (; r < row; ++r)
ary[r] = (char(*)[64])malloc(sizeof(char[64]) * col);

r = 0;

while (fgets(buf, 1024, ifile))
{
char* p = buf;
char* t = buf;

if (!(*buf) || (*buf) == '\n')
continue;

c = 0;
while (*p && c < col)
{
if (*p == ' ' || *p == '\n')
{
strncpy(ary[r][c], t, p - t);
ary[r][c][p - t] = 0;
t = p + 1;
++c;
}
++p;
}
++r;
}

for (r = 0; r < row; ++r)
{
for (c = 0; c < col; ++c)
printf("%s ", ary[r][c]);
printf("\n");
}

for (r = 0; r < row; ++r)
free(ary[r]);
free(ary);

fclose(ifile);

return 0;
}





结果



雄鹿 公牛
猛龙 76人
网 奇才
猛龙 76人
老鹰 魔术
热火 尼克斯
太阳 马刺
雄鹿 超音速
国王 森林狼
请按任意键继续. . .






tjltail 2008-09-21
  • 打赏
  • 举报
回复
用odbc
这是代码,自己看看改 改
CString test3::GetExcelDriver()
{
char szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
char *pszBuf = szBuf;
CString sDriver;

// 获取已安装驱动的名称(函数在odbcinst.h里
if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
return "";

// 检索已安装的驱动是否有Excel
do
{
if (strstr(pszBuf, "Excel") != 0)
{
//发现 !———
sDriver = CString(pszBuf);
break;
}
pszBuf = strchr(pszBuf, '\0') + 1;
}
while (pszBuf[1] != '\0');

return sDriver;

}


void test3::readFromExcel(int radio,char* rate)
{
CDatabase database;
CString sDriver; // Excel安装驱动
CString sExcelFile = "demo.xls"; // 要建立的Excel文件
CString sSql;
CString sItem1,sItem2;
TRY
{
sDriver = GetExcelDriver();
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
sDriver, sExcelFile, sExcelFile);

// 创建数据库 (既Excel表格文件
if( database.OpenEx(sSql,CDatabase::forceOdbcDialog ) )
{
CRecordset recset(&database);


sSql = "SELECT Ref, Deg, Mapped_Mos "
"FROM demo "
"ORDER BY Ref desc";


recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);


char a[50];
memset(a,50,sizeof(char));
char b[50];
memset(b,50,sizeof(char));
double RESULT;
CString alg;
while (!recset.IsEOF())
{
recset.GetFieldValue("Ref", sItem1);
recset.GetFieldValue("Deg", sItem2);
strcpy(a,sItem1);
strcpy(b,sItem2);
if (sItem1.IsEmpty())
{
break;
}
if (radio==1)
{
alg = "BSD";
RESULT=BSD( a, b);
}

if (radio==2)
{
alg = "rate";
RESULT = webP862::web_pesq(rate, a, b);
}
if (radio==0)
{
alg = "pesq";
RESULT = pesq(rate, a, b);
}
CString str;
str.Format("%f", RESULT);

//----------------lg--------------------------
CString total = str;
sSql.Format( "update demo set Mapped_Mos = '%s' where Ref = '%s' and Deg = '%s'", total, sItem1,sItem2);
database.ExecuteSQL(sSql);

int nI = m_ListCtrl->GetItemCount();
LV_ITEM lvi;

lvi.mask = LVIF_TEXT | LVIF_STATE;
lvi.iItem = nI;
lvi.iSubItem = 0;
lvi.iImage = 0;
lvi.stateMask = LVIS_STATEIMAGEMASK;
lvi.state = INDEXTOSTATEIMAGEMASK(1);
lvi.pszText = (char*)(LPCTSTR)"";
int result = m_ListCtrl->InsertItem(&lvi);
if (result != -1)
{
m_ListCtrl->SetItemText(nI, 0, alg);
m_ListCtrl->SetItemText(nI, 1, rate);
m_ListCtrl->SetItemText(nI, 2, sItem1);
m_ListCtrl->SetItemText(nI, 3, sItem2);
m_ListCtrl->SetItemText(nI, 4, str);
}

//-----------lg-------------------------------
recset.MoveNext();
}

}

database.Close();
}
CATCH(CDBException , e)
{
AfxMessageBox(e->m_strError);
}
END_CATCH;
}


double test3::corr_Excel(double* a,double*b,double* p,int* num2)
{
CDatabase database;
CString sDriver; // Excel安装驱动
CString sExcelFile = "demo.xls"; // 要建立的Excel文件
CString sSql;
CString sItem1,sItem2;
// double a[2000];
// memset(a,2000,sizeof(double));
// double b[2000];
// memset(b,2000,sizeof(double));
char c[20];
memset(c,20,sizeof(char));
double d = 0.0;
int k = 0;
double r_result = 0.0;
double r__result = 0.0;
TRY
{
sDriver = GetExcelDriver();
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
sDriver, sExcelFile, sExcelFile);

// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog ) )
{
CRecordset recset(&database);

// 设置读取的查询语句.
sSql = "SELECT Ref, Deg, Mapped_Mos, Mos "
"FROM demo "
"ORDER BY Ref desc";

// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);

// 获取查询结果
while (!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("Mapped_Mos", sItem1);
recset.GetFieldValue("Mos", sItem2);
if(sItem2.IsEmpty())
{
if (k==0)
{
AfxMessageBox("主观分未列入表格!");
return 2.0;
}

break;
}

//AfxMessageBox(sItem2);
strcpy(c,sItem1);
d = atof(c);
a[k]=d;
strcpy(c,sItem2);
d = atof(c);
b[k]=d;
// 移到下一行
recset.MoveNext();
k++;
}
}
// 关闭数据库
database.Close();
r_result = corr(a,b,k);
*p = RSME(a,b,k);
*num2 = k;
return r_result;
}
CATCH(CDBException , e)
{
return 2.0;
AfxMessageBox(e->m_strError);
}
END_CATCH;

}

jieao111 2008-09-20
  • 打赏
  • 举报
回复
不建议给代码,建议自己看看msdn,自己写。
qiuyemm 2008-09-20
  • 打赏
  • 举报
回复
可以详细一点吗?比如我在 d盘有个 bisai.txt

内容是

雄鹿公牛
猛龙76人
网奇才
猛龙76人
老鹰魔术
热火尼克斯
太阳马刺
雄鹿超音速
国王森林狼

如何读取,放到一个数组中去呢?
详细的代码 最好了,谢谢。。
(本人很菜。)
jieao111 2008-09-20
  • 打赏
  • 举报
回复
给个例子先
/* fgets exmaple */
#include <stdio.h>

int main()
{
FILE * pFile;
char string [100];

pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL) perror ("Error opening file");
else {
fgets (string , 100 , pFile);
puts (string);
fclose (pFile);
}
return 0;
}
jieao111 2008-09-20
  • 打赏
  • 举报
回复
读文件啊
qiuyemm 2008-09-20
  • 打赏
  • 举报
回复
还是在txt怎么读取吧。 excel 太复制了,暂时还看不懂啊。
jieao111 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Chiyer 的回复:]
http://www.vckbase.com/document/viewdoc/?id=815
星羽 2008-09-20
  • 打赏
  • 举报
回复
如果只是简单的数据,那么你可以把excel的文件保存为tab格式的文本,用c去读

qiuyemm 2008-09-20
  • 打赏
  • 举报
回复
txt 也行

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧