Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];




Вниз

экспорт в Excel 


Koks   (2002-02-14 13:53) [0]

Уважаемые мастера!
Перегоняю данные из dataset-ов в Excel. При этом пользуюсь "прямыми" компонентами, которые генерят непосредственно файл *.xls.
Все компоненты внутренне отличаются, но внешне схожи - в зависимости от типа переменных есть 3 метода:
WriteStr(Row,Col,StringToWrite)
WriteNum(Row,Col,NumberToWrite)
WriteBool(Row,Col,BoolToWrite)

При передаче Чисел и bool-ов все OK.
А вот со строками - проблема - в Excel-е строки выглядят не в той кодировке (то есть абракадаброй).... Пытался менять свойство компонента-"экпортера" CharSet, пытался менять настройки Excel (шрифт по умолчанию и пр.) - результат тот-же.
Только один компонент все делает правильно (нашел-таки). Но в нем нельзя передавать форматирование (вообще никакое).

Подскажите, как корректно передавать строки ... может какая установка где... может какую функцию применить

У меня Excel 2000 W98SE

Заранее горя благодарностей..



[NIKEL]   (2002-02-14 14:14) [1]

я конечно не очень вьехал в суть... но может это поможет
(у меня InterBase, может у тя в настройкак драйвера СУБД с кодировкой проблемы?)

Variant app, ws, range;
app = CreateOleObject("Excel.Application"); // создаем объект Excel
app.OlePropertyGet("Workbooks").OleProcedure("Add","C:\\Мои документы\\lschet.xls");// Добавляем рабочую книгу(открываем по шаблону)
app.OlePropertySet("Visible", true);

ws = app.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);// 1 рабочий лист
ws.OlePropertyGet("Cells").
OlePropertyGet("Item", 3, 6).
OlePropertySet("Value", Query2->FieldByName("org_const") -> AsString);//структурное подраздиление (Строка)
AnsiString fio;
fio+=Query2->FieldByName("first_name") -> AsString;
fio+=" ";
fio+=Query2->FieldByName("mid_name") -> AsString;
fio+=" ";
fio+=Query2->FieldByName("second_name") -> AsString;
ws.OlePropertyGet("Cells").
OlePropertyGet("Item", 8, 6).
OlePropertySet("Value", fio);// Фамилия Имя Отчество...
ws.OlePropertyGet("Cells").
OlePropertyGet("Item", 7, 14).
OlePropertySet("Value", Query2->FieldByName("category") -> AsInteger);//категория персонала
ws.OlePropertyGet("Cells").
OlePropertyGet("Item", 7, 16).
OlePropertySet("Value", Query2->FieldByName("tab_number") -> AsInteger);

ну и так в том же духе... (такое ощущение что я тебе ни чё нового не открыл :])



Koks   (2002-02-14 15:21) [2]

СПАСИБО! Но суть действительно не в этом.
Я НЕ использую автоматизацию. (Я с ней работать не умею, поэтому все что Вы написали для меня как японский язык). Я использую компоненты, которые генерят файл *.xls напрямую, без Excel...

Так вот, когда я пишу в файл строки через WriteStr(т.е. метод XLSExportComponent.WriteStr), а потом открываю созданный файл в Excel-е, имею псевдографику... т.е. не та кодировка.
Вопрос - где ее менять (и можно ли вообще это сделать) Может какое-то преобразование со строкой надо сделать.. Типа функции OEMtoANSI или че-еще !
НАДО СРОЧНО! КОПАТЬСЯ НЕКОГДА!
Заранее спасибо



[NIKEL]   (2002-02-14 16:58) [3]

Ну тогда посмотри на этот код, делает .xsl файл без OLE


const
CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0);
CXlsEof: array[0..1] of Word = ($0A, 00);
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
CXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
CXlsRk: array[0..4] of Word = ($27E, 10, 0, 0, 0);

procedure XlsBeginStream(XlsStream: TStream; const BuildNumber: Word);
begin
CXlsBof[4] := BuildNumber;
XlsStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
end;

procedure XlsEndStream(XlsStream: TStream);
begin
XlsStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
end;

procedure XlsWriteCellRk(XlsStream: TStream; const ACol, ARow: Word;
const AValue: Integer);
var
V: Integer;
begin
CXlsRk[2] := ARow;
CXlsRk[3] := ACol;
XlsStream.WriteBuffer(CXlsRk, SizeOf(CXlsRk));
V := (AValue shl 2) or 2;
XlsStream.WriteBuffer(V, 4);
end;

procedure XlsWriteCellNumber(XlsStream: TStream; const ACol, ARow: Word;
const AValue: Double);
begin
CXlsNumber[2] := ARow;
CXlsNumber[3] := ACol;
XlsStream.WriteBuffer(CXlsNumber, SizeOf(CXlsNumber));
XlsStream.WriteBuffer(AValue, 8);
end;

procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
const AValue: string);
var
L: Word;
begin
L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := ARow;
CXlsLabel[3] := ACol;
CXlsLabel[5] := L;
XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
FStream: TFileStream;
I, J: Integer;
begin
FStream := TFileStream.Create("c:\e.xls", fmCreate);
try
XlsBeginStream(FStream, 0);
for I := 0 to 99 do
for J := 0 to 99 do
begin
XlsWriteCellNumber(FStream, I, J, 34.34);
// XlsWriteCellRk(FStream, I, J, 3434);
// XlsWriteCellLabel(FStream, I, J, Format("Cell: %d,%d", [I, J]));
end;
XlsEndStream(FStream);
finally
FStream.Free;
end;
end;




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.025 c
1-43107           Miwa                  2002-02-21 03:38  2002.03.14  
Версия приложения.


3-42925           Termik                2002-02-14 14:07  2002.03.14  
Создание алиаса ODBC БД SQL Server из Delphi.


3-42965           Илья Лу.              2002-02-15 15:07  2002.03.14  
Суммирование с условием


14-43171          Moscower              2002-01-28 23:00  2002.03.14  
Есть ли в Москве какие-либо анонимные прокси-сервера?


3-42946           Люк                   2002-02-15 11:20  2002.03.14  
ADO в Delphi