【OFFICE自动化】如何用VC6.0绘制Excel和Word

① 绘制Excel

1. 大二下学期的时候,由于算法的运行时间要用Excel画折线图,不想一个一个复制就找怎样直接把时间绘制在Excel表格里面的某些位置的方法。

2. 当时找到的方法是用.csv后缀名的文件进行输入输出流,然后用逗号隔开即可。方便了算法时间记录的工作。


第一个文件 Excel.h

#ifndef EXCEL_H
#define EXCEL_H
class Excel{
private:
	double D[90000];
public:
	Excel();
	bool put(double a,int r,int c);
	void display();
	void CreateExcel();
};

#endif

第二个文件 Excel.cpp

#include
#include "Excel.h"
#include
#include
using namespace std;
Excel::Excel(){
	memset(D,0,sizeof(D));
}
bool Excel::put(double a,int r,int c){
	if(D[r*300+c]==0){
		D[r*300+c]=a;
		return true;
	}
	else{
		return false;
	}
}
void Excel::display(){
	int i=-1,j;
	for(;++i<300;){
		for(j=-1;++j<299;){
			cout<

调用put函数来将double值放在表格第几行第几列。

放完以后调用CreateExcel();来创建csv文件。


② 绘制Word文档

最近研究的,需要用到MFC。

====================================================================================

1.  首先打开VC6.0 新建:

【OFFICE自动化】如何用VC6.0绘制Excel和Word_第1张图片

====================================================================================

2. 选择最后一个

【OFFICE自动化】如何用VC6.0绘制Excel和Word_第2张图片

====================================================================================

3. 打开后找到ReadWord.cpp双击然后编译链接运行一次

【OFFICE自动化】如何用VC6.0绘制Excel和Word_第3张图片

====================================================================================

4. 添加MSWORD类

1. CTRL+W打开MFC ClassWizard界面。

2. 在你的C盘或D盘(OFFICE安装路径所在的盘)搜索MSWORD.OLB,找到路径方便些

3. 打开右边的Add Class下拉菜单,选择From a type library...

4, 直接把路径黏贴上去打开。

【OFFICE自动化】如何用VC6.0绘制Excel和Word_第4张图片

====================================================================================

5. 在打开的窗口中添加以下类,可以用CTRL键来多选。

_Application
Documents
_Documents
Range
_Font
Table
Cell
Tables
Cells
Borders
Border
Selection

当然你也可以全部添加。只是接下来给的例子只用到这些而已。

【OFFICE自动化】如何用VC6.0绘制Excel和Word_第5张图片

====================================================================================

6. 然后把以下代码覆盖ReadWord.cpp

// 4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
//#include "console_word.h"
#include "msword.h"
#include
#include
#include
#include
#pragma   warning (disable: 4786)
#include
using namespace std;

const int WIDTH = 400;//表格的宽度
const char p[] = "D:\\1234.txt";//代码的位置
const char e[] = "D:\\doc1.doc";//生成的word文档的位置

/**
 * 产生一个代码表格
 */
void CreateTable(Range& range , Tables& ts , Table& t, int width, int height, COleVariant& vOpt,vector& v);
/**
 * 将int转成string类型
 */
string IntToString(int index);
/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;
	 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        printf(_T("Fatal Error: MFC initialization failed!\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO: code your application's behavior here.
        if  (!SUCCEEDED(CoInitialize(NULL)))
        {
            AfxMessageBox("初始化COM支持库失败!");
            return  -1;
        }
		COleVariant vTrue((short)TRUE) , vFalse((short)FALSE) , vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
		_Application oWordApp;
		if(!oWordApp.CreateDispatch("Word.Application",NULL)){
			AfxMessageBox("CreateDispatch failed.",MB_OK | MB_SETFOREGROUND);
			return nRetCode;
		}
		//从这里开始正文
		//① 从txt文件中读取出代码
		ifstream fin(p);//文件输入流
		string temp;//string
		vector v;//无限长度的集合
		/**
		 * 1. 从txt文件中读取一行
		 * 2. 将这一行放入集合中
		 */
		while(getline(fin,temp,'\n'))
		{
			v.push_back(temp);
		}
		fin.close();//关闭输入流

		//② 开始操作Word文件
		Documents oDocs;//读Word文档
		_Document oDoc;//写Word文档
		oDocs = oWordApp.GetDocuments();//打开Word文档
		oDoc = oDocs.Add(vOpt,vOpt,vOpt,vOpt);
		Range range = oDoc.GetContent();//Range范围,指定范围是整个Word文档
		Tables tables = oDoc.GetTables();//Tables表格(s)

		Table table;//Table表格,单个表格
		CreateTable(range,tables,table,v.size(),2,vOpt,v);//创建一个 txt文件行数 x 2列 的表格
		
		
		//将表格的边框设为可见
		//Borders borders = table.GetBorders();
		//borders.SetEnable(1);


		
//		Cells cells = range.GetCells();
//		cells.SetVerticalAlignment(1);
//		cells.SetWidth(60);
//		Cell cell = table.Cell(2,1);
//		cout<<(long)table.GetRows()<& v){
	_Font font;//字体类
	/**
	 * 1. 从Tables表格(s)里面创建一个表格赋给Table表格。
	 * 2. Tables一个表格集合,Table单指其中一个表格。
	 */
	t = ts.Add(range,width,height,vOpt,vOpt);
	Cell cell = t.Cell(1,1);//取该表格中的第一行第一列。Cell表示表格中的一格子。
	cell.Merge(t.Cell(1,2));//第一行第一列的格子 和 第一行第二列的格子 合并
	cell.SetWidth(WIDTH);//设置第一行的格子长度为 WIDTH
	range = cell.GetRange();//将操作范围Range指定在该格子里面。
	font = range.GetFont();//获取当前范围Range里面的字体
	font.SetSize(12);//设置字体为12
	font.SetBold(1);//设置粗体
	range.SetFont(font);//将该范围Range的字体设置为font
	range.SetText(v[0].c_str());//该范围Range写上文本
	int i = 1;
	int indexwidth = WIDTH/20 , wordwidth = WIDTH-WIDTH/20;//indexwidth表示第一行的宽度,wordwidth表示第二行的宽度
	for(;++i<=width;){//从第二行开始逐行读取
		/**
		 * 1. 读取当前行的第一列
		 */
		cell = t.Cell(i,1);//获取当前行第一列的格子
		cell.SetWidth(indexwidth);//设置该格子宽度为indexwidth
		range = cell.GetRange();//将操作范围设在该格子里面
		range.SetBold(1);//设置当前格子为粗体
		font = range.GetFont();//获取当前格子的字体
		font.SetColor(0x00808080);//A、B、G、A 设置该格子字体颜色,0x A: 00  B: 80 G: 80 R: 80
		range.SetFont(font);//设置当前格子的字体为font
		range.SetText(IntToString(i-1).c_str());//该格子写上文本

		/**
		 * 1. 读取当前行的第二列
		 */
		cell = t.Cell(i,2);//获取当前行第二列的格子
		cell.SetWidth(wordwidth);//设置该格子宽度为wordwidth
		range = cell.GetRange();//获取当前格子的范围
		range.SetBold(1);//设置粗体
		range.SetFitTextWidth(11);//设置字体大小
		range.SetText(v[i-1].c_str());//写入文本
	}
}

====================================================================================

这样就大致完成了。该例子是把这样子的函数代码:

【OFFICE自动化】如何用VC6.0绘制Excel和Word_第6张图片

生成这样的Word文档表格

【OFFICE自动化】如何用VC6.0绘制Excel和Word_第7张图片

注意修改代码中的路径char[] p 和 e。

本例子和读取Word文档的例子可以在这里下载:

http://download.csdn.net/detail/u013580497/9150433


你可能感兴趣的:(C语言,读取,写,Word,Excel,VC)