Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Вниз

Передача данных в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.043 c
14-1127543055
Карелин Артем
2005-09-24 10:24
2005.10.16
Что за сервер на IP 65.254.40.210?


3-1125404549
KSK
2005-08-30 16:22
2005.10.16
Обновление ADODataset


5-1103129104
Anatoly
2004-12-15 19:45
2005.10.16
Коллекция после запуска пустая


9-1118216589
Novouralsk
2005-06-08 11:43
2005.10.16
Плагин для 3ds Max!


14-1127133477
Антоний
2005-09-19 16:37
2005.10.16
WinXP и подключение к Win2003Server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский