|
|
#include "StdAfx.h"
|
|
|
#include "ExcelMgr.h"
|
|
|
#include "MsgBox.h"
|
|
|
#include "LogMgr.h"
|
|
|
|
|
|
//一般安装完WPS2019 就可以使用
|
|
|
CExcelMgr::CExcelMgr(void)
|
|
|
{
|
|
|
}
|
|
|
CExcelMgr::~CExcelMgr(void)
|
|
|
{
|
|
|
m_bCreateOk = false;//是否成功创建了Excel 文件
|
|
|
}
|
|
|
bool CExcelMgr::CreatExcelFile()
|
|
|
{
|
|
|
/* COleVariant类为VARIANT数据类型的包装,
|
|
|
在自动化程序中,通常都使用ARIANT数据类型进行参数传递。
|
|
|
故下列程序中,函数参数都是通过COleVariant类来转换了的。
|
|
|
*/
|
|
|
//covOptional 可选参数的VARIANT类型
|
|
|
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
|
|
|
|
|
|
if(!m_app.CreateDispatch("Excel.Application") )
|
|
|
{
|
|
|
//有时候安装了WPS 这里还是会报错,可以忽略掉继续运行
|
|
|
CMsgBox MsgBox;
|
|
|
MsgBox.Show("无法创建Excellent应用,可能需要重新安装Excel!");//
|
|
|
return false;
|
|
|
}
|
|
|
//获取工作薄集合
|
|
|
m_books=m_app.GetWorkbooks();
|
|
|
//添加一个工作薄
|
|
|
m_book=m_books.Add(covOptional);
|
|
|
//获取工作表集合
|
|
|
m_sheets=m_book.GetSheets();
|
|
|
//获取第一个工作表
|
|
|
m_sheet=m_sheets.GetItem(COleVariant((short)1));
|
|
|
|
|
|
m_bCreateOk = true;//是否成功创建了Excel 文件
|
|
|
return m_bCreateOk;
|
|
|
}
|
|
|
//显示Excel 表格
|
|
|
void CExcelMgr::ShowExcelFile()
|
|
|
{
|
|
|
if(!m_bCreateOk)
|
|
|
return;
|
|
|
//显示Excel表格,并设置状态为用户可控制
|
|
|
m_app.SetVisible(TRUE);
|
|
|
m_app.SetUserControl(TRUE);
|
|
|
}
|
|
|
//获取单元格的索引(比如A1,D4等)
|
|
|
CString CExcelMgr::GetCellIdxStr(int Row,int Col)
|
|
|
{
|
|
|
Col -= 1;
|
|
|
CString IdxStr;
|
|
|
int num = 65;// A的Unicode码
|
|
|
CString colName = "";
|
|
|
do
|
|
|
{
|
|
|
if(colName.GetLength() > 0)
|
|
|
{
|
|
|
Col--;
|
|
|
}
|
|
|
int remainder = Col % 26;
|
|
|
colName = ((char) (remainder + num)) + colName;
|
|
|
Col = (int) ((Col - remainder) / 26);
|
|
|
} while (Col > 0);
|
|
|
|
|
|
IdxStr.Format(_T("%d"),Row);
|
|
|
IdxStr = colName+IdxStr;
|
|
|
//gLogMgr->WriteDebugLog(IdxStr);
|
|
|
return IdxStr;
|
|
|
}
|
|
|
//设置单元格的文本(第Row 行第Col 列)(bBold 是否粗体)
|
|
|
void CExcelMgr::SetCellTxt(int Row,int Col,CString txt,bool bBold)
|
|
|
{
|
|
|
if(!m_bCreateOk)
|
|
|
return;
|
|
|
|
|
|
Range range; //单元格区域对象
|
|
|
MyFont font;
|
|
|
Range cols;
|
|
|
//选择工作表中第Row行第Col列的单元格
|
|
|
CString IdxStr = GetCellIdxStr(Row,Col);
|
|
|
range=m_sheet.GetRange(COleVariant(IdxStr),COleVariant(IdxStr));
|
|
|
|
|
|
//设置A1="HELLO EXCEL"
|
|
|
range.SetValue2(COleVariant(txt)); //range.SetValue()必为range.SetValue2()
|
|
|
|
|
|
//调整格式,设置粗体
|
|
|
if(bBold)
|
|
|
{
|
|
|
font=range.GetFont();
|
|
|
font.SetBold(COleVariant((short)TRUE));
|
|
|
}
|
|
|
//选择A:A列,设置宽度为自动适应
|
|
|
cols=range.GetEntireColumn();
|
|
|
cols.AutoFit();
|
|
|
}
|
|
|
//插入一张图片(Row1,Col1,Row2,Col2 指定图片的显示范围)FilePath 是图片的文件路径
|
|
|
void CExcelMgr::InsertPicture(int Row1,int Col1,int Row2,int Col2,CString FilePath)
|
|
|
{
|
|
|
//从Sheet对象上获得一个Shapes
|
|
|
Range range; //单元格区域对象
|
|
|
Shapes shapes=m_sheet.GetShapes();
|
|
|
//获得Range对象,用来插入图片
|
|
|
range=m_sheet.GetRange(COleVariant(GetCellIdxStr(Row1,Col1)),COleVariant(GetCellIdxStr(Row2,Col2)));//这里控制图片的尺寸
|
|
|
//从本地添加一个图片
|
|
|
shapes.AddPicture(FilePath,false,true,(float)range.GetLeft().dblVal,(float)range.GetTop().dblVal,(float)range.GetWidth().dblVal,(float)range.GetHeight().dblVal);
|
|
|
//设置宽高
|
|
|
ShapeRange sRange=shapes.GetRange(_variant_t(long(1)));
|
|
|
sRange.SetHeight(float(400));
|
|
|
sRange.SetWidth(float(550));
|
|
|
} |