【C++簡單寫Word】(三) 基本操作的實現

我實現了一些較爲簡單的功能:比如輸出文本信息,將其格式化,輸出表格數據,以及繪畫柱狀圖的功能

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章