Workbooks wbsMyBooks
_Workbook wbMyBook
Worksheets wssMysheets
_Worksheet wssMysheet
Range range
Range iCell
LPDISPATCH lpDisp
COleVariant vResult
COleVariant covTrue((short)TRUE), covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR)
// if(!m_ExcelApp.CreateDispatch("Excel.Application"))
// {
// AfxMessageBox("无法启动Excel服务器!");
// return;
// }
//app.SetVisible(TRUE); //使Excel可见
//ExcelApp.SetUserControl(TRUE); //允许其它用户控制Excel
//打开c:\\*.xls
wbsMyBooks.AttachDispatch(m_ExcelApp.GetWorkbooks());
lpDisp = wbsMyBooks.Open(m_strPath,//此处无法打开文档没有问题
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional);
wbMyBook.AttachDispatch(lpDisp);
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets());
//得到当前活跃sheet,如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
lpDisp = wbMyBook.GetActiveSheet()
wssMysheet.AttachDispatch(lpDisp)
//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
Range usedRange
usedRange.AttachDispatch(wssMysheet.GetUsedRange())
range.AttachDispatch(usedRange.GetRows())
long iRowNum = range.GetCount()
range.AttachDispatch(usedRange.GetColumns())
long iColNum = range.GetCount()
long iStartRow = usedRange.GetRow()
long iStartCol = usedRange.GetColumn()
//读取第iStartRow行,第iStartCol列单元格的值
range.AttachDispatch(wssMysheet.GetCells())
range.AttachDispatch(range.GetItem(COleVariant(iStartRow),COleVariant(iStartCol)).pdispVal)
vResult = range.GetValue()
CString str
if(vResult.vt == VT_BSTR) //字符串
str = vResult.bstrVal
else if (vResult.vt == VT_R8) //8字节的数字
str.Format("%f", vResult.dblVal)
else if(vResult.vt == VT_DATE) //时间格式
{
SYSTEMTIME st
VariantTimeToSystemTime(vResult.date, &st)
}
else if(vResult.vt == VT_EMPTY) //单元格空的
str = ""
//读取第一个单元格的对齐方式,数据类型:VT_I4,读取水平对齐方式
range.AttachDispatch(wssMysheet.GetCells())
iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal)
vResult.lVal = 0
vResult = iCell.GetHorizontalAlignment()
if(vResult.lVal != 0)
{
switch (vResult.lVal)
{
case 1: //默认
break
case -4108: //居中
break
case -4131 : //靠左
break
case -4152 : //靠右
break
}
}
//垂直对齐方式
iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal)
vResult.lVal = 0
vResult = iCell.GetVerticalAlignment()
if(vResult.lVal!=0)
{
switch (vResult.lVal)
{
case -4160 : //靠上
break
case -4108 : //居中
break
case -4107 : //靠下
break
}
}
//设置第一个单元格的值"HI,EXCEL!"
range.SetItem(COleVariant(long(1)),COleVariant(long(1)),COleVariant("HI,EXCEL!"))
//设置第一个单元格字体颜色:红色
// CFont font
// range.AttachDispatch(wssMysheet.GetCells())
// range.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal)
// font(COleVariant((long)0xFF0000))
//合并单元格的处理,包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并
Range unionRange
range.AttachDispatch(wssMysheet.GetCells())
unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal )
vResult = unionRange.GetMergeCells()
if(vResult.boolVal == -1) //是合并的单元格
{
//合并单元格的行数
range.AttachDispatch(unionRange.GetRows())
long iUnionRowNum=range.GetCount()
//合并单元格的列数
range.AttachDispatch(unionRange.GetColumns())
long iUnionColumnNum=range.GetCount()
//合并区域的起始行,列
long iUnionStartRow=unionRange.GetRow()
long iUnionStartCol=unionRange.GetColumn()
}
else if(vResult.boolVal == 0)
{
//不是合并的单元格,将第一个单元格合并成2行,3列
range.AttachDispatch(wssMysheet.GetCells())
unionRange.AttachDispatch(range.GetItem(COleVariant((long)1),COleVariant((long)1)).pdispVal )
unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)2),COleVariant((long)3)))
unionRange.Merge(COleVariant((long)0))
}
//将文件保存为*.xls
m_ExcelApp.SetVisible(TRUE)
CString strtmp = m_strPath.Left(m_strPath.ReverseFind('.')) + ".xls"
//这里应该确保strtmp为有效路径,否则的话该函数会自己处理异常,导致以后的语句没有执行,没有关闭打开的文档
wbMyBook.SaveAs(COleVariant(strtmp),covOptional,covOptional,
covOptional,covOptional,covOptional,0,
covOptional,covOptional,covOptional,covOptional)
//关闭所有的book,退出Excel
wbMyBook.Close(covOptional, COleVariant(""), covOptional)
wbsMyBooks.Close()
//m_ExcelApp.Quit()