Генератор писем по шаблону(Word+Excel))
Для начала работы надо задать Файл БД(Эксель) и файл шаблона (Word) а потом нажать старт=))
Надеюсь кому-нить поможет и пригодится.
Цитата:
Originally posted by moonmike
Пришлось тут написать програмку, которая по данным из Excel'евского файла генерит кучу однотипных Вордовских документов...
Пришлось тут написать програмку, которая по данным из Excel'евского файла генерит кучу однотипных Вордовских документов...
Спасибо автору за его нелегкий труд - просто и хорошо!
Сам скачал и воспользовался его кодом.
Однако на форуме замечал у некоторых проблемы с запуском в 6-м Билдере.
С позволения автора хочу добавить.
Для успешной компиляции в 6-м мне пришлось изменить(добавить) несколько строк:
в заголовках
.cpp
#pragma link "Word_2K_SRVR"
.h
#include[list=1]
#include "Word_2K_SRVR.h"
#include[list=1]
Также в коде стоит изменить тип переменной - имя файла:
WD.OlePropertyGet("Documents").OleProcedure("Open",StringToOleStr(OpenDialog1->FileName));
Не сочтите за умничество :))
Я вообще пока не понимаю как это работает , но вроде идет.
C++Builder 6
"Word_2K_SRVR"- для 2000
"Word_97_SRVR"- для 97
Еще раз извиняюсь и прикрепляю файл
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "ComObj.hpp"
#include "utilcls.h"
#include <word_2k.h>
#pragma link "Word_2K_SRVR"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Variant XL, WD, WDoc, WS;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
List = new TStringList();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
try
{
WD = Variant::GetActiveObject("Word.Application");
}
catch(...)
{
WD = Variant::CreateObject("Word.Application");
}
WD.OlePropertySet("Visible", True);
WD.OlePropertyGet("Documents").OleProcedure("Open" ,StringToOleStr(OpenDialog1->FileName));
WDoc = WD.OlePropertyGet("ActiveDocument");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender)
{
if(OpenDialog2->Execute())
{
List->Clear();
if(!XL.IsNull())
{
XL.Clear();
}
try
{
XL = Variant::GetActiveObject("Excel.Application");
}
catch(...)
{
XL = Variant::CreateObject("Excel.Application");
}
XL.OlePropertySet("Visible", True);
XL.OlePropertyGet("Workbooks").OleProcedure("Open" ,StringToOleStr(OpenDialog2->FileName));
WS = XL.OlePropertyGet("ActiveWorkbook").OlePropertyGet("WorkSheets",1);
int Count = 1;
AnsiString It = WS.OlePropertyGet("Cells",1,Count).OlePropertyGet("Value");
while(It != "")
{
List->Add((AnsiString)WS.OlePropertyGet("Cells",1,Count).OlePropertyGet("Value"));
Count++;
It = WS.OlePropertyGet("Cells",1,Count).OlePropertyGet("Value");
}
XLRowCount = 2;
XLPos = 2;
It = WS.OlePropertyGet("Cells",XLRowCount,1).OlePropertyGet("Value");
while(It != "")
{
XLRowCount++;
It = WS.OlePropertyGet("Cells",XLRowCount,1).OlePropertyGet("Value");
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
List->Clear();
delete List;
if(!XL.IsEmpty())
XL.Clear();
if(!WD.IsEmpty())
{
WDoc.OleFunction("Close");
WDoc.Clear();
if(!WD.OlePropertyGet("Documents").OlePropertyGet("Count"))
{
WD.OleFunction("Quit");
}
WD.Clear();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Start1Click(TObject *Sender)
{
if((OpenDialog1->FileName == "") & (OpenDialog2->FileName == ""))
{
Application->MessageBox("Îòñóòñòâóþò ñâåäåíèÿ î ôàéëå øàáëîíà èëè ÁÄ","Îøèáêà", MB_OK|MB_ICONWARNING);
}
else
{
while(XLPos < XLRowCount)
{
AnsiString First, Replace;
int i = 0;
while(i < List->Count)
{
First = List->Strings;
Replace = WS.OlePropertyGet("Cells",XLPos,i + 1).OlePropertyGet("Value");
ReplaceWord(First,Replace);
i++;
}
//Òåïåðü íàäî äîêóìåíò ñîõðàíèòü ïîä èìåíåì è çàãðóçèòü çàíîâî øàáëîí
AnsiString St = OpenDialog1->FileName.SubString(1,OpenDialog1->FileName.Length()-4);
AnsiString End =OpenDialog1->FileName.SubString(OpenDialog1->FileName.Length()-3,4);
AnsiString ThisName = St + " " + WS.OlePropertyGet("Cells",XLPos,1).OlePropertyGet("Value") + End;
WDoc.OleProcedure("SaveAs",ThisName.c_str());
WDoc.OleFunction("Close");
WDoc.Clear();
WD.OlePropertyGet("Documents").OleProcedure("Open" ,StringToOleStr(OpenDialog1->FileName));
WDoc = WD.OlePropertyGet("ActiveDocument");
XLPos++;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ReplaceWord(AnsiString & First, AnsiString & Replace)
{
Variant ReplaceType = wdReplaceAll;
WDoc.OleFunction("Range").OlePropertyGet("Find").OleProcedure("Execute", StringToOleStr(First), EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, StringToOleStr(Replace), ReplaceType);
}
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <OleCtnrs.hpp>
#include "Word_2K_SRVR.h"