Excel jak z Delphi scalić wybrane komórki?

0

Wstawiamy z Delphi do komórki w Excel obramowany napis tekstowy.... jego rozmiar przekracza jednak wymiary jednej kolumny.
Jak z Delphi scalić ten napis na kilka kolumn tak aby pojedyńcze obramowanie obejmowało całość kolumn?

Przykład: jednak nie działa

uses ComObj;

procedure TForm1.Button2Click(Sender: TObject);
var
  Excel,Sheet: Variant;
begin
     Excel:=CreateOleObject('Excel.Application');  // Otwarcie nowego Excela
     Excel.Caption:='Delphi_NazwaOkna';
     Excel.Visible:=True;
     Excel.WorkBooks.Add;   // Stworzenie okna

     Excel.WorkBooks[1].WorkSheets.Add(); //Stworzenie (dodanie) arkusza (czwartego)

     Excel.Cells[1,1].Value:='To jest napis tekstowy rozciągnięty na kilka kolumn jak go scalić w jedną ramkę...?';                // Zapis danej do komórki Excela

     Sheet:=Excel.WorkBooks[1].WorkSheets[1];  //ustalamy edytowany arkusz
     Sheet.Name:='Delphi_NazwaArkusza';  //Nazwa arkusza w oknie
     Sheet.Columns[1].ColumnWidth:=30;   //Szerokosc kolumny
     Sheet.Cells[1,1].Borders.LineStyle:= 6; //Styl linii obramowania

     Excel.DisplayAlerts := False; //Nie Pytaj o zapis niezapisanych

     //Excel.Quit
end;
 
0
Excel.WorkSheets[Index].Range['A1:A5'].HorizontalAlignment := -4108;

Nie wiem czy o to chodzi, ale scala od A1 do A5 jako jedną komórkę.

Zapomniałeś o Excel := UnAssigned !!

0

Spróbuj tak:

var XLSapp, workBook, workSheet, range: OLEVariant;
....
....
....
XLSapp  := CreateOleObject('Excel.Application');

workBook := XLSapp.WorkBooks.Add();

workSheet := workBook.Worksheets[1];

workSheet.Cells[1,1] := 'To jest napis tekstowy rozciągnięty na kilka kolumn jak go scalić w jedną ramkę...?';
range := workSheet.Range['A1:F1'];
range.Merge(True);

workBook.SaveAs('C:\Text.xls');
XLSapp.DisplayAlerts := True;
XLSapp.Quit;
XLSapp := Unassigned;
workSheet := Unassigned;
0

Niestety nie działa...

Do czego jest Excel := UnAssigned
Albo gdzie jest opis do tego wszystkiego?

0

Dobra, pomyliłem się

Excel.WorkSheets[Index].range['A1:B4'].mergecells := True;

A poprzednie to co pisałem to przecież wyrówanie do środka

0

Zrobiłem to tak... ale nie wiem czy nie da to jakiegoś efektu ubocznego.

Excel.Range['A1','M1'].Mergecells := True; //Scalenie kilku kolumn jako jednej całej............!!!!!
Excel.Range['A1','M1'].HorizontalAlignment := -4108; //Wycentrowanie uprzednio scalonego wiersza.....!!!!

Automatycznie powstał kolejny problem komórki pobieram z bazy poprzez ZEOS'a co oznacza
,że nie mam pozycji określanej jako od 'B1' do 'M1' tylko od 2 do 11 ... a Range[2,11] raczej nie zadziała
jak to przekonwerterować?

0

Chociażby użyć kodowania.

const zakresy : array[0..51] of string=('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                                 'AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');

Zamień sobie Int'a na String względem tej tablicy.

Generalnie każda komórka z zakresu będzie posiadała wartość zakresu. Więc możesz bezpośrednio wyłuskać nie przez range, a przez Cells[Wiersz, kolumna]

0

To trochę prymitywne napisałem coś takiego może komuś się przyda:

 

//Funkcja konwerteruje cyfrowy numer kolumny na format Excela;
//Zakres danej wejsciowej (od 1 do 702) co daje kolumny (od A do ZZ)
//UWAGA: W przypadku przekroczenia zakresu zwracany jest ciąg pusty.
function ZamianaCyfryKolumnyNaExcel(Kolumna: integer): string;
var
i,j: integer;
begin
     Result:='';
     if (Kolumna > 0) and (Kolumna <= 702) then
     begin
          if Kolumna > 26 then
          begin
              Result:=Char(((Kolumna-1) div 26)+64);
              Result:=Result+Char(((Kolumna -1) mod 26)+65);
          end
          else
              Result:=Char(Kolumna+64);
     end;
end;

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