СообЧа > База Знаний > Программирование > Delphi

Вопрос

Как мне работать с файлами MS Word или таблицами MS Excel?

Ответ

Есть два пути решения этой проблемы:

Первое — воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for Applications) или WordBasic.
Обратите внимание на то, как устанавливаются именованные параметры у процедур WordBasic'а, например, FileOpen(Name := 'myname.doc');
Пример проверен только на русском Word 7.0! Может, поможет…

unit InWord;
interface
uses
    … ComCtrls; // Delphi3
    … OLEAuto; // Delphi2
[skip]
procedure TPrintForm.MPrintClick(Sender: TObject);
var W: Variant;
        S: String;
begin
S:=VarToStr(Table1['Num']); //В D3 без промежуточной записи
// в var у меня не пошло :(
    try // А вдруг где ошибка :)
   W:=CreateOleObject('Word.Basic');
    // Создаем документ по шаблону MyWordDot
  // с указанием пути если он не в папке шаблонов Word
 W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0);
 // Отключение фоновой печати (на LJ5L без этого был пустой лист)
  W.ToolsOptionsPrint(Background:=0);

    // Переходим к закладке Word'a 'Num'
    W.EditGoto('Num'); W.Insert(S);
        //Сохранение
    W.FileSaveAs('C:\MayPath\Reports\MyReport')
  W.FilePrint(NumCopies:='2'); // Печать 2-х копий
    finally
    W.ToolsOptionsPrint(Background:=1);
        W:=UnAssigned;
    end;
end;

Второй путь, более правильный:

Hужно импортировать TLB библиотеку соответствующего COM-сервера (MS Word, MS Excel, AutoCAD, и т.п.) или воспользоваться готовыми компонентами из палитры Servers поставляемыми с Delphi 5 и более свежими версиями. Среда построит unit содержащий описания всех доступных интерфейсов сервера. Кроме того будут созданы классы-обертки для некоторых интерфейсов сервера. Преимущество этого метода заключается в том что компилятор может проверить правильность синтаксиса обращений к серверу, кроме того повышается скорость работы за счет меньших накладных расходов на каждое обращение.
Пример использования TLB.

program wordemo;

{$APPTYPE CONSOLE}

uses
  SysUtils, ActiveX, Word2000, OleCtrls, Variants;
var
      W:TWordApplication;
      D:_Document;
      P:Paragraph;
      FileName:OleVariant;
begin
  CoInitialize(NIL);
  try
 // создадим экземпляр объекта-обертки вокруг Word 2000
   W:=TWordApplication.Create(NIL);
        try
  // создадим новый документ на основе шаблона Normal

D:=W.Application.Documents.Add(EmptyParam,EmptyParam,
EmptyParam,EmptyParam);
      // добавим новый параграф
   P:=D.Paragraphs.Add(EmptyParam);
      // Запишем туда какой-нибудь текст
    P.Range.InsertAfter('Hello Word :-)');
      // сохраним документ
     FileName:='wordemo.doc';

D.SaveAs(FileName,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
        finally
       // завершим работу Word
        W.Free;
        end;
  finally
        CoUnInitialize;
  end;
end.

Из конференции Delphi

function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
xlCellTypeLastCell = $0000000B;
var
XLApp, Sheet: OLEVariant;
RangeMatrix: Variant;
x, y, k, r: Integer;
begin
Result := False;
// Create Excel-OLE Object
XLApp := CreateOleObject('Excel.Application');
try
// Hide Excel
XLApp.Visible := False;
// Open the Workbook
XLApp.Workbooks.Open(AXLSFile);
// Sheet := XLApp.Workbooks[1].WorkSheets[1];
Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Get the value of the last row
x := XLApp.ActiveCell.Row;
// Get the value of the last column
y := XLApp.ActiveCell.Column;
// Set Stringgrid's row &col dimensions

AGrid.RowCount := x;
AGrid.ColCount := y;
// Assign the Variant associated with the WorkSheet to the Delphi Variant
RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
// Define the loop for filling in the TStringGrid
k := 1;
repeat
for r := 1 to y do
AGrid.Cells[(r — 1), (k — 1)] := RangeMatrix[K, R];
Inc(k, 1);
AGrid.RowCount := k + 1;
until k > x;
// Unassign the Delphi Variant Matrix
RangeMatrix := Unassigned;

finally
// Quit Excel
if not VarIsEmpty(XLApp) then
begin
// XLApp.DisplayAlerts := False;
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
Result := True;
end;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if Xls_To_StringGrid(StringGrid1,
ExtractFileDir(Application.ExeName)+'\Test.xls') then
ShowMessage('Table has been exported!');
end;



Copyright © 2000-2004 Сообщество Чайников
Контактная информация