Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

Передача данных в Excel   Найти похожие ветки 

 
ppRakot ©   (2005-09-20 13:24) [0]

Был бы очень благодарен за кусочек кода, позволяющий работать с конкретными
EXCEL ячейками и выделенной областью данных.
 Я использую следующий код:

 Ex:=CreateOleObject("Excel.Application");
 Ex.Workbooks.Add(Unit1.SaveDir+"csv\CSV.xls");
 Ex.Visible:=false;
 WSheet:=Ex.Workbooks[1].WorkSheets[WSNo];
 
 Form1.GetVal(FString,SArr);
 for i:=0 to 7 do
   WSheet.Cells[1,i+1]:=SArr[i];
 for i:=lenX downto 1 do
   WSheet.Cells[2,lenX-i+2]:=i-1;
 for j:=1 to lenY do                                     //запись данных
   WSheet.Cells[j+2,1]:=j-1;
 for i:=1 to lenX do
   begin
   for j:=1 to lenY do
     case ConfigMem[Xp+lenX-i,Yp+j-1] of
    d0:WSheet.Cells[j+2,i+1]:="0";
     z:WSheet.Cells[j+2,i+1]:="z";
    d1:WSheet.Cells[j+2,i+1]:="1";
     x:WSheet.Cells[j+2,i+1]:="x";
     end;{case}
   end;

 Ex.Workbooks[1].SaveAs(Unit1.SaveDir+"csv\CSV.xls");
 Ex.Workbooks.Close;
 Ex.Quit;
 Ex:=UnAssigned;
 VarClear(Ex);
 VarClear(WSheet);

 Но все происходит очень медленно и при закрытии файла выскакивает
окошко поттверждения выхода.
 Как от этого избавиться, подскажите пожалуйста решение.


 
Big Joe ©   (2005-09-20 13:36) [1]

Получает и заносит число типа double в ячейку листа Microsoft Excel

function DoubleValueFromExcelCell(ExcelWorkBook, ExcelCell: string): double;
var
 i: integer;
 Excel, v: Variant;
begin
 Excel := GetActiveOleObject("Excel.Application");
 for i := 1 to Excel.Application.Workbooks.Count do
   if Excel.Application.Workbooks[i].FullName = ExcelWorkBook then
   begin
     v := Excel.Application.Workbooks[i].Sheets[1].Range[ExcelCell];
     DoubleValueFromExcelCell := VarAsType(v, varDouble);
     v := 0;
     Excel := 0;
   end;
end;

//занесение double в заданную ячейку первого листа в заданной рабочей книге

procedure DoubleValueToExcelCell(Value: double; ExcelWorkBook, ExcelCell:
 string);
var
 i: integer;
 Excel, v: Variant;
begin
 Excel := GetActiveOleObject("Excel.Application");
 for i := 1 to Excel.Application.Workbooks.Count do
   if Excel.Application.Workbooks[i].FullName = ExcelWorkBook then
   begin
     Excel.Application.EditDirectlyInCell := false;
     v := Value;
     Excel.Application.Workbooks[i].Sheets[1].Range[ExcelCell] := v;
   end;
end;


 
incolex ©   (2005-09-23 23:38) [2]

для D7, Office 2000, 2003

var
   ExcelApplication1:TExcelApplication;
   ExcelWorkbook1:ExcelWorkbook;
   ExcelWorksheet1:ExcelWorksheet;
   V:Variant;
begin
 ExcelApplication1:=TExcelApplication.Create(Application); // создаём Excel
 ExcelApplication1.ConnectKind:=ckRunningOrNew; // создаём новый экземпляр сервера или присоединяемся к уже существующему
 ExcelApplication1.AutoQuit := true; // чтобы после закрытия программы Excel закрывался
 ExcelApplication1.Visible[LOCALE_USER_DEFAULT]:=true; // делаем его видимым

   ExcelWorkbook1:=ExcelApplication1.Workbooks.Add(EmptyParam,0); // создаём книгу
   ExcelWorkbook1.Activate(LOCALE_USER_DEFAULT);
     ExcelWorkbook1.Worksheets.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam,LOCALE_USER_DEFAULT); // добавляем лист
     ExcelWorksheet1:=ExcelApplication1.ActiveWorkbook.ActiveSheet as ExcelWorksheet;
     ExcelWorksheet1.Name:="название листа"; // имя первого листа в книге
     V:=ExcelWorksheet1.Range["A1","A1"]; // ячейка
     V.Value:="пример"; // значение присваемое ячейки
     V.Columns.ColumnWidth:=16; // ширина столбца
// а можно ещё всё выделить так:
     V:=ExcelWorksheet1.Range["A1","B4"]; // диапазон
     V.Borders.LineStyle:=xlContinuous; // устанавливаем толщину линий
end;

Если устанавливать ширину столбцов не жёстко, то для Office XP надо делать так:
...
var R:real;
...
begin
...
R:=Round(выражение);
V.Columns.ColumnWidth:=R; // ширина столбца
...
end;
Помоему идиотизм, но если будет R:Integer то в Office XP выдаст ошибку, что дескать "не могу приминить свойство к ячейки"


 
sniknik ©   (2005-09-24 10:35) [3]

> Был бы очень благодарен за кусочек кода
учись работать с макросами в самом ехеле, стартуеш макрос, после выполняеш нужные действия руками... и получаеш именно тот кусочек кода что нужен именно для твоего случая. остается только перенести его в программу.

> Но все происходит очень медленно
старайся исключать работу непосредственно с ячейкой...(несмотря на то что хочется именно этого. в вопросе стоит) работай с диапазонами, масивами, и рекордсетами (оформление, вставка данных)
както пытался замерить время, у меня получилось примерно одинаковое, что для вставки 1-й записи через ячейки что для рекордсета из 1000-и  записей через соответствующий метод... и также форматирование 1-й ячейки примерно такое же время занимает что диапазон 100 на 10. т.е. "тормозит" в основном обращение/вызов метода а не сама обработка в ехеле и чем меньшим числом команд/обрашений ты сделаеш желаемое тем будет быстрее.


 
ppRakot ©   (2005-09-26 10:55) [4]

Большое спасибо всем. Очень помогло.



Страницы: 1 вся ветка

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.033 c
3-1125985595
Drakon
2005-09-06 09:46
2005.10.16
Печать. TDBGrid


2-1126613672
Kolan
2005-09-13 16:14
2005.10.16
Стек элементы которого - объекты


8-1117027701
Задающий вопросы
2005-05-25 17:28
2005.10.16
В чём хранить звуки?


2-1126054472
DimonS
2005-09-07 04:54
2005.10.16
Вопрос по SQL + DBGrid


2-1126974999
нарка
2005-09-17 20:36
2005.10.16
досрочный выход из for-цикла