EXCEL的问题

快乐鹦鹉 2012-05-04 11:39:20
现在我通过引入安装的Office后的EXCEL组件,实现了EXCEL文件的读写。不过现在遇到麻烦,就是系统发布时要求客户机安装office。但现在不少用户不使用office,而使用WPS。由于现在微软打击盗版,而且有些用户是国家政府部门,也不方便用盗版。
不知道操作EXCEL文件有没有其它办法,能够不需要安装office,而只需要将某些组件或动态库进行打包安装就可以。
记得以前有个C***Sheet的类,但好像只能读取EXCEL文件内容,没办法写入啊。
...全文
205 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
快乐鹦鹉 2012-05-18
[Quote=引用 14 楼 的回复:]
http://www.libxl.com/
[/Quote]
要钱的啊
  • 打赏
  • 举报
回复
zgl7903 2012-05-15
http://www.libxl.com/
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

excel有一定的文件组织格式,了解了格式,就可以跟普通文件IO一样,对excel文件读写。
[/Quote]
哥,你了解了解再说

回楼主:
2007/2010好像已经不是二进制格式了,是xml,叫什么openoffice,你可以考虑一下
  • 打赏
  • 举报
回复
GPoint 2012-05-15
楼上说的太轻松了
这种方法我没试过,如果使用ADO读Excel的话。值需要下载安装这个就行了
AccessDatabaseEngine.exe

access数据库组件,对你这个方法应该没用。我查过,使用这种方法必须要安装Excel
  • 打赏
  • 举报
回复
keep_m 2012-05-14
excel有一定的文件组织格式,了解了格式,就可以跟普通文件IO一样,对excel文件读写。
  • 打赏
  • 举报
回复
yeah2000 2012-05-09
http://download.csdn.net/detail/yeah2000/3576494
  • 打赏
  • 举报
回复
yeah2000 2012-05-04
没有excel,怎么使用C***Sheet的类?
  • 打赏
  • 举报
回复
诶呦 2012-05-04
老大我发现沙发还在,友情帮顶
用户没有excel就自动提示安装excel
  • 打赏
  • 举报
回复
快乐鹦鹉 2012-05-04
[Quote=引用 5 楼 的回复:]
CSpreadSheet类???
WPS下和Excel是不是相同或者类似?

C/C++ code


void CExcelExportDataDlg::OnCapexcel()
{
// TODO: Add your control notification handler code here
// _Application m_oExcelApp; ……
[/Quote]
我现在用的就是这个方法啊。可是如果没有安装EXCEL,那么根本初始化不成功的。就没法用了。
  • 打赏
  • 举报
回复
Coder_Y_Jao 2012-05-04
这个问题我上个月末刚好遇到过。也是一个国外的发布服务器上面没有EXCEL,而且不给装。
我修改代码前是用的下面的这样的导入的:

/*#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" \
rename("RGB", "ExcelRGB") \
rename("DocumentProperties", "ExcelDocumentProperties")
// Microsoft Visual Basic for Applications Extensibility 5.3
#import "libid:0002E157-0000-0000-C000-000000000046"

#import "libid:00020813-0000-0000-C000-000000000046" \
rename("DialogBox", "ExcelDialogBox") \
rename("RGB", "ExcelRGB") \
exclude("IFont", "IPicture") \
rename("CopyFile", "ExcelCopyFile") \
rename("ReplaceText", "ExcelReplaceText") \
named_guids \
no_dual_interfaces*/

//using namespace Excel;



由于没有安装EXCEL肯定会失败的,不导入libid直接导入路径肯定也是一样的编译失败。
后来发现这样导入后会生成下面6个文件:
EXCEL.tlh、EXCEL.tli、MSO.tlh、MSO.tli、VBE6EXT.tlh、VBE6EXT.tli

于是就把上面的代码屏蔽了,再把这6个文件放在某目录下后include,(include顺序要对才行,跟import一样的)

#include "Excel\MSO.tlh"
#include "Excel\VBE6EXT.tlh"
#include "Excel\EXCEL.tlh"


这个时候还没完,因为有些地方tlh会引用tli或其他文件,而tlh中写的是绝对路径(因为是import产生的文件)
所以要将tlh文件中的#include路径改为相对路径。
路径调整有点麻烦,但确实成功了。
  • 打赏
  • 举报
回复
向立天 2012-05-04
大版不如看看wps有没有提供第三方接口
office这面应该没有办法了
即便能找到继承组件的方法
但组件同样有版权问题啊
  • 打赏
  • 举报
回复
振翅高飞 2012-05-04
CSpreadSheet类???
WPS下和Excel是不是相同或者类似?

void CExcelExportDataDlg::OnCapexcel()
{
// TODO: Add your control notification handler code here
// _Application m_oExcelApp; // Excel程序
// _Worksheet m_oWorkSheet; // 工作表
// _Workbook m_oWorkBook; // 工作簿
// Workbooks m_oWorkBooks; // 工作簿集合
// Worksheets m_oWorkSheets; // 工作表集合
// Range m_oCurrRange; // 使用区域

_Application exlapp; //组件服务器的各个classes
_Workbook m_WorkBook;
Workbooks m_WorkBooks;
_Worksheet m_WorkSheet;
Worksheets m_WorkSheets;

CFileDialog dlg(TRUE,".xlsx",NULL,NULL,"Excel Files (*.xls)|*.xls||",NULL);
if(dlg.DoModal()==IDOK)
{
FilePath=dlg.GetPathName();
}
else
{
return;
}
int i,j,k,Index;

//创建Excel服务器
COleVariant avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

if(!exlapp.CreateDispatch("Excel.Application"))//CreateDispatch("Excel.Application")
{
AfxMessageBox("无法启动Excel服务器!");
return;
}

//Open an excel file
m_WorkBooks.AttachDispatch(exlapp.GetWorkbooks());

m_WorkBook=m_WorkBooks.Open(FilePath,avar,avar,avar,
avar,avar,avar,avar,avar,
avar,avar,avar,avar,avar,
avar);
m_WorkSheets=m_WorkBook.GetWorksheets();

Range range;
//// 读取SheetData表及其内部数据
char Temp[100];
wchar_t Buff_Attr[MAXLEN_STRING];
wchar_t Buff_Item[MAXLEN_STRING];
memset(Temp,0,100);

for (k=0;k<100;++k)
{
memset(SheetData[k],0,30);
}

pFile=fopen(SheetPath,"r");
if (!pFile)
{
MessageBox("打开SheetNamePath文本失败。","信息提示",MB_OK);
return;
}
k=0;
unsigned ColumnSize[100]={0},RowSize[100]={0};
while(1)
{
memset(Temp,0,100);

fgets(Temp,100,pFile);
if (strcmp(Temp,"")==0||strcmp(Temp,"\n")==0)
{
break;
}
if (strstr(Temp,"\n")!=NULL)
{
Temp[strlen(Temp)-1]='\0';
}

if(sscanf(Temp,"%s%d%d",SheetData[k],&RowSize[k],&ColumnSize[k])!=3)
{
MessageBox("读取SheetData文本失败。","信息提示",MB_OK);
return;
}
++k;
}

fclose(pFile);

//// 处理XML存储路径
m_SavePath.GetWindowText(szSavePath);
if (szSavePath.Find(".xml")==-1)
{
if (!szSavePath.IsEmpty())
{
szSavePath+="\\jobsvr_tstdt.xml";
}
else
{
szSavePath="C:\\jobsvr_tstdt.xml";
}
}

//////生成指定存储位置的xml文件
/*
节点嵌套层
Node_schemas
Node_class
Node_case
Node_normal
Node_value
*/
k=0;
IXMLBuilder* builder = Ablaze_XMLBuilder();
Ablaze::IXMLDocument* doc = NULL;
IXMLNode* Node_schemas = NULL;
doc = builder->CreateDocument();
UnicodeProcess("schemas",Buff_Item,MAXLEN_STRING);
CString ValCells,Attr;
builder->AppendRoot(doc, UnicodeToUTF8(Buff_Item), &Node_schemas);
VARIANT ret;
while (strcmp(SheetData[k],"")!=0)
{
Index=0;
// <attr n = "UUID_L" >96626b00-3aa6-11e1-8000-5dfc00005cfc</attr>
IXMLNode* Node_class = NULL;
UnicodeProcess("class ",Buff_Item,MAXLEN_STRING);

builder->AppendChildNode(Node_schemas,UnicodeToUTF8(Buff_Item), &Node_class);

UnicodeProcess("n ",Buff_Item,MAXLEN_STRING);
builder->SetNodeAttribute(Node_class,UnicodeToUTF8(Buff_Item),SheetData[k]);

////遍历工作簿文件下的所有Sheet表,每一个表即是一个Ablaze类
m_WorkSheet = m_WorkSheets.GetItem(COleVariant((short)(k+1)));
// if (strcmp(SheetData[k],"rBrkDwnTsk")==0)
// {
// MessageBox("等等","信息提示",MB_OK);
// }
NumToLetter(ColumnSize[k],Temp,100,RowSize[k]);
if(strcmp(Temp,"")==0)
{
MessageBox("SheetData配置文件不正确。","信息提示",MB_OK);
return;
}
range=m_WorkSheet.GetRange(COleVariant("A1"), COleVariant(Temp));//选定有效的读取范围
ret=range.GetValue(avar);
COleSafeArray sa(ret);
long lNumRows;
long lNumCols;
sa.GetUBound(1, &lNumRows);
sa.GetUBound(2, &lNumCols);

for (i=7;i<=lNumRows;++i)
{
ValCells.Empty();
IXMLNode* Node_case= NULL;
IXMLNode* Node_normal = NULL;
UnicodeProcess("case ",Buff_Item,MAXLEN_STRING);

builder->AppendChildNode(Node_class,UnicodeToUTF8(Buff_Item),&Node_case);

memset(Temp,0,100);
sprintf(Temp,"%d",++Index);

UnicodeProcess(" id ",Buff_Item,MAXLEN_STRING);
builder->SetNodeAttribute(Node_case,UnicodeToUTF8(Buff_Item),Temp);////一个Node_case就是

UnicodeProcess("normal",Buff_Item,MAXLEN_STRING);////Excel的一行数据。
builder->AppendChildNode(Node_case,UnicodeToUTF8(Buff_Item),&Node_normal);

for (j=2;j<=lNumCols;++j)
{
ValCells.Empty();
IXMLNode* Node_value = NULL;
UnicodeProcess("attr",Buff_Item,MAXLEN_STRING);
builder->AppendChildNode(Node_normal, UnicodeToUTF8(Buff_Item), &Node_value);

GetCellsValue(Attr,ret,1,j);//获取属性名存入AttrList表中
GetCellsValue(ValCells,ret,i,j);//获取具体属性值

wcscpy(Buff_Attr,ANSIToUnicode(Attr));
UnicodeProcess("n ",Buff_Item,MAXLEN_STRING);
builder->SetNodeAttribute(Node_value,UnicodeToUTF8(Buff_Item),UnicodeToUTF8(Buff_Attr));

wcscpy(Buff_Item,ANSIToUnicode(ValCells));
builder->SetNodeValue(Node_value,UnicodeToUTF8(Buff_Item));
Node_value->Release();
}
Node_case->Release();
Node_normal->Release();
}
Node_class->Release();
++k;
}
pFile=fopen(szSavePath,"w");
if (!pFile)
{
MessageBox("创建XML文本出错。","信息提示",MB_OK);
return;
}

builder->DumpDocumentToFile(doc,pFile);
fclose(pFile);

doc->Release();
if ( builder != NULL ) builder->Release();

m_WorkBooks.ReleaseDispatch();
exlapp.ReleaseDispatch();
m_WorkBook.Close(avar,COleVariant(FilePath),avar);
m_WorkBooks.Close();
exlapp.Quit();

memset(Temp,0,100);
sprintf(Temp,"总共处理了%d个类。",k);
::MessageBox(m_hWnd,Temp,"信息提示",MB_OK);
}


void GetCellsValue(CString &ValCells,VARIANT &ret,int iRow,int jColumn)
{
ValCells.Empty();
CString cstr;
VARIANT val;
COleSafeArray sa(ret);
long index[2];
index[0]=iRow;
index[1]=jColumn;
sa.GetElement(index, &val);
switch(val.vt)
{
case VT_R8: //数字
{
//TRACE("\t\t%1.2f", val.dblVal);
cstr="";
cstr.Format("%1.1f",val.dblVal);
ValCells+=cstr;
break;
}
case VT_BSTR: //文字
{ //TRACE("\t\t%s",(CString)val.bstrVal);
ValCells+=(CString)val.bstrVal+"\n";
break;
}
case VT_EMPTY:
ValCells="";
break;
}
}



我以前做的一个程序的部分代码。
那个CSpreadSheet类不好,建议不要用。
还是用COm组件的内部函数接口为好。
  • 打赏
  • 举报
回复
DavidHsing 2012-05-04
还可以找和谐版的 libxl
  • 打赏
  • 举报
回复
DavidHsing 2012-05-04
http://blog.csdn.net/davidhsing/article/details/4231592

BasicExcel
搜索 CodeProject
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
申请成为版主
帖子事件
创建了帖子
2012-05-04 11:39
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……