最近在做一个读取Excel的功能,之前也做过相关的,但总是零零闪闪的,趁着正在劲头上,归纳一下:
利用Automation添加相关的类,在Excel2010中可以在安装文件夹下直接点击Excel.exe 会生成很多类,建议只导入需要用到的类,不然会很卡。
用到的类和变量说明:CApplication m_ExlApp;//应用程序类,对应每一个Excel应用程序
CWorkbook wbk;//工作簿
CWorkbooks wbks;//对应每个Exel文档
CWorksheets whts ,m_Wheet;//对应每个文档的每一个sheet表
CRange range;//单元格范围,运用最广泛,获取单元格范围
ColeVarinat var;//读取每个零时变量
- 加载程序:if(!m_ExlApp.CreateDispatch("Excel.Application"))
{
AfxMessageBox("无法启动Excel服务器!");
return;
} - 连接工作簿、工作表等 COleVariant avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
m_ExlApp.put_Visible(TRUE);//使Excel可见
m_ExlApp.put_UserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝.
wbks.AttachDispatch(m_ExlApp.get_Workbooks());
wbk =wbks.Open(m_StrExcelPath,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
whts = wbk.get_Sheets();
m_Wheet = whts.get_Item(_variant_t((short)1));
range.AttachDispatch(m_Wheet.get_UsedRange()); - 获得行高、列宽 Var = RangRow.get_RowHeight();
CString strHeight;
strHeight.Format(CString((LPCSTR)(_bstr_t)(_variant_t)Var));
float fHeight = _tstof(strHeight)*9600/7200; //转换为像素 列宽同理 - 获取单元格批注 CComment com;//批注类
com = range.get_Comment();
CString strCom = _T("");
strCom = com.Text(vtMissing,vtMissing,vtMissing); - 获取单元格是否含有边框线 CRange RCellBorder;
CBorders BCellBorders;
CBorder BCellBorder;
COleVariant varBorderInfo;
RCellBorder.AttachDispatch(m_Wheet.get_Cells());
RCellBorder.AttachDispatch(RCellBorder.get_Item(COleVariant(nRow),COleVariant(nCol)).pdispVal);
BCellBorders = RCellBorder.get_Borders();
for (long i = 7;i < 11;i++)
{//Left:7 Top:8 Bottom:9 Right 10
BCellBorder = BCellBorders.get_Item(i);
varBorderInfo = BCellBorder.get_LineStyle();
if (-4142 != varBorderInfo.lVal)
{//说明含有边界值,具体的可以自己查看
}
}//从左到右依次判断,并给报表的对应单元格赋值 - 获取单元格所含公式 CRange RFormula;
COleVariant varFormula;
CString strFormula = _T("");
RFormula.AttachDispatch(m_Wheet.get_Cells());
RFormula.AttachDispatch(RFormula.get_Item(COleVariant(nRow),COleVariant(nCol)).pdispVal);
varFormula = RFormula.get_Formula();
strFormula = varFormula.bstrVal;
if (0 != strFormula.CompareNoCase(""))
{
}
RFormula.ReleaseDispatch(); - 获取字体信息 LOGFONT *pLogFont = NULL; 字体信息存放在这个指针中
CFont0 fTextFont;
CRange RTextFont;
COleVariant varFontInfo;
RTextFont.AttachDispatch(m_Wheet.get_Cells());
RTextFont.AttachDispatch(RTextFont.get_Item(COleVariant(nRow),COleVariant(nCol)).pdispVal);
fTextFont = RTextFont.get_Font();
pCell = (CGridCell*)m_npGridCtrl->GetCell(nRow,nCol);//获取原有单元格的字体
pLogFont = pCell->GetFont();
//字体名称
varFontInfo = fTextFont.get_Name();
CString strFontName(varFontInfo.bstrVal);
strcpy(pLogFont->lfFaceName,strFontName);
//字体高度
varFontInfo = fTextFont.get_Size();
double dHeight = abs(varFontInfo.dblVal * 96/72);
pLogFont->lfHeight = long(dHeight);
//加粗
varFontInfo = fTextFont.get_Bold();
if (varFontInfo.boolVal)
{
pLogFont->lfWeight = 700;
}
//斜体
varFontInfo = fTextFont.get_Italic();
if (varFontInfo.boolVal)
{
pLogFont->lfItalic = TRUE;
}
//下划线 读出单下滑线与多下划线
varFontInfo = fTextFont.get_Underline();
long lUnderLine = varFontInfo.lVal;
if (-4119 == lUnderLine || 2 == lUnderLine)
{
pLogFont->lfUnderline = TRUE;
}
//第一次写这样的博客,记录学习笔记,成为优秀的程序员,终有一天,我要站在巨人的肩上!