Lazarus + Excel + OLE + polskie litery + przekazanie zmiennej

0

Witam

Mam 2 problemy dotyczące współpracy Excela z Lazarusem za pośrednictwem OLE. Jako że długotrwałe szukanie odpowiedzi w google nie dało satysfakcjonującego rezultatu, pozwolę sobie zadać pytania tutaj.
Pierwszy z nich dotyczy kodowania polskich liter i ich wyświetlania w Excelu. Lazarus stosuje kodowanie UTF-8, Office - windows-1250. W przypadku zwykłego przesłania stringa do Offica w miejscu polskich literek pojawiają się oczywiście krzaczki. Niestety, niezależnie od tego czy próbuję konwertować stringa na windows1250, czy też deklaruję zmienną jako widestring, albo w takiej postaci pozyskuję (AsWidestring) z bazy danych i przekazuję do Excela – w Excelu cały czas uzyskuję krzaczki. Próbowałem także funkcję MultiByteToWideChar ( przykład funkcji StringToWideString z tego forum) – bez powodzenia.

 
var
excel  : olevariant;
begin
excel:=CreateOleObject('Excel.Application');
excel.visible:=true;
excel.WorkBooks.Add;
excel.Cells[1,1].Value:='ąęćśż';
excel.Cells[1,2].Value:=Utf8ToAnsi('ąęćśż');
excel.Cells[1,3].Value:=UTF8ToCP1250('ąęćśż'); end;          
end;

user image

I drugi problem. Próbuję przekazać zmienną do Excela. Pojawia się komunikat:
EOleSysError "W magazynie brak miejsca dla wykonania tej operacji".

 var
excel  : olevariant;
S: String;
begin
excel:=CreateOleObject('Excel.Application');
excel.visible:=true;
excel.WorkBooks.Add;
S:='ąęćśż';
excel.Cells[1,1].Value:=S;
end;          

Pytanie uzupełniające:

  1. Co robię źle, że uzyskuję w Excelu krzaczki zamiast polskich liter oraz nie mogę przesłać zmiennej do Excela.
0

UTF8ToCP1250 - w drugą stronę potrzebujesz.

0
_13th_Dragon napisał(a):

UTF8ToCP1250 - w drugą stronę potrzebujesz.

Wysyłam z Lazarusa (UTF8) do Excela (CP1250) więc raczej UTF8ToCP1250? Ale spróbowałem też w drugą stronę - nadal chińskie krzaczki. W uzupełnieniu : problemy mają miejsce zarówno w Office 2007 (Windows XP) jak i 2010 (Windows 7). Wersja Lazarusa 1.06.

0

Zrób:
Wpisz w A1:
ąćęłńóśźżĄĆĘŁŃÓŚŹŻ
daj w programie:
S:=excel.Cells[1,1].Value;
i zobacz jakie kody masz w S.
Po czym dopasujesz kodowanie.

0

Czyli dokładnie zgadza się z Windows-1250 (Windows CE): http://pl.wikipedia.org/wiki/Kodowanie_polskich_znak%C3%B3w
Teraz zrób to samo tylko że S pobierz z Edit'a w Lazarusie.

0

Kody wskazują, że faktycznie mamy kodowanie UTF8 i CP1250, ale to nadal nic nie zmienia. Co ciekawe, wpisując kod taki jak poniżej, w pliku TEdit uzyskujemy polską czcionkę i prawidłową konwersję CP1250 do UTF8. W drugą stronę to już nie działa...

Var
 I: Integer;
Str: String;
begin
  k:=excel.Cells[1,1].Value;//// W Excelu w komórce A1 wprowadziliśmy ąćęłńóśźżĄĆĘŁŃÓŚŹŻ
  For I:=1 to Length(k) do Str:=Str+IntToStr(Ord(k[I]))+',';
  edit1.Text:=Str; //tu dostajemy kody ąćęłńóśźżĄĆĘŁŃÓŚŹŻ
  edit2.Text:=CP1250ToUTF8(k); // konwersja CP1250 (Excel) do UTF8 (Lazarus) i wyświetlenie w Edit2 DZIAŁA
  excel.Cells[1,4].Value:=UTF8ToCP1250(edit2.Text); // konwersja UTF8 (Lazarus) do CP1250 (Excel) NIE DZIAŁA (krzaczki)

end;    
0

Dzięki PawelD, oba problemy rozwiązane. Wrzucam kod, może komuś się przyda:

var
excel,Sheet,S  : olevariant;
B : String;
begin
excel:=CreateOleObject('Excel.Application');
excel.visible:=true;
excel.WorkBooks.Add;
Sheet:=excel.WorkBooks[1].WorkSheets[1]; 
B:=UTF8Decode('ąćęłńóśźżĄĆĘŁŃÓŚŹŻ'); 
S:=B;
excel.Cells[1,1].Value:=S;           
end; 

1 użytkowników online, w tym zalogowanych: 0, gości: 1