我實現了一些較爲簡單的功能:比如輸出文本信息,將其格式化,輸出表格數據,以及繪畫柱狀圖的功能
ToWord.h
#pragma once
#include "CApplication.h"
#include "CDocument0.h"
#include "CDocuments.h"
#include "CSelection.h"
#include "CFont0.h"
#include "CParagraph.h"
#include "CParagraphs.h"
#include "CTable0.h"
#include "CTables0.h"
#include "CRange.h"
#include "CCell.h"
#include "CCells.h"
#include "CnlineShape.h"
#include "CnlineShapes.h"
#include "COLEFormat.h"
#include "ToExcel.h"
class CToWord
{
public:
// 無參數構造函數,文件生成在Debug文件夾下Demo.docx
CToWord();
// 有參數構造函數,傳入完整的生成地址
CToWord(CString);
~CToWord();
private:
// Word部分
CApplication Application;
CDocuments Documents;
CDocument0 Document;
CSelection Selection;
CFont0 Font;
CParagraphs Paragraphs;
CParagraph Paragraph;
CTables0 Tables;
CTable0 Table;
CRange Range;
CCells Cells;
CCell Cell;
CnlineShape Shape;
CnlineShapes Shapes;
COLEFormat OLEFormat;
CToExcel *ToExcel;
public:
// 初始化
void Create(void);
private:
BOOL m_bIsVisible;
public:
// 輸出文本
void OutText(CString);
// 換行
void NewLine(void);
// 開闢新的一行並將光標置於新行的最前面
void MoveNewLine(void);
// 向右移動光標
void MoveRight(void);
// 移到到表格 頭 尾
void MoveHome(void);
void MoveEnd(void);
void EndOf(void);
// 向下移動
void MoveDown(void);
// void MoveLeft(void);
public:
// 生成表格 row行,columns列
void OutTables(int row, int columns);
public:
// 樣式:0爲正文,1.2.3分別爲標題1.2.3
void PutStyle(int);
// 0爲居左,1爲居中,2爲居右
void PutAlignment(long);
public:
// 字體大小
void PutFontSize(float);
// 下劃線:從右數第i個字符到第i+n個字符下加下劃線
void PutUnderLine(int i, int n);
public:
// 生成圖表 柱狀圖 = 51. 餅圖 = 5
CToExcel* OutShapes(int);
private:
CString SavePoistion;
public:
// 另存爲
void SaveAs(void);
// 得到當前根目錄
CString GetModuleDir(void);
};
ToWord.cpp
#include "stdafx.h"
#include "ToWord.h"
#include <windows.h>
CToWord::CToWord()
{
SavePoistion = GetModuleDir();
SavePoistion += L"\\Demo.doc";
}
CToWord::CToWord(CString poistion)
{
SavePoistion = poistion;
}
CToWord::~CToWord()
{
Application.put_ScreenUpdating(true);
delete(ToExcel);
Application.Quit(COleVariant((short)0),
COleVariant((short)0),
COleVariant((short)0));
SaveAs();
Application.ReleaseDispatch();
Documents.ReleaseDispatch();
Document.ReleaseDispatch();
Selection.ReleaseDispatch();
Font.ReleaseDispatch();
Paragraphs.ReleaseDispatch();
Paragraph.ReleaseDispatch();
Tables.ReleaseDispatch();
Table.ReleaseDispatch();
Range.ReleaseDispatch();
Cells.ReleaseDispatch();
Cell.ReleaseDispatch();
Shape.ReleaseDispatch();
Shapes.ReleaseDispatch();
OLEFormat.ReleaseDispatch();
}
void CToWord::Create(void)
{
if (!AfxOleInit())
{
AfxMessageBox(_T("初始化OLE出錯"));
return;
}
if (!Application.CreateDispatch(_T("Word.Application")))//啓動WORD
{
AfxMessageBox(_T("無法找到Office?"));
return;
}
// Documents
Documents = Application.get_Documents();
if (!Documents.m_lpDispatch)
{
AfxMessageBox(_T("Documents創建失敗!"), MB_OK | MB_ICONWARNING);
return;
}
CComVariant Template(_T(""));
CComVariant NewTemplate(false), DocumentType(0), Visible;
Documents.Add(&Template, &NewTemplate, &DocumentType, &Visible);
// Document
Document = Application.get_ActiveDocument();
if (!Document.m_lpDispatch)
{
AfxMessageBox(_T("Document獲取失敗!"), MB_OK | MB_ICONWARNING);
return;
}
// Selection
Selection = Application.get_Selection();
if (!Selection.m_lpDispatch)
{
AfxMessageBox(_T("Select獲取失敗!"), MB_OK | MB_ICONWARNING);
return;
}
// Paragraphs
Paragraphs = Selection.get_ParagraphFormat();
if (!Paragraphs.m_lpDispatch)
{
AfxMessageBox(_T("Paragraphs獲取失敗!"), MB_OK | MB_ICONWARNING);
return;
}
// Font
Font = Selection.get_Font();
if (!Font.m_lpDispatch)
{
AfxMessageBox(_T("Font獲取失敗!"), MB_OK | MB_ICONWARNING);
return;
}
// Tables
Tables = Document.get_Tables();
if (!Tables.m_lpDispatch)
{
AfxMessageBox(_T("Tables獲取失敗!"), MB_OK | MB_ICONWARNING);
return;
}
// Range
Range = Selection.get_Range();
if (!Range.m_lpDispatch)
{
AfxMessageBox(_T("Range獲取失敗!"), MB_OK | MB_ICONWARNING);
return;
}
Shapes = Selection.get_InlineShapes();
if (!Shapes.m_lpDispatch)
{
AfxMessageBox(_T("Shapes獲取失敗!"), MB_OK | MB_ICONWARNING);
return;
}
Application.put_Visible(true);
}
void CToWord::OutText(CString text)
{
Selection.TypeText(text);
}
void CToWord::NewLine(void)
{
Selection.TypeParagraph();
}
void CToWord::MoveNewLine(void)
{
Selection.MoveRight(COleVariant((short)12), COleVariant((short)1), COleVariant((short)0));
}
void CToWord::MoveRight(void)
{
Selection.MoveRight(COleVariant((short)1), COleVariant((short)1), COleVariant((short)0));
}
void CToWord::MoveHome(void)
{
Selection.HomeKey(COleVariant((short)10), COleVariant((short)0));
}
void CToWord::MoveEnd(void)
{
Selection.EndKey(COleVariant((short)5), COleVariant((short)0));
}
void CToWord::EndOf(void)
{
Selection.EndOf(COleVariant((short)5), COleVariant((short)0));
}
void CToWord::MoveDown(void)
{
Selection.MoveDown(COleVariant((short)7), COleVariant((short)1), COleVariant((short)0));
}
void CToWord::OutTables(int row, int columns)
{
Range.SetRange(Selection.get_End(), Selection.get_End());
Tables.Add(Range, row, columns, COleVariant((short)1), COleVariant((short)0));
}
void CToWord::PutStyle(int istyle)
{
CString style;
switch (istyle)
{
case 0:
style = L"正文"; break;
case 1:
style = L"標題 1"; break;
case 2:
style = L"標題 2"; break;
case 3:
style = L"標題 3"; break;
default:
style = L"正文"; break;
}
CComVariant Cstyle(style);
Selection.put_Style(&Cstyle);
}
void CToWord::PutAlignment(long index)
{
Paragraphs.put_Alignment(index);
}
void CToWord::PutFontSize(float size)
{
Font.put_Size(size);
}
void CToWord::PutUnderLine(int i, int n)
{
Selection.MoveLeft(COleVariant((long)1), COleVariant((long)i), COleVariant((long)0));
Selection.MoveLeft(COleVariant((long)1), COleVariant((long)n), COleVariant((long)1));
Font.put_UnderlineColor(1);
Font.put_Underline(1);
}
CToExcel* CToWord::OutShapes(int Choice)
{
COleVariant VarOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR); // 默認值
Range.SetRange(Selection.get_End(), Selection.get_End()+1000);
CComVariant r(Range);
Shape = Shapes.AddOLEObject(COleVariant(L"Excel.Chart"), VarOpt, VarOpt, VarOpt, VarOpt, VarOpt, VarOpt, &r);
OLEFormat = Shape.get_OLEFormat();
LPDISPATCH object;
CWorkbook workbook = OLEFormat.get_Object();
CWorkbook *pbook = &workbook;
ToExcel = new CToExcel(pbook);
ToExcel->PutClassType(Choice);
return ToExcel;
}
void CToWord::SaveAs(void)
{
// SavePoistion = "D:\\demo.doc";
Document.SaveAs(COleVariant(SavePoistion), //FileName
COleVariant((short)1), //FileFormat
COleVariant((short)FALSE), //LockComments
COleVariant(_T("")), //Password;
COleVariant((short)FALSE), //AddToRecentFiles
COleVariant(_T("")), //WritePassword
COleVariant((short)FALSE), //ReadOnlyRecommended
COleVariant((short)FALSE), //EmbedTrueTypeFonts
COleVariant((short)FALSE), //SaveNativePictureFormat
COleVariant((short)FALSE), //SaveFormsData
COleVariant((short)FALSE), //SaveAsAOCELetter
COleVariant((short)0), //Encoding
COleVariant((short)FALSE), //InsertLineBreaks
COleVariant((short)FALSE), //AllowSubstutitions,
COleVariant((short)0), //LineEnding
COleVariant((short)0) //AddBiDiMarks
);
}
CString CToWord::GetModuleDir(void)
{
HMODULE module = GetModuleHandle(0);
WCHAR pFileName[MAX_PATH];
GetModuleFileName(module, pFileName, MAX_PATH);
CString csFullPath(pFileName);
int nPos = csFullPath.ReverseFind(_T('\\'));
if (nPos < 0)
return CString("");
else
return csFullPath.Left(nPos);
}
如果需要在Word中添加圖表,則需要導入支持Excel的頭文件
ToExcelChart.h
#pragma once
// Excel頭文件
#include "CChartObjects.h"
#include "CCharts.h"
#include "CWorkbook.h"
#include "CWorksheets.h"
#include "CWorksheet.h"
#include "CRange0.h"
#include "CChartTitle.h"
#include "CChart.h"
#include "CAxisTitle.h"
#include "CAxis.h"
#include "CChartArea.h"
#include <vector>
using namespace std;
class CToExcel
{
private:
// Excel部分
CChartObjects ChartObjects;
CCharts Charts;
CWorkbook Workbook;
CWorksheets Worksheets;
CWorksheet Worksheet;
CRange0 Range;
CChartTitle ChartTitle;
CChart Chart;
CAxisTitle AxisTitle;
CAxis Axis;
CChartArea ChartArea;
public:
CToExcel();
CToExcel(CWorkbook*&);
~CToExcel();
private:
// 列數
int m_iColNumber;
public:
// 設置圖表類型 1 = 柱狀圖 , 2 = 折線圖, 3 = 餅狀圖
void PutClassType(int);
// 設置圖表標題
void PutTitle(CString Title = L"Title");
// 設置縱座標標題
void PutVerticalTitle(CString Title = L"Vertical coordinate title");
// 行座標軸
void PutHorizontalData(vector<CString>);
// 列座標軸
void PutVerticalData(vector<CString>);
// 數據
void PutData(vector<double>);
private:
// 將第row行第col列 轉換爲 A1 B1 這樣的形式
CString Transform(int row = 1, int col = 1);
};
ToExcelChart.cpp
#include "stdafx.h"
#include "ToExcel.h"
CToExcel::CToExcel()
{
}
CToExcel::CToExcel(CWorkbook*& Workbook)
{
this->Workbook = *Workbook;
Worksheets = this->Workbook.get_Sheets();
if (!Worksheets.m_lpDispatch)
{
AfxMessageBox(_T("Worksheets獲取失敗!"), MB_OK | MB_ICONWARNING);
return;
}
Worksheet = Worksheets.get_Item(COleVariant((long)2));
// 清空原有的數據
Range = Worksheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("D7")));
Range.Clear();
Charts = this->Workbook.get_Charts();
Chart = Charts.get_Item(COleVariant((long)1));
m_iColNumber = 0;
}
CToExcel::~CToExcel()
{
ChartObjects.ReleaseDispatch();
Charts.ReleaseDispatch();
Range.ReleaseDispatch();
ChartTitle.ReleaseDispatch();
Chart.ReleaseDispatch();
AxisTitle.ReleaseDispatch();
Axis.ReleaseDispatch();
ChartArea.ReleaseDispatch();
Workbook.ReleaseDispatch();
Worksheets.ReleaseDispatch();
Worksheet.ReleaseDispatch();
delete Workbook;
}
void CToExcel::PutClassType(int choice)
{
switch (choice)
{
case 2:
Chart.put_ChartType(4); break;
case 3:
Chart.put_ChartType(5); break;
default:
break;
}
}
void CToExcel::PutTitle(CString Title)
{
Chart.put_HasTitle(TRUE);
ChartTitle = Chart.get_ChartTitle();
ChartTitle.put_Text(Title);
}
void CToExcel::PutVerticalTitle(CString Title)
{
Chart.SetElement(310);
Axis = Chart.Axes(COleVariant((long)2), 1);
AxisTitle = Axis.get_AxisTitle();
AxisTitle.put_Text(Title);
}
void CToExcel::PutHorizontalData(vector<CString> Datavector)
{
COleVariant VarOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
m_iColNumber = Datavector.size();
Range = this->Worksheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("D7")));
for (int index = 0; index < Datavector.size(); index++)
{
Range = Worksheet.get_Range(COleVariant(Transform(1,index+2)), VarOpt);
Range.put_Value2(COleVariant(Datavector[index]));
}
}
void CToExcel::PutVerticalData(vector<CString> Datavector)
{
COleVariant VarOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
for (int index = 0; index < Datavector.size(); index++)
{
Range = Worksheet.get_Range(COleVariant(Transform(index+2, 1)), VarOpt);
Range.put_Value2(COleVariant(Datavector[index]));
}
}
void CToExcel::PutData(vector<double> Datavector)
{
COleVariant VarOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
int num = 0;
for (int index1 = 0; ; index1++)
{
for (int index2 = 0;; index2++)
{
Range = Worksheet.get_Range(COleVariant(Transform(index1+2, index2+2)), VarOpt);
Range.put_Value2(COleVariant(Datavector[num]));
num++;
if ((num) % m_iColNumber == 0)
{
break;
}
}
if (num >= Datavector.size())
{
break;
}
}
}
CString CToExcel::Transform(int row, int col)
{
CString result;
switch (col)
{
case 1:result = "A"; break;
case 2:result = "B"; break;
case 3:result = "C"; break;
case 4:result = "D"; break;
case 5:result = "E"; break;
case 6:result = "F"; break;
case 7:result = "G"; break;
case 8:result = "H"; break;
case 9:result = "I"; break;
case 10:result = "J"; break;
case 11:result = "K"; break;
case 12:result = "L"; break;
case 13:result = "M"; break;
case 14:result = "N"; break;
case 15:result = "O"; break;
case 16:result = "P"; break;
case 17:result = "Q"; break;
case 18:result = "R"; break;
case 19:result = "S"; break;
case 20:result = "T"; break;
case 21:result = "result"; break;
case 22:result = "V"; break;
case 23:result = "W"; break;
case 24:result = "X"; break;
case 25:result = "Y"; break;
case 26:result = "Z"; break;
defaresultlt:break;
}
CString cs;
cs.Format(_T("%d"), row);
result = result + cs;
return result;
}