Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
ВнизСоздание файла эксель и запись в него при помощи OLE Найти похожие ветки
← →
Pine (2005-01-23 01:51) [0]Никто не подкинет пример?
В факе есть отличный пример для открытия и считывания из существующего экселевского файла .
(с моими небольшими доработками "по месту" получилось вот что)
=====================
procedure TForm1.Button1Click(Sender: TObject);
var
Excel : Variant;
WorkSheet : Variant;
I, J : Integer;
cls_ExcelObject : string;
regData : TRegistry;
begin
cls_ExcelObject := "Excel.Application";
regData := TRegistry.Create;
regData.RootKey := HKEY_CLASSES_ROOT;
try if regData.OpenKey("\Excel.Application\CurVer", False) then
begin cls_ExcelObject := regData.ReadString("");
regData.CloseKey;
end
finally regData.Free; end;
if OpenDialog1.Execute then begin
Excel := CreateOleObject( cls_ExcelObject );
Excel.Visible := False;
Excel.Workbooks.Open( OpenDialog1.FileName );
WorkSheet := Excel.Workbooks[1].WorkSheets[1];
ListView1.Columns.Clear;
ListView1.Items.Clear;
for I := 1 to WorkSheet.Cells.CurrentRegion.Columns.Count do
ListView1.Columns.Add.Caption := VarToStr( WorkSheet.Cells[1,I] );
for I := 1 to WorkSheet.Cells.CurrentRegion.Rows.Count do
with ListView1.Items.Add do begin
Caption := VarToStr( WorkSheet.Cells[I,1] );
for J := 2 to WorkSheet.Cells.CurrentRegion.Columns.Count do
SubItems.Add( VarToStr( WorkSheet.Cells[I,J] ));
end;
Excel.Workbooks.Close;
Excel.Quit;
end;
end;
===================
Но мне нужно сформировать файл экселевский и несколкьо строчек туда закинуть в нужные ячейки...
← →
GanibalLector © (2005-01-23 02:05) [1]Во первых,обьясни на кой тебе считывать из реестра?
CreateOleObject("Excel.Application")
запускается на всех ОС с любой версией Excel.
> несколкьо строчек туда закинуть в нужные ячейки.Excel.WorkBooks[1].Sheets[1].Cells[2,2]:="GanibalLector";
← →
Pine (2005-01-23 11:40) [2]Считывать из реестра нужно было раньше (сейчас возможно не надо) - так как иначе если эксели на машинах были разные то происходила ошибка. Из реетса подставляется номер версии экселя (повторюсь что наверное сейчас это делает сама Делфи не озабачивая такими нюансами программера)
Мне нужно сделать экспорт данных из делфи в экселевский файл.
Раньше (программа работает 6 лет) я его делал в текстовой а сейчас апгрейдили принимающую программу и они требуют чтобы данные были в экселевском файле.
Меня озабачивает не сама строка кода как именно записать в открытый экселевский файл, а как из Делфи создать НОВЫЙ экселевский файл, присвоить ему имя , добавить туда нужную мне инфу,сохранить и закрыть файл.
ПОследние несколько лет я практически не занимаюсь программированием, вчера сел и как оказалось очень тяжко входить в процесс, торможу. (В D7 я даже не могу найти хелп на компоненты типа ExcelAplication, как только не перестраивал справку. Смотрю пока исходники компонентов - но это весьма неудобно да и самого хелпа то почитать не получается)
← →
OlegP © (2005-01-23 12:00) [3]
Procedure Tform6.WriteIntoExel;
Var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData: Variant;
St:String;
BeginCol,BeginRow, I,J:integer;
RowCount,ColCount:integer;
begin
BeginCol:=2;
BeginRow:=2;
RowCount:=Form4.Query1.RecordCount+1+5*Form5.ListBox1.Items.Count;
ColCount:=10;
ExcelApp:=CreateOleObject("Excel.Application");
ExcelApp.Application.EnableEvents:=false;
Workbook:=ExcelApp.WorkBooks.Add;
ArrayData:=VarArrayCreate([1,RowCount,1,ColCount],varVariant);
Form4.Query1.First;
St:=Form4.Query1.FieldByName("name").AsVariant;
J:=6;
ArrayData[1,3]:="Отчет по отгрузке готовой продукции";
ArrayData[3,2]:=Form4.Query1.FieldByName("name").AsVariant;
ArrayData[4,5]:="За период с "+ Form5.MaskEdit1.Text + " по " + Form5.MaskEdit2.Text;
for i:=1 to Form4.Query1.RecordCount do
Begin
If St<>Form4.Query1.FieldByName("name").AsVariant then
begin
St:=Form4.Query1.FieldByName("name").AsVariant;
ArrayData[j+2,2]:=Form4.Query1.FieldByName("name").AsVariant;
ArrayData[j+3,5]:="За период с "+ Form5.MaskEdit1.Text + " по " + Form5.MaskEdit2.Text;
j:=j+5;
end;
ArrayData[J,1]:=Form4.Query1.FieldByName("Name_1").AsVariant;
ArrayData[J,6]:=Form4.Query1.FieldByName("Sum of Allart").AsVariant;
ArrayData[J,7]:=Form4.Query1.FieldByName("Edizm").AsVariant;
j:=j+1;
Form4.Query1.Next;
end;
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;
ExcelApp.Visible:=true;
end;
← →
ninja © (2005-01-23 12:01) [4]Excel.Workbooks[1].SaveAs(FileName);
← →
Pine (2005-01-23 12:07) [5]ГРОМАДНОЕ спасибо господа!
Сегодня вечерком думаю смогу сделать на основе этих кодов то что мне надо.
← →
ninja © (2005-01-23 12:08) [6]но есть глюки с работой [4] (хотя, может, это только у меня глючно работает). Проблема в том, что на сохранение таблички уходит ~ полминуты (200 строк, 15 столбцов). Причём, если я делаю visible=true (отображается процесс заполнения ячеек), и затем тыкаю куда-нибудь, например, в меню, то запись ускоряется раз в 5.
Вот хочу спросить: есть ли у экселя какие-нибудь методы типа BeginUpdate/EndUpdate, или что-то, чтобы ускорить запись.
← →
GanibalLector © (2005-01-23 12:36) [7]Для ускорения,использую буфер(хотя,многим не нравиться).Есть скоростной вариант для Word.Могу показать...
>затем тыкаю куда-нибудь, например, в меню, то запись ускоряется раз в 5
Судя по всему,это из-за приоритета.
← →
Leonid Troyanovsky © (2005-01-23 13:01) [8]
> ninja © (23.01.05 12:08) [6]
> Вот хочу спросить: есть ли у экселя какие-нибудь методы
> типа BeginUpdate/EndUpdate, или что-то, чтобы ускорить запись.
Application.ScreenUpdating
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c