19-08-2005 02:00
Подскажите пожалуйста, - что я делаю нет. При экспорте их IB в Excel?
IBDataSet1.CLOSE;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Add('Select * FROM INCOMING');
IBDataSet1.Open;
// TExcelApplication
XLApp.Connect;
// Aiaaaeyai WorkBooks a ExcelApplication
XLApp.WorkBooks.Add(xlWBatWorkSheet,0);
// Auae?aai ia?ao? WorkBook
WorkBk := XLApp.WorkBooks.Item[1];
// Ii?aaaeyai ia?aue WorkSheet
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
WorkSheet.Range['A3',EmptyParam].CopyFromRecordset(IBDataSet1.DataSource.DataSet,EmptyParam,EmptyParam);
[+] Добавить в избранные вопросы
Отслеживать ответы на этот вопрос по
Ответы:
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице . Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
19-08-2005 11:54 Я делаю так
procedure TSysQueryForm.ExcelExportItemClick(Sender: TObject);
function xlR1C1ColToA1Col(C: Integer): string ;
const
ABC: array [0 ..26 ] of Char = 'ZABCDEFGHIJKLMNOPQRSTUVWXYZ' ;
begin
if C < 27 then Result := ABC[C]
else Result := ABC[(C - 1 ) div 26 ] + ABC[C mod 26 ];
end ;
function ColumnsRange(BegC, EndC: Integer): string ;
begin
if (BegC > 0 ) and (EndC > 0 ) then
Result := xlR1C1ColToA1Col(BegC) + ':' + xlR1C1ColToA1Col(EndC)
else
raise Exception.Create(Format('Ошибка преобразования столбцового диапазона: нулевой столбец или строка [%d,%d]' , [BegC, EndC]));
end ;
var
ExcelApp: OleVariant;
WorkBook, DataArray, BegCell, EndCell, Range: Variant;
RowCount, ColCount, Row, Col: Integer;
RangeRef: string ;
UseTemplate: Boolean;
begin
ExcelApp := CreateOleObject('Excel.Application' );
ExcelApp.Application.EnableEvents := False;
Workbook := ExcelApp.WorkBooks.Add;
RowCount := qrSysQuery.RecordCount;
ColCount := QueryGrid.Columns.Count;
Row := 1 ;
DataArray := VarArrayCreate([1 , RowCount + Row, 1 , ColCount], varVariant);
for Col := 1 to ColCount do
DataArray[Row, Col] := QueryGrid.Columns[Col - 1 ].Title.Caption;
end ;
with qrSysQuery do begin
First;
while not EOF do begin
Inc(Row);
for Col := 1 to ColCount do DataArray[Row, Col] := QueryGrid.Columns[Col - 1 ].Field.asString;
Next;
end ;
end ;
BegCell := WorkBook.WorkSheets[1 ].Cells[1 , 1 ];
EndCell := WorkBook.WorkSheets[1 ].Cells[RowCount + 1 , ColCount];
Range := WorkBook.WorkSheets[1 ].Range[BegCell, EndCell];
Range.NumberFormat := '@' ;
Range.Value := DataArray;
WorkBook.WorkSheets[1 ].Columns[ColumnsRange(1 , ColCount)].AutoFit;
ExcelApp.Visible := True;
end ;
Текст несколько подредактирован, т.к. помимо сброса данных в Excel в оригинале еще много чего делается
19-08-2005 07:51 Вот набросал примерный код за 10 мин.
uses Excel2000;
procedure TForm1.Button1Click(Sender: TObject);
procedure CopyFromDataSet(ASheet: _WorkSheet; DataSet: TDataSet);
var
R, C: Integer;
vData: Variant;
begin
DataSet.Last;
vData := VarArrayCreate([0 , DataSet.RecordCount, 1 , DataSet.FieldCount], varVariant);
for C := 0 to DataSet.FieldCount - 1 do
vData[0 , C + 1 ] := DataSet.Fields[C].DisplayLabel;
DataSet.First;
R := 1 ;
while not DataSet.Eof do begin
for C := 0 to DataSet.FieldCount - 1 do
vData[R, C + 1 ] := DataSet.Fields[C].Value;
Inc(R);
DataSet.Next;
end ;
with ASheet do Range['A1' ,
Cells.Item[DataSet.RecordCount + 1 , DataSet.FieldCount]].Value := vData;
vData := Unassigned;
with ASheet do Range['A1' ,
Cells.Item[1 , DataSet.FieldCount]].Interior.ColorIndex := 15 ;
with ASheet do Range['A1' ,
Cells.Item[DataSet.RecordCount + 1 , DataSet.FieldCount]].Borders.Weight := xlHairline;
end ;
var
XL: TExcelApplication;
begin
XL := TExcelApplication.Create(Self);
try
XL.Connect;
XL.Workbooks.Add(EmptyParam, lcid);
XL.Visible[lcid] := True;
CopyFromDataSet(XL.ActiveWorkbook.ActiveSheet as _Worksheet, DM1.tblCustomers);
finally
XL.UserControl := True;
XL.Free;
end ;
end ;
19-08-2005 07:21 | Комментарий к предыдущим ответам Вот пример для Cpp Builder
Через Cells лучше не делать! Не берите этот код. Прочтите статьи - они короткие и понятные. На КС уже были примеры переноса из DataSet'а в Excel. Поищите.
19-08-2005 06:06 | Сообщение от автора вопроса Да-да могу подождать! Буду очень признателен!
Сам начинающий а времени для углубленого изучения мало очень есть пару дней и отчет уже нужно сдавать.
19-08-2005 05:27 Вот пример для Cpp Builder
HRESULT TMainForm::EXPORT_TEST_LIST_TO_EXCEL(TFields_test* dTestList)
{
DWORD dwResult;
int QwestListCount; //количество вопросов в тесте
int AnswersListCount; //количество ответов на активный вопрос
TList *QwestList; //список dTestList->QwestList
TList *AnswersList; //список dTestList->QwestList->AnswersList
TQwestRec *AQwestRec; //активная запись списка dTestList->QwestList
TAnswersRec *AAnswersRec;//активная запись списка dTestList->QwestList->AnswersList
Variant XL, v0, v1, v2, v3, vrange;
int DeltaX=4;
int DeltaY=2;
int CurrentY;
AnsiString temp, PrintTemplate;
try{
PrintTemplate = String(glob_initial.template_path)+"Template\\PrintForm\\test_template.xlt";
if (FileExists(PrintTemplate)==false){
Application->MessageBox("Шаблон указанного отчета не найден. Обратитесь за консультацией к Администратору.", "Обратитесь к Администратору.", MB_ICONEXCLAMATION);
}
XL=CreateOleObject("Excel.Application");
XL.OlePropertySet("Visible", true);
XL.OlePropertySet("DisplayAlerts", true);
v0=XL.OlePropertyGet("Workbooks");
v0.OleProcedure("Open", PrintTemplate);
v1=v0.OlePropertyGet("Item", 1);
v0=v1.OlePropertyGet("WorkSheets");
v1=v0.OlePropertyGet("Item", 1);
//*******************************************************************
//temp = IntToStr(dTestList->user_id);
//v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+1, DeltaX+1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = dTestList->user_fio;
v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+1, DeltaX+1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = dTestList->test_start;
v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+2, DeltaX+1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = dTestList->test_end;
v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+3, DeltaX+1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = dTestList->name_predmet;
v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+4, DeltaX+1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = dTestList->code_predmet;
v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+4, DeltaX+2).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = dTestList->name_tema;
v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+5, DeltaX+1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = dTestList->code_tema;
v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+5, DeltaX+2).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
//temp = dTestList->codelist_qwest;
//v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+6, DeltaX+1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
//*******************************************************************
QwestList = dTestList->QwestList;
QwestListCount = QwestList->Count;
CurrentY = 10;
for (int i=0; i<QwestListCount; i++){
AQwestRec = (TQwestRec*)QwestList->Items[i]; //получаем указатель на запись №i списока dTestList->QwestList
//*******************************************************************
temp = IntToStr(AQwestRec->qwers_num+1);
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
//temp = String(AQwestRec->qwest_code);
//v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 1).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
v3=v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 2);
v3.OlePropertyGet("Font").OlePropertySet("Size", 14);
v3.OlePropertyGet("Font").OlePropertySet("Bold", true);
temp = String(AQwestRec->qwest_name);
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 2).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = String(AQwestRec->qwest_blob);
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 3).OlePropertySet("Value", temp);
//*******************************************************************
CurrentY++;
AnswersList = AQwestRec->AnswersList;
AnswersListCount = AQwestRec->AnswersList->Count;
//-------------------------------------------------------------------
for (int i=2; i<6; i++){
v3=v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, i);
v3.OlePropertyGet("Font").OlePropertySet("Color", clBlack);
v3.OlePropertyGet("Font").OlePropertySet("Bold", true);
v3.OlePropertyGet("Interior").OlePropertySet("Color", 0x00DEFCBE);
}
temp = "Варианты ответов";
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 2).OlePropertySet("Value", temp);
temp = "Ответ верен?";
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 3).OlePropertySet("Value", temp);
temp = "Отвечал '"+Trim(String(dTestList->user_fio))+"'";
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 4).OlePropertySet("Value", temp);
temp = "Содержание ответа";
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 5).OlePropertySet("Value", temp);
CurrentY++;
//-------------------------------------------------------------------
for (int j=0; j<AnswersListCount; j++){
AAnswersRec = (TAnswersRec*)AnswersList->Items[j];
//-------------------------------------------------------------------
//temp = IntToStr(AAnswersRec->answers_num+1);
//v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 2).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
//AAnswersRec->answers_id
//temp = String();
//v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+i+8, 3).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
//AAnswersRec->answers_code
//temp = String();
//v1.OlePropertyGet("Cells").OlePropertyGet("Item", DeltaY+i+8, 3).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = String(AAnswersRec->answers_name);
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 2).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
if (glob_initial.user_type=="Administrator"){
temp = IntToStr(AAnswersRec->answers_legal);
if (temp=="1"){
temp = "Ответ верный";
}else{
temp = "Ответ неправильный";
}
}else{
temp = "Подумай сам";
}
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 3).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = IntToStr(AAnswersRec->answers_select_user);
if (temp=="0"){
temp = "----------";
}else{
temp = "Выбран пользователем";
}
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 4).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
temp = String(AAnswersRec->answers_blob);
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 5).OlePropertySet("Value", temp);
//-------------------------------------------------------------------
CurrentY++;
}
}
CurrentY++;
for (int i=2; i<4; i++){
v3=v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, i);
v3.OlePropertyGet("Font").OlePropertySet("Color", clBlack);
v3.OlePropertyGet("Font").OlePropertySet("Size", 12);
v3.OlePropertyGet("Font").OlePropertySet("Bold", true);
v3.OlePropertyGet("Interior").OlePropertySet("Color", 0x00E2C6FF);
}
temp = "Результат";
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 2).OlePropertySet("Value", temp);
CurrentY++;
temp = "Итог = ";
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 2).OlePropertySet("Value", temp);
temp = IntToStr(dTestList->TestResult) + "%";
v1.OlePropertyGet("Cells").OlePropertyGet("Item", CurrentY, 3).OlePropertySet("Value", temp);
dwResult=GetLastError();
}catch(...){
Application->MessageBox("Ошибка формирования отчета. Обратитесь за консультацией к Администратору.", "Обратитесь к Администратору.", MB_ICONEXCLAMATION);
return dwResult;
}
return S_OK;
}
Если подождешь переделаю на Delphi
19-08-2005 05:02 19-08-2005 04:43 | Сообщение от автора вопроса Мне необходимо из Dataset-та компонента IBX выгрузить данные в Excel.
CopyFromRecordset только ADO.
Не подскажите каким образомможно из IBX компонентов выгрузить в Excel?
19-08-2005 03:07 19-08-2005 03:06 Все так кроме одного - CopyFromRecordset работает только с ADO RecordSet'ом
Страница избранных вопросов Круглого стола.