Как экспортировать таблицу из Delphi в Excel?
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Как экспортировать таблицу из Delphi в Excel? - 2009-03-21 15:46:17.976666
|
|
|
Neveral
Сообщений: 282
Оценки: 0
Присоединился: 2009-02-10 11:51:27.530000
|
Как интегрировать таблицу из Delphi в Exel и наоборот? Я только начинающий, поэтому если можно поподробней распишите пожалуйста.
|
|
|
RE: Как экспортировать таблицу из Delphi в Excel? - 2009-03-21 22:34:00.246666
|
|
|
Genco
Сообщений: 1662
Оценки: 90
Присоединился: 2007-12-16 23:11:22.003333
|
Ну….из Exel в Delphi можно таблицу загрузить. OLE - технология и соответственно TOleContainer.Наоборот - уже хуже,нельзя(если я правильно поняли ты имел в виду TStringGrid). Но зато можно,загрузив в проект табличку програмно её менять/сохранять и т.д.
|
|
|
RE: Как экспортировать таблицу из Delphi в Excel? - 2009-03-21 23:46:00.470000
|
|
|
D. Scandal
Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
|
Для обмена данными можно использовать компонент texcelapplication, доступный на servers page в component palette. На форме присутствует tstringgrid, заполненный некоторыми данными и две кнопки, с названиями to excel и from excel. Так же на форме находится компонент texcelapplication со свойством name, содержащим xlapp и свойством connectkind, содержащим cknewinstance. Если необходимо работать с excel, то обычно открываем excelapplication, далее workbook и в конце используем worksheet. Интерес представляют листы "worksheets" в книге "workbook". Процедура для посылки данных в Excel: procedure tform1.bitbtntoexcelonclick(sender: tobject); var workbk : _workbook; // определяем workbook worksheet : _worksheet; // определяем worksheet i, j, k, r, c : integer; iindex : olevariant; tabgrid : variant; begin if genericstringgrid.cells[0,1] <> '' then begin iindex := 1; r := genericstringgrid.rowcount; c := genericstringgrid.colcount; // Создаём массив-матрицу tabgrid := vararraycreate([0,(r - 1),0,(c - 1)],varolestr); i := 0; // Определяем цикл для заполнения массива-матрицы repeat for j := 0 to (c - 1) do tabgrid[i,j] := genericstringgrid.cells[j,i]; inc(i,1); until i > (r - 1); // Соединяемся с сервером texcelapplication xlapp.connect; // Добавляем workbooks в excelapplication xlapp.workbooks.add(xlwbatworksheet,0); // Выбираем первую workbook workbk := xlapp.workbooks.item[iindex]; // Определяем первый worksheet worksheet := workbk.worksheets.get_item(1) as _worksheet; // Сопоставляем delphi массив-матрицу с матрицей в worksheet worksheet.range['a1',worksheet.cells.item[r,c]].value := tabgrid; // Заполняем свойства worksheet worksheet.name := 'customers'; worksheet.columns.font.bold := true; worksheet.columns.horizontalalignment := xlright; worksheet.columns.columnwidth := 14; // Заполняем всю первую колонку worksheet.range['a' + inttostr(1),'a' + inttostr®].font.color := clblue; worksheet.range['a' + inttostr(1),'a' + inttostr®].horizontalalignment := xlhalignleft; worksheet.range['a' + inttostr(1),'a' + inttostr®].columnwidth := 31; // Показываем excel xlapp.visible[0] := true; // Разрываем связь с сервером xlapp.disconnect; // unassign the delphi variant matrix tabgrid := unassigned; end; end; Процедура для получения данных из Excel: procedure tform1.bitbtnfromexcelonclick(sender: tobject); var workbk : _workbook; worksheet : _worksheet; k, r, x, y : integer; iindex : olevariant; rangematrix : variant; nomfich : widestring; begin nomfich := 'c:\mydirectory\nameoffile.xls'; iindex := 1; xlapp.connect; // Открываем файл excel xlapp.workbooks.open(nomfich,emptyparam,emptyparam,emptyparam,emptyparam, emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam, emptyparam,emptyparam,0); workbk := xlapp.workbooks.item[iindex]; worksheet := workbk.worksheets.get_item(1) as _worksheet; // Чтобы знать размер листа (worksheet), т.е. количество строк и количество // столбцов, мы активируем его последнюю непустую ячейку worksheet.cells.specialcells(xlcelltypelastcell,emptyparam).activate; // Получаем значение последней строки x := xlapp.activecell.row; // Получаем значение последней колонки y := xlapp.activecell.column; // Определяем количество колонок в tstringgrid genericstringgrid.colcount := y; // Сопоставляем матрицу worksheet с нашей delphi матрицей rangematrix := xlapp.range['a1',xlapp.cells.item[x,y]].value; // Выходим из excel и отсоединяемся от сервера xlapp.quit; xlapp.disconnect; // Определяем цикл для заполнения tstringgrid k := 1; repeat for r := 1 to y do genericstringgrid.cells[(r - 1),(k - 1)] := rangematrix[k,r]; inc(k,1); genericstringgrid.rowcount := k + 1; until k > x; // unassign the delphi variant matrix rangematrix := unassigned; end;
|
|
|
RE: Как экспортировать таблицу из Delphi в Excel? - 2009-03-22 05:51:12.696666
|
|
|
Neveral
Сообщений: 282
Оценки: 0
Присоединился: 2009-02-10 11:51:27.530000
|
2 D. Scandal большое спасибо, но у меня локальная БД. Я использую компоненты Table, DBGrid и DataSourse. Таблицу делал стандартными средствами Borland - DataBase Desktop. Такую таблицу возможно же экспортироать в Excel? И как?
|
|
|
RE: Как экспортировать таблицу из Delphi в Excel? - 2009-03-23 18:02:51.126666
|
|
|
D. Scandal
Сообщений: 1360
Оценки: 345
Присоединился: 2007-12-01 16:39:35.550000
|
Формируй вариантный массив и присваивай Range этого самого массива.
var
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant;
TemplateFile : String;
BeginCol, BeginRow, i, j : integer;
RowCount, ColCount : integer;
begin
// Координаты левого верхнего угла области, куда будут вводиться данные
BeginCol := 1;
BeginRow := 5;
// Размеры выводимого массива данных
RowCount := 100;
ColCount := 50;
// Создание Excel
ExcelApp := CreateOleObject(
'Excel.Application'
);
// Отключаем реакцию Excel на события, чтобы ускорить вывод информации
ExcelApp.Application.EnableEvents := false;
// Создаем Книгу (Workbook)
// Если заполняем шаблон, то
// Workbook := ExcelApp.WorkBooks.Add('C:\MyTemplate.xls');
Workbook := ExcelApp.WorkBooks.Add;
// Создаем Вариантный Массив, который заполним выходными данными
ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
// Заполняем массив
for I := 1 to RowCount do
for J := 1 to ColCount do
ArrayData[I, J] := J * 10 + I;
// Левая верхняя ячейка области, в которую будем выводить данные
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;
|
|
|
RE: Как экспортировать таблицу из Delphi в Excel? - 2009-03-23 18:11:16.290000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
А не проще ли через xml гонять? (xml + xslt) В догонку нагуглилось - http://www.stylusstudio.com/SSDN/default.asp?action=9&read=2867&fid=48
|
|
|
RE: Как экспортировать таблицу из Delphi в Excel? - 2009-03-26 10:57:17.486666
|
|
|
WinLinux
Сообщений: 491
Оценки: 0
Присоединился: 2008-07-18 14:06:33.563333
|
Не давно столкнулся с похожей задачей на работе, но был один нюанс, записей в таблице было больше 3 тыс. и во время импорта обычным способом стала вылетать ошибка. Однако в нете я нашел способ как это разрешить. (см. код ниже) function RefToCell(RowID, ColID: Integer): string; var ACount, APos: Integer; begin ACount := ColID div 26; APos := ColID mod 26; if APos = 0 then begin ACount := ACount - 1; APos := 26; end; if ACount = 0 then Result := Chr(Ord('A') + ColID - 1) + IntToStr(RowID); if ACount = 1 then Result := 'A' + Chr(Ord('A') + APos - 1) + IntToStr(RowID); if ACount > 1 then Result := Chr(Ord('A') + ACount - 1) + Chr(Ord('A') + APos - 1) + IntToStr(RowID); end; //Экспорт из StringGrid в Excel function StringGridToExcelSheet(Grid: TStringGrid; SheetName, FileName: string; ShowExcel: Boolean): Boolean; const xlWBATWorksheet = -4167; var SheetCount, SheetColCount, SheetRowCount, BookCount: Integer; XLApp, Sheet, Data: OLEVariant; I, J, N, M: Integer; SaveFileName: string; begin ///////////// SheetCount := (Grid.ColCount div 256) + 1; if Grid.ColCount mod 256 = 0 then SheetCount := SheetCount - 1; //notwendige Bookanzahl feststellen BookCount := (Grid.RowCount div 65536) + 1; if Grid.RowCount mod 65536 = 0 then BookCount := BookCount - 1; //Create Excel-OLE Object Result := False; XLApp := CreateOleObject('Excel.Application'); try //Excelsheet anzeigen if ShowExcel = False then XLApp.Visible := False else XLApp.Visible := True; //Workbook hinzufugen for M := 1 to BookCount do begin XLApp.Workbooks.Add(xlWBATWorksheet); //Sheets anlegen for N := 1 to SheetCount - 1 do begin XLApp.Worksheets.Add; end; end; //Sheet ColAnzahl feststellen if Grid.ColCount <= 256 then SheetColCount := Grid.ColCount else SheetColCount := 256; //Sheet RowAnzahl feststellen if Grid.RowCount <= 65536 then SheetRowCount := Grid.RowCount else SheetRowCount := 65536; //Sheets befullen for M := 1 to BookCount do begin for N := 1 to SheetCount do begin //Daten aus Grid holen Data := VarArrayCreate([1, Grid.RowCount, 1, SheetColCount], varVariant); for I := 0 to SheetColCount - 1 do for J := 0 to SheetRowCount - 1 do if ((I + 256 * (N - 1)) <= Grid.ColCount) and ((J + 65536 * (M - 1)) <= Grid.RowCount) then Data[J + 1, I + 1] := Grid.Cells; //Изменяю размер полей в Excel XLApp.WorkBooks[1].WorkSheets[1].range['a1:i1'].font.bold:=true; XLApp.WorkBooks[1].WorkSheets[1].Rows[1].HorizontalAlignment := 3; XLApp.WorkBooks[1].WorkSheets[1].Range['a1:i1'].Orientation := 0; XLApp.WorkBooks[1].WorkSheets[1].Rows[1].VerticalAlignment := 2; XLApp.WorkBooks[1].WorkSheets[1].cells[1,1].columnwidth:=25; ////////////////////////////// XLApp.Worksheets[N].Select; XLApp.Workbooks[M].Worksheets[N].Name := SheetName + IntToStr(N); //Zellen als String Formatieren XLApp.Workbooks[M].Worksheets[N].Range[RefToCell(1, 1), RefToCell(SheetRowCount, SheetColCount)].Select; XLApp.Selection.NumberFormat := '@'; XLApp.Workbooks[M].Worksheets[N].Range['A1'].Select; //Daten dem Excelsheet ubergeben Sheet := XLApp.Workbooks[M].WorkSheets[N]; Sheet.Range[RefToCell(1, 1), RefToCell(SheetRowCount, SheetColCount)].Value :=Data; /////////////////////////////////////////////////////////////////// end; end; //Сохрняю с тем же названием + _convert try for M := 1 to BookCount do begin SaveFileName := Copy(FileName, 1,Pos('.', FileName) - 1) + '_convert'; XLApp.Workbooks[M].SaveAs(SaveFileName); end; Result := True; except ExB:=MessageBox(0,pchar('Операция отменена пользователем!'),pchar('Сохранение в Excel'),48); XLApp.WorkBooks.Close; end; finally //Excel Beenden if (not VarIsEmpty(XLApp)) and (ShowExcel = False) then begin XLApp.DisplayAlerts := False; XLApp.Quit; XLAPP := Unassigned; Sheet := Unassigned; end; //————————————— //Обработчик для кнопки procedure TForm1.Excell2Click(Sender: TObject); var ExelOtch,AppProgID,path: String; App, Ke, Abc: Variant; begin try path:=StatusBar1.Panels[1].Text; StringGridToExcelSheet(StringGrid2, 'Таблица', path, True); except exit; end;
|
|
|
RE: Как экспортировать таблицу из Delphi в Excel? - 2009-03-26 12:14:20.013333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Какой ужос =\, Ахтунг, немцы рулят :D
|
|
|
|
|