Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Excel


Автор: comtat 7.6.2006, 10:22
Есть шаблон шапки сметы user posted image

И не обходимо сохранять данные 
в экселевский файл где шапка как на картинке,
но не обходимо чтобы как минимум менялось номер сметы
и туда вносятся такие данные user posted image

Подскажите варианты решения 
 

Автор: matriza 7.6.2006, 10:40
шапку заново запость плз =) 

Автор: comtat 7.6.2006, 10:45
user posted image

      Cтроительная смета № 12
Общая стоимость строительства : 10000000 руб.
и т.д.

Чета типа того  

Автор: Zaiц 7.6.2006, 10:46
1) Можно через OLE (интерфейсы самого Excel-а). Я так писала формирование квартальных форм ЕСН. Это довольно медленно, но зато выводит данные в указанный шаблон.
2) Есть "быстрый" вывод таблицы - напрямую в файл (это можно делать и без наличия самого Excel-а на машине). Там тоже можно кидать первую строку (заголовок) как часть самих данных. Это я делаю при всех возможных отчетов для выверки данных. Очень быстро, но не так красиво.
Все это есть на www.drkb.ru 
 

Автор: dimkaspaun 7.6.2006, 11:35
насчнт номера сметы я не подскажу можно в принципи создать счетчик выписаных смет например что бы номер сметы выводился в Edit а потом в шаблон Exel в определённую ячейку. А перенос данных из Table такой :
Код

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, DBCtrls, Grids, DBGrids, DB,
  DBTables,ComObj,activeX, Excel2000, OleServer;
не забуть на форму добавить Exel хреновины во вкладке Servers. 
procedure TForm10.BitBtn5Click(Sender: TObject);

Var
   ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData: Variant;
   BeginCol, BeginRow, j: integer;
   RowCount, ColCount: Integer;
   App:variant;
Begin
   BeginCol := 1;
   BeginRow := 17;

 // Размеры выводимого массива данных
   RowCount := Table1.FieldCount;
   ColCount := Table1.FieldDefs.Count;


    // Создание Excel
   ExcelApp := CreateOleObject('Excel.Application');
 // Отключаем реакцию Excel на события, чтобы ускорить вывод информации
   ExcelApp.Application.EnableEvents := false;


 //  Создаем Книгу (Workbook)
 //  Если заполняем шаблон, то
   Workbook := ExcelApp.WorkBooks.Add('C:\ДИПЛОМ Ильиных\ПРАЙС\1.xls' );
   ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

 // Заполняем массив
   Table1.DisableControls;
   Table1.First;
   While Not Table1.eof Do
   Begin
       For J := 1 To Table1.FieldDefs.Count Do
       Begin
           ArrayData[Table1.RecNo, J] :=
            Table1.FieldbyName(Table1.FieldDefs.Items[j - 1].DisplayName).value;
       End;
       Table1.Next;
   End;

   Table1.EnableControls;

//     Левая верхняя ячейка области, в которую будем выводить данные
   Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
 // Правая нижняя ячейка области, в которую будем выводить данные
   Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1,
    BeginCol + ColCount - 1];

 // Область, в которую будем выводить данные
   Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2];

 // А вот и сам вывод данных
 // Намного быстрее поячеечного присвоения
   Range.Value := ArrayData;

 // Делаем Excel видимым
   ExcelApp.Visible := True;
end;

  

Автор: comtat 7.6.2006, 11:46
dimkaspaun Номера смет не проблема они есть в базе

Вопрос в том как из шаблона взять шапку
и записать в файл *.xls шапку и данные 

А то что предлагаешь самый простой способ он у меня есть.
Но все равно спасибо   smile 

А вот варианты с Ole интересны
Если можно по подробнеее 

Автор: pavelv 7.6.2006, 11:53
comtat алгоритм описан пересказывать не буду. Нужно просто открыть твой шаблон, далее забить в него данные и сохранить под другим именем. Потом открыть уже новый файл 

Автор: matriza 7.6.2006, 11:56
извиняй что нету времени объяснять... вот простой примерчик.... там есть описания создания колонок (как я понимаю ты это называешь шапкой...)
Код

procedure TForm_xls.SpeedButton1Click(Sender: TObject);
var
 XLApp,Sheet,Colum:Variant;
 index,i:Integer;
begin
 XLApp:= CreateOleObject('Excel.Application');
 XLApp.Visible:=true;
 XLApp.Workbooks.Add(-4167);
 XLApp.Workbooks[1].WorkSheets[1].Name:='Отчёт';
 Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Columns;
 Colum.Columns[1].ColumnWidth:=10;
 Colum.Columns[2].ColumnWidth:=50;
 Colum.Columns[3].ColumnWidth:=25;
 Colum.Columns[4].ColumnWidth:=12;
 Colum.Columns[5].ColumnWidth:=10;
 Colum.Columns[6].ColumnWidth:=10;
 Colum.Columns[7].ColumnWidth:=15;
 Colum.Columns[8].ColumnWidth:=15;

 Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Rows;
 Colum.Rows[2].Font.Bold:=true;
 Colum.Rows[1].Font.Bold:=true;
 Colum.Rows[1].Font.Color:=clBlue;
 Colum.Rows[1].Font.Size:=14;

 Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт'];
 Sheet.Cells[1,2]:=Form_table.Caption;
 Sheet.Cells[2,1]:='Номер';
 Sheet.Cells[2,2]:='Наименование';
 Sheet.Cells[2,3]:='OEM';
 Sheet.Cells[2,4]:='Количество';
 Sheet.Cells[2,5]:='Цена';
 Sheet.Cells[2,6]:='Цена (руб)';
 Sheet.Cells[2,7]:='Категория';
 Sheet.Cells[2,8]:='Подкатегория';

 index:=3;
 for i:=1 to Table_xls.RecordCount do
  begin
   Sheet.Rows[index].Font.Color:=clBlack;
   Sheet.Cells[index,1]:=DBGridEh1.Fields[0].AsString;
   Sheet.Cells[index,2]:=DBGridEh1.Fields[1].AsString;
   Sheet.Cells[index,3]:=DBGridEh1.Fields[2].AsString;
   Sheet.Cells[index,4]:=DBGridEh1.Fields[3].AsString;
   Sheet.Cells[index,5]:=DBGridEh1.Fields[4].AsString;
   Sheet.Cells[index,6]:=DBGridEh1.Fields[5].AsString;
   Sheet.Cells[index,7]:=DBGridEh1.Fields[10].AsString;
   Sheet.Cells[index,8]:=DBGridEh1.Fields[11].AsString;
   Inc(index);
   Table_xls.Next;
  end;
end; 
  

Автор: Albinos_x 7.6.2006, 17:41
http://forum.vingrad.ru/index.php?showtopic=84634&view=all 

Автор: comtat 8.6.2006, 08:11
Albinos_x огромное спасибо 

Автор: Zaiц 8.6.2006, 08:30
Насчет OLE
1) Я делаю через позднее связывание, т.к. прогу приходится кидать по филиалам, а у всех Excel разный.
2) Чтобы не мучиться каждый раз, я написала маленький модуль, в котором находятся все нужные мне функции для работы по шаблону
3) Сначала создаю нужный excel-ный файл (шаблон), в нем делаю все нужное форматирование (цвет, формат, ширина колонок, и т.д.), в нужных ячейках прописываю поля для печати, если надо печатать таблицу - делаю регион в самом Excel-е, а потом из программы просто вызываю нужные мне ф-ции.
Если надо - я могу тебе этот файл (pas) и примеры вызова.

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)