Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Как экспортировать таблицу из Delphi в Excel?

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Как экспортировать таблицу из Delphi в Excel?
Имя
Сообщение << Старые топики   Новые топики >>
Как экспортировать таблицу из Delphi в Excel? - 2009-03-21 15:46:17.976666   
Neveral

Сообщений: 282
Оценки: 0
Присоединился: 2009-02-10 11:51:27.530000
Как интегрировать таблицу из Delphi в Exel и наоборот? Я только начинающий, поэтому если можно поподробней распишите пожалуйста.
Post #: 1
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). Но зато можно,загрузив в проект табличку програмно её менять/сохранять и т.д.
Post #: 2
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;
Post #: 3
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? И как?
Post #: 4
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;
Post #: 5
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
Post #: 6
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;
Post #: 7
RE: Как экспортировать таблицу из Delphi в Excel? - 2009-03-26 12:14:20.013333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Какой ужос =\, Ахтунг, немцы рулят :D
Post #: 8
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Как экспортировать таблицу из Delphi в Excel?







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.