Форум: "Базы";
Текущий архив: 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;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c