C++COM 인터페이스 로 PPT 조작

10306 단어 C++COMPPT
배경 설명
VS 환경 에서 C++코드 조작 PPT 를 개발 하여 PPT 템 플 릿 수정 을 지원 합 니 다.텍스트 태그,도표,표 수정 을 포함 합 니 다.대부분의 소프트웨어 가 PPT 보고 서 를 만 드 는 요 구 를 만족 시 키 기 위해 먼저 손 으로 PPT 템 플 릿 을 만 들 고 프로그램 에서 템 플 릿 데 이 터 를 수정 합 니 다.
2.개발 환경 구축
VS 2012 의 Class Wizard 를 통 해 파워 포인트 와 엑셀 의 COM 인 터 페 이 스 를 만 듭 니 다.PPT 에 있 는 그래프 를 조작 해 야 하기 때문에 그래프 의 데 이 터 는 엑셀 로 저 장 된 것 이 고 그래프 를 수정 해 야 하 는 데 이 터 는 엑셀 의 COM 인 터 페 이 스 를 생 성 해 야 한다.
1.1 클래스 진입 마법사

1.2 파워 포인트 COM 인터페이스 추가


1.3 Excel COM 인터페이스 추가

모든 COM 인 터 페 이 스 를 선택 하여 인터페이스 파일 을 생 성 합 니 다.
3.PPT 파일 기본 작업 함수 정의(헤더 파일 요약)
3.1 PPT 응용 기초 대상 정의

class CPPTObject
{
public:
  CApplication m_PPTApp;
  CSlides m_Slides;
  CSlide m_curSlide;
  CPresentation m_Presentaion;
};
3.2 파워 포인트 소프트웨어 를 시작 하고 COM 인 터 페 이 스 를 호출 하려 면 Office 를 설치 해 야 한다.

//   PPT  ,  powerpoint  。
bool CPPTUtil::CreatePPTApplication()
{
  COleException exception;

  LPCSTR str = "Powerpoint.Application";
  if(!m_pPPTObject->m_PPTApp.CreateDispatch(str, &exception))
  {
    AfxMessageBox(exception.m_sc, MB_SETFOREGROUND);
    return false;
  }

  m_pPPTObject->m_PPTApp.put_Visible(true);
  return true;
}

3.3 PPT 템 플 릿 파일 을 엽 니 다.PPT 내용 을 수정 하기 전에 먼저 PPT 를 엽 니 다.

//     ppt。
bool CPPTUtil::OpenPPT(const std::string& pptPath)
{
  CPresentations presentations = m_pPPTObject->m_PPTApp.get_Presentations();
  m_pPPTObject->m_Presentaion = presentations.Open(CString(pptPath.c_str()), 0, 0, 1);

  m_pPPTObject->m_Slides = m_pPPTObject->m_Presentaion.get_Slides();

  return true;
}
3.4 PPT 파일 내용 을 저장 하고 파일 을 닫 으 며 PowerPoint 프로그램 을 종료 합 니 다.

//   PPT,      。
bool CPPTUtil::ClosePPT()
{
  m_pPPTObject->m_Presentaion.Save();
  m_pPPTObject->m_Presentaion.Close();
  m_pPPTObject->m_PPTApp.Quit();
  return true;
}
3.5 구체 적 인 PPT 슬라이드 를 선택 합 니 다.

//   PPT        。
bool CPPTUtil::SelectSlide(long slideIndex)
{
  if (slideIndex > m_pPPTObject->m_Slides.get_Count())
  {
    return false;
  }

  m_pPPTObject->m_curSlide = m_pPPTObject->m_Slides.Range(COleVariant(slideIndex));

  return true;
}

4.텍스트 편집 상자 함수 수정

//      
bool CPPTUtil::ModifyTextBox(const std::string& boxName, const std::string& strValue)
{
  CShapes shapes = m_pPPTObject->m_curSlide.get_Shapes();
  for(long i = 1; i <= shapes.get_Count(); ++i)
  {
    CShape shape(shapes.Item(COleVariant(i)));
    CString name = shape.get_Name();

    if(shape.get_Type() == (long)Office::msoTextBox
      && name.Compare(CString(boxName.c_str())) == 0) 
    {
      CTextFrame textFrame = shape.get_TextFrame();
      CTextRange textRange = textFrame.get_TextRange();
      CString txt = textRange.get_Text();

      textRange.put_Text(strValue.c_str());
    }
  }

  return true;
}

boxName 은 PPT 의 Shape Name 에 대응 합 니 다.이 Shape Name 은 PowerPoint 에서 볼 수 있 는 곳 도 없고 수정 할 방법 도 없 는 것 같 습 니 다.디 버 깅 할 때 만 기록 할 수 있 습 니 다.
5.PPT 의 도표 함 수 를 수정 합 니 다.먼저 PPT 에서 도표 템 플 릿 을 정의 하고 COM 인 터 페 이 스 를 통 해 도표 데 이 터 를 수정 합 니 다.
5.1 도표 데이터 구 조 를 정의 한다.도표 의 데 이 터 는 모두 엑셀 로 저장 되 어 있다.
5.1.1 셀 데이터 구 조 를 정의 합 니 다.

CCellDataCom::CCellDataCom(const CellValueType valueType, const std::string& strValue, 
      const int iRow, const int iCol)
{
  m_ValueType = valueType;
  m_strValue = strValue;

  m_strPos = indexToString(iRow, iCol);
}

//         
CellValueType CCellDataCom::getValueType()
{
  return m_ValueType;
}

//         
const std::string& CCellDataCom::getStringValue()
{
  return m_strValue;
}

//      
long CCellDataCom::getLongValue()
{
  return atol(m_strValue.c_str());
}

//        
double CCellDataCom::getDoubleValue()
{
  return atof(m_strValue.c_str());
}

//          
const std::string& CCellDataCom::getPos()
{
  return m_strPos;
}

//              
CString CCellDataCom::indexToString( int row, int col )  
{  
  CString strResult; 
  if( col > 26 )  
  {  
    strResult.Format(_T("%c%c%d"),'A' + (col-1)/26-1,'A' + (col-1)%26,row); 
  }  
  else  
  {  
  strResult.Format(_T("%c%d"), 'A' + (col-1)%26,row); 
  } 

  return strResult; 
}  

5.1.2   정의 도표 데이터 구조

//       
void CChartDataCom::insertRowData(const std::list<CCellDataCom>& lstRowData)
{
  m_lstValue.push_back(lstRowData);
}

//       
const std::list<std::list<CCellDataCom> >& CChartDataCom::getValue()const
{
  return m_lstValue;
}

5.2 도표 데이터 함수 수정

//     

bool CPPTUtil::ModifyChart(const std::string& chartName, const CChartDataCom& chartData)
{
  CShapes shapes = m_pPPTObject->m_curSlide.get_Shapes();
  for(long i = 1; i <= shapes.get_Count(); ++i)
  {
    CShape shape(shapes.Item(COleVariant(i)));
    if(shape.get_Type() != (long)Office::msoChart
      || chartName != std::string(shape.get_Name().GetBuffer()))
    {
      continue;
    }

    //       
    return ModifyChartData(shape.get_Chart(), chartData);
  }

  return false;
}

//       
bool CPPTUtil::ModifyChartData(CChart chart, const CChartDataCom& chartData)
{
  //        excel    ,     excel.
  CChartData chartDataModel = chart.get_ChartData();
  chartDataModel.Activate();

  CWorkbook workBook = chartDataModel.get_Workbook();
  CWorksheets sheets = workBook.get_Worksheets();
  if(sheets.get_Count() == 0)
  {
    return false;
  }

  //      sheet,            excel    sheet 。
  VARIANT vaSheetIndex;
  vaSheetIndex.vt = VT_I4;
  vaSheetIndex.lVal = 1;
  CWorksheet sheet = sheets.get_Item(vaSheetIndex);

  bool bRet = true;

  //           
  const std::list<std::list<CCellDataCom> >& lstValue = chartData.getValue();
  std::list<std::list<CCellDataCom> >::const_iterator iterAllData = lstValue.begin();
  for(; iterAllData != lstValue.end(); ++iterAllData)
  {
    std::list<CCellDataCom>::const_iterator iterRowData = iterAllData->begin();
    for(; iterRowData != iterAllData->end(); ++iterRowData)
    {
      bRet = ModifyCellData(sheet, *iterRowData);
      if(bRet == false)
      {
        break;
      }
    }

    if(bRet == false)
    {
      break;
    }
  }

  //   Excel
  CApplication0 app0 = workBook.get_Application();
  app0.Quit();
  Sleep(2000);

  return bRet;
}

//        
bool CPPTUtil::ModifyCellData(CWorksheet sheet, CCellDataCom cellData)
{
  const std::string& cellPos = cellData.getPos();
  CRange range = sheet.get_Range(COleVariant(cellPos.c_str()), COleVariant(cellPos.c_str()));

  COleVariant* pOleVar = NULL;
  if(cellData.getValueType() == CELL_STRING_TYPE)
  {
    pOleVar = new COleVariant(CString(cellData.getStringValue().c_str()));
  }
  else if(cellData.getValueType() == CELL_LONG_TYPE)
  {
    pOleVar = new COleVariant(cellData.getLongValue());
  }
  else if(cellData.getValueType() == CELL_DOUBLE_TYPE)
  {
    pOleVar = new COleVariant(cellData.getDoubleValue());
  }
  else
  {
    return false;
  }

  range.put_Value2(*pOleVar);
  delete pOleVar;

  return true;
}

6.여러 PPT 파일 함수 통합

//   PPT
bool CPPTUtil::MergePPT(const std::string& outputPPTPath, const std::list<std::string>& lstMergePPTPath)
{
  CApplication pptApp;
  COleException exception;

  //   PowerPoint  
  LPCSTR str = "Powerpoint.Application";
  if(!pptApp.CreateDispatch(str, &exception))
  {
    AfxMessageBox(exception.m_sc, MB_SETFOREGROUND);
    return false;
  }

  pptApp.put_Visible(true);

  //       
  CPresentations presentations = pptApp.get_Presentations();
  CPresentation outPresention = presentations.Open(CString(outputPPTPath.c_str()), 0, 0, 1);

  //           PPT  
  std::list<std::string>::const_iterator iterMergeFile = lstMergePPTPath.begin();
  for(; iterMergeFile != lstMergePPTPath.end(); ++iterMergeFile)
  {
    CPresentation mergePresention = presentations.Open(CString(iterMergeFile->c_str()), 0, 0, 1);
    CSlides mergeSlides = mergePresention.get_Slides();
    int pageNum = mergeSlides.get_Count();
    mergePresention.Close();

    //   PPT  
    CSlides outSlides = outPresention.get_Slides();
    outSlides.InsertFromFile(CString(iterMergeFile->c_str()), outSlides.get_Count(), 1, pageNum);
  }

  outPresention.Save();
  outPresention.Close();
  pptApp.Quit();

  return true;
}

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기