Export do *.xls

0

Pomocy!!! jak można wyeksportować dane z ListBoxa "ListViewa" do excela tz. mam w ListBoxie kilka kolumn i chciałbym to wszystko zapisać w pliku *.xls
Pomocy. Z góry Dzięki. [sciana]

0

Nie widziałem maszynerii tworzącej .xls, ale przecie Excel bardzo dobrze radzi sobie z plikami tekstowymi (.csv), zapisujesz wierszami, kolumny rozdzielasz np. tabulatorem (#9).

0

skorzystaj z kontrolki ExcelWorksheet1 oraz ExcelApplication1 jezeli korzystasz z BCB

0
uses ComOBJ;
var Excel: Variant;
...
Excel:=CreateOleObject('Excel.Application');  // Otwarcie nowego Excela
Excel.WorkBooks.Add;                                 // Stworzenie skoroszytu
Exce.Cells[1,1].Value=Wartość;                    // Zapis danej do komórki Excela
Excel.ActiveWorkbook.SaveAs(plik);             // Zapis do pliku
Excel.Quit;
0

A jak ktoś nie ma zainstalowanego Exela ? :>

0

Wtedy pozostaje csv.

0
hes napisał(a)

Wtedy pozostaje csv.

mozna jeszcze samemu zaimplementowac format plikow .xls

0

Lekko poprawiony kod hesa (bo zawierał drobne błędy):

uses ComOBJ;

procedure TForm1.Button1Click(Sender: TObject);
var
        Excel: Variant;
begin
        Excel := CreateOleObject('Excel.Application'); // Otwarcie nowego Excela
        Excel.WorkBooks.Add(); // Stworzenie skoroszytu
        Excel.Cells[1,1].Value := '11'; // Zapis danej do komórki Excela - liczba
        Excel.Cells[1,2].Value := '''rybka'; // Zapis danej do komórki Excela - string
        Excel.Cells[1,3].Value := '=A1*3'; // Zapis danej do komórki Excela - formuła
        Excel.ActiveWorkbook.SaveAs('c:\test.xls');     //Zapis do pliku - zmień na *.xlsx jeśli masz Excel 2007 lub nowszy...
        Excel.Quit;
end;

I kilka uwag:

  1. Trudno mi wyobrazić sobie program generujący pliki XLS w opisany sposób, używany na komputerze (przez osobę), gdzie nie ma zainstalowanego Excela. Dlatego myślę, że to najszybszy i najprostszy sposób zamiast płacenia po 120-500 dolarów za native-controls.

  2. Jeżeli na komputerze jest zainstalowany Excel 2007 lub nowszy to pliki należy zapisywać z rozszerzeniem *.xlsx, a nie *.xls. W przeciwnym przypadku przy ich otwieraniu pojawi się mało przyjemny komunikat.

  3. Tutaj jest fajny przykład na rozszerzenie możliwości w opisywanej metodzie (nazywanie arkuszy, formatowanie komórek, etc.).

0

Witam,
od lat param się tym z użyciem d4 i office 97 prof, nie jestem informatykiem i
choć nauczyłem się trochę nie do końca to rozumiem. Słyszałem, że tylko 97 miała
w sobie wszystko (biblioteki) aby dać porozumieć się z excelem czy wordem.
Czy to prawda?
Byłbym wdzięczny za komentarz

0
Andrzej_m napisał(a)

od lat param się tym z użyciem d4 i office 97 prof, nie jestem informatykiem i
choć nauczyłem się trochę nie do końca to rozumiem. Słyszałem, że tylko 97 miała
w sobie wszystko (biblioteki) aby dać porozumieć się z excelem czy wordem.
Czy to prawda?

Korzystam z Delphi 5 (jak widać w podpisie). Ale myślę, że wersja Delphi nie ma tu znaczenia, jeśli tylko możesz skorzystać z biblioteki ComObj i obsługi technologii COM. Również Twoje informacje na temat wersji Office (czy ew. systemu) nie są prawdziwe. Ja osobiście korzystałem z D5 + WXP + Office 2000 i D5 + WXP + Office 2007. Myślę jednak, że większość (jeśli nie wszystkie) kombinacji wersji Delphi, systemu i Office'a będzie ze sobą współpracować, jeśli kod jest prawidłowo napisany.

Zerknij na moje (i innych) posty w tym wątku:
http://4programmers.net/Forum/519052,

a powinieneś znaleźć tam sporo cennych informacji.

0

Wielce szanowny Trejderze
Delphi 4 Prof nie rozumie dyrektywy : uses Variants, dlatego używam uses Excel_TLB - podłączenie do biblioteki typów dostarczanej z Office 97. Czy takie biblioteki dostarczane są z Office 2000 lub 2003?
Moje rozwiązanie dla mnie laika ma ogromną zaletę - do kolejnych funkcjonalności Excela dostaję się po kropce (z podpowiedziami) jakby to był kawałek delphi.
Pozdrawiam

0
Andrzej_m napisał(a)

Delphi 4 Prof nie rozumie dyrektywy : uses Variants,

Tej biblioteki nie ma również w Delphi 5. Na szczęście jest to tylko kosmetyka - większość definicji w niej zawartych została przeniesiona z innych plików źródłowych. Dlatego kompilując pod Delph 5, 4 i wcześniejszymi projekt zawierający w uses Variants należy po prostu usunąć to odwołanie. W 95% przypadków kompilacja będzie możliwa bez żadnych problemów.

Andrzej_m napisał(a)

dlatego używam uses Excel_TLB - podłączenie do biblioteki typów dostarczanej z Office 97. Czy takie biblioteki dostarczane są z Office 2000 lub 2003?

Excel_TLB nie jest nie jest biblioteką Office'a! Jest translacją odpowiednich bibliotek Office'owych na potrzeby konkretnej wersji Delphi. W każdej wersji Delphi (niezależnie od wersji posiadanego Office'a) możesz sobie wygenerować taki plik. W tym celu wybierz Project > Import Type Library i wybierz Microsoft Excel Object Library (na przykładzie Delphi 5), następnie kliknij Create Unit i po sprawie. Tej biblioteki możesz używać z dowolnym Office'm. Np. ja wykorzystuję go zarówno z najnowszym Office 2007, jak i sporo starszym Office 2000 i w obu przypadkach działa idealenie.

Jeżeli umiesz język angielski to polecam ten artykuł:
http://www.google.com/search?q=Delphi%20and%20Microsoft%20Office:%20Automating%20Excel%20and%20Word

Jest napisany językiem dla idiotów i na 30 stronach jest tyle informacji, które normalny autor zawarłby na 5-10. Ale generalnie daje sporo ciekawych przykładów i rad na temat używania Delphi wraz z Excelem i Wordem.

0

To teraz ja mam pytanko. Jak do diabła zmienić GRUBOŚĆ linii (serii) na wykresie? Szlag mnie trafia, bo Excel 2007 domyślnie daje grubość 2,25 punkta, która jest stanowczo za gruba dla mnie.

W Delphi + Excel umiem dość sporo jeśli chodzi o wykresy. Oto przykład dla kogoś szukającego podstaw:

procedure TForm1.Button7Click(Sender: TObject);
var
        DataRange, Chart, Sheet: Variant;
        i: Integer;
const
        xlFreeFloating = $00000003;
        xlXYScatterSmoothNoMarkers = $00000049;
        xlMarkerStyleNone = $FFFFEFD2;
        xlLegendPositionBottom = $FFFFEFF5;
begin
        //Initiate Delphi random generator;
        Randomize();
        
        //Call up Excel, add one workbook with one sheet and give it a name
        XLApplication := CreateOleObject('Excel.Application');
        XLApplication.Visible := True;
        XLApplication.DisplayAlerts := False;
        XLApplication.Workbooks.Add(xlWorksheet);
        XLApplication.Workbooks[1].Sheets[1].Name := 'Data';

        //Select proper worksheet
        Sheet := XLApplication.Workbooks[1].Sheets['Data'];

        //Fill some random data
        for i := 1 to 3 do Sheet.Cells[1, i + 1] := 'Param ' + IntToStr(i);

        for i := 1 to 10 do
        begin
                Sheet.Cells[i + 1, 1] := Now() - i + 1 + Random;
                Sheet.Cells[i + 1, 1].NumberFormat := 'rrrr-mm-dd gg:mm:ss';
                Sheet.Cells[i + 1, 2] := Random;
                Sheet.Cells[i + 1, 3] := Random;
                Sheet.Cells[i + 1, 4] := Random;
        end;

        //Add chart inside worksheet and give it a name
        Sheet.Shapes.AddChart.Name := 'chrt1';

        //You can access chart by name or by index
        //This example shows relative sizing and positioning of a chart
        //Force chart to be placed in exactly specified row and column
        //and have width and height relative to exactly specified number of rows or columns
        Sheet.ChartObjects('chrt1').Left := Sheet.Columns.Columns[5].Left;
        Sheet.ChartObjects('chrt1').Top := Sheet.Rows.Rows[1].Top;
        Sheet.ChartObjects(1).Width := Sheet.Columns.Columns[10].Left;
        Sheet.ChartObjects(1).Height := Sheet.Rows.Rows[28].Top;

        //Make it floating - i.e. don't move or resize along with cells underneath it...
        Sheet.ChartObjects(1).Placement := xlFreeFloating;

        //Example of accessing chart inside chartobject object
        Chart := Sheet.ChartObjects(1).Chart;

        //Set title and legend
        Chart.HasTitle := True;
        Chart.ChartTitle.Text := 'Delphi-Excel Automation Chart Example';
        Chart.ChartType := xlXYScatterSmoothNoMarkers;
        Chart.HasLegend := True;
        Chart.Legend.Position := xlLegendPositionBottom;

        //Delete all automatically added Series
        for i := Chart.SeriesCollection.Count downto 1 do
                Chart.SeriesCollection(i).Delete;

        //Add new series and format it
        //Two ways of achieving it. One - by range selection:
        //DataRange := XLApplication.Union(Sheet.Range['A1:A11'], Sheet.Range['C1:C11']);
        //Chart.SeriesCollection.Add(DataRange, 2, True, True, False);
        //Two: by relative cells numbers (usefull in loops):
        for i := 1 to 3 do
        begin
                Chart.SeriesCollection.NewSeries;
                Chart.SeriesCollection(i).XValues := '=Data!R2C1:R11C1';
                Chart.SeriesCollection(i).Values := '=Data!R2C' + IntToStr(i + 1) + ':R11C' + IntToStr(i + 1);
                Chart.SeriesCollection(i).Name := 'Parametrek ' + IntToStr(i); // Addressing like '=Data!R1C2' for Name does DOESN'T work in Delphi 5!
                Chart.SeriesCollection(i).Smooth := False;
                Chart.SeriesCollection(i).MarkerStyle := xlMarkerStyleNone;
        end;

        //Add trendline - if you need one
        //Chart.SeriesCollection(1).Trendlines.Add(xlLinear, 'Linear Trend');
end;

Ale grubości linii nie da się zmienić w ten sposób, albo ja jestem ślepy. Próbowałem różnych sposobów. Grzebałem w pliku pomocy do Excel 2007 Visual Basic, szukałem w necie, nawet próbowałem odpalić makro w Excelu. I nic. Makro nie rejestruje takiej opercji, jak zmiana grubości linii (serii danych) na wykresie. Gdyby ktoś miał jakiś pomysł - byłbym wdzięczny.

0

No i sam sobie odpowiadam. Może się to komuś przyda...

var
        Excel, Chart, DataRange: Variant;
begin
        Excel := CreateOleObject('Excel.Application');
        Excel.Visible := True;
        Excel.Charts.Add.Activate;
        Chart := Excel.ActiveChart;
        DataRange := Sheet.Range['A1:A10'];
        Chart.SeriesCollection.Add(DataRange, 2, True, False, False);
        Chart.SeriesCollection(1).Border.Weight := xlThin;
end;

Ostatnia linijka rozwiązuje problem...

0

Jeden mały problem. Skopiowałem to co było napisane 6 marca 2009, dałem XLApplication:variant, dodałem COMOBJ w uses, skompilowałem, uruchomiłem i.... komunikat:
Method 'AddChart' not supported by automation object.
Pytanie - co robic, by wykres powstał?

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