Форум: "Основная";
Текущий архив: 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.048 c