Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

Из DBGrid в Excel.   Найти похожие ветки 

 
shestoff ©   (2005-02-23 04:54) [0]

Подскажите, пожалуйста, начинающему: каким образом информацию, содержащуюся в DBGrid можно загнать в Excel? (в DBGrid тяну из таблиц SQL).Спасибо.


 
Desdechado ©   (2005-02-23 10:18) [1]

посмотри на закладке компонентов Servers
а в датасете пробегаешься по записям и пересылаешь на выбранный сервер с учетом форматирования


 
_Lucky_   (2005-02-23 10:55) [2]

Вообще-то MS Excel умеет грузить почти любые файлы, т.е. например у него есть *.csv, в которых разделителим столбцов является ";", а сам файл ничто иное как обычный текстовик. Например
Фамилия;Имя;Отчество
Иванов;Иван;Иваныч
....

Т.о. надо пробежатся по всему гриду и сохранить в файле с расширение *.csv, поля при этом отделив точкой с запятой.

Кроме того можно грузить файлы и с другим символом в качестве разделителя, в самом Excel"e есть режим позволяющий выбрать разделитель, а также можно грузить файлы указавая ширину стлобца. Как видно вариантов достаточно, выбирайте сами.


 
Dell3r ©   (2005-02-23 14:37) [3]

procedure TForm1.btnExportClick(Sender: TObject);
var

XL, // Приложение Excel
TableVals : Variant;  
i, LineCounter,  
queSelectRecCount,
queSelectFieldsCount : Integer;
begin

inherited;
try
Application.ProcessMessages;
Screen.Cursor := crSQLWait;

with queSelect do
begin
SQL.Assign(memSelect.Lines);
DatabaseName := edtDatabaseName.Text;
Open;
{AMA: Экспорт в Excel}

queSelectRecCount := RecordCount;
queSelectFieldsCount := FieldCount;
TableVals := VarArrayCreate([0, queSelectRecCount-1,
0, queSelectFieldsCount-1], varOleStr);

First;
LineCounter := 0;
while not EOF do
begin
for i := 0 to queSelectFieldsCount-1 do
if not Fields[i].IsNull then
TableVals[LineCounter, i] := Fields[i].AsString
else
TableVals[LineCounter, i] := "";
LineCounter := LineCounter + 1;
Next;
end;
Close;
end;

try
try
XL := GetActiveOleObject("Excel.Application");
except
XL := CreateOleObject("Excel.Application");
end;
except
raise Exception.Create("Не могу запустить Excel");
end;

XL.Visible := True;
XL.Workbooks.Add;
XL.Range[XL.Cells[1,1],
XL.Cells[queSelectRecCount,
queSelectFieldsCount]].Value := TableVals;
XL.Range[XL.Cells[1,1],
XL.Cells[queSelectRecCount,
queSelectFieldsCount ]].Borders.Weight := 2;
finally
Screen.Cursor := crDefault;
end;
end;


 
Megabyte ©   (2005-02-24 23:04) [4]

Dell3r, решил использовать твой код.
Есть небольшая поправка и несколько вопросов.
1) Перед "finaally" пропущен один END, закрывающий With.

2) Как я понял, queSelect - это компонент TQuery.
А "memSelect.Lines" - это компонент TMemo?(или я не так понял, и не очень понимаю, для чего эта строка)
3)Я использую ADO, в связи с этим еще вопрос:
"DatabaseName := edtDatabaseName.Text;". В ADOQuery нет свойства "DataBaseName". Я так понял, что "edtDatabaseName" - компонент "TEdit". Я просто удалил эту строку. :)
4) Приложние нормально запустилось. Когда дело дошло до исполнения данного кода, выдало ошибку: "Project Vibor.exe raised Exception class EoleException with message “Could not find stored procedure MemSelect” Process stopped…"
Вроде, если перевести на русский, то не находит хранимую процедуру MemSelect. Но ты ничего не написал про хранимые процедуры. Или я опять ничего не понял? :)

з.ы. Помогите разобраться...


 
sniknik ©   (2005-02-25 01:02) [5]

ну почему всегда выбирают самый сложный и тормозной путь? (риторический вопрос)
зачем вообше грид? почему не выгружать из базы? это же проще, и быстрее, зачем сначала туда потом обратно?
к примеру (база неуказана, но к примеру c access базой (подключением) можно)

SELECT * INTO Table1 IN "D:\Excel.xls" "Excel 5.0;" FROM Table1

и все

если всетаки хочется через OLE с гридом
ну хотя бы так

var
 Excel, WorkBook, Sheet: Variant;
 DataSet: TADODataSet;
 i: integer;
begin
 Screen.Cursor:= crHourGlass;
 try
   try
     Excel:= CreateOleObject("Excel.Application");
     Excel.SheetsInNewWorkbook:= 1;
     WorkBook:= Excel.WorkBooks.Add;
     Sheet:= WorkBook.WorkSheets[1];
     DataSet:= TADODataSet(DBGrid.DataSource.DataSet);
     for i:= 0 to DataSet.FieldDefs.Count-1 do
       Sheet.Cells[1, i+1].Value:= DataSet.FieldDefs.Items[i].DisplayName;
     Sheet.Range["a2"].CopyFromRecordset(DataSet.Recordset);

     Excel.Visible:= true;
   except
     on E: Exception do
       MessageBox(handle, PChar("Попытка выгрузить данные в Excel завершилась ошибкой :"#13#10+
                                E.Message+
                                #13#10"Проверьте наличие Excel-я на компьютере .") , "Ошибка", MB_ICONERROR+MB_OK)
   end;
 finally
   Excel:= Unassigned;
   Screen.Cursor:= crDefault;
 end;
end;


 
Megabyte ©   (2005-02-25 01:34) [6]


> ] sniknik:ну почему всегда выбирают самый сложный и тормозной путь? (риторический вопрос)

Потому что не знают вариант лучше. :)
Из 2-х, предложеных(найденных на форуме) этот был по крайней мере понятнее.

> SELECT * INTO Table1 IN "D:\Excel.xls" "Excel 5.0;" FROM
> Table1

"Excel 5.0;" - это версия? А зачем указывать?
INTO Table1 - Это указание, из какого компонента (в моем случае ADOQuery) берем данные для Excel?


 
sniknik ©   (2005-02-25 08:10) [7]

> "Excel 5.0;" - это версия? А зачем указывать?
это указание jet-у (пример для него / access(!)) использовать isam Excel для выгрузки.

> INTO Table1 - Это указание, из какого компонента (в моем случае ADOQuery) берем данные для Excel?
ADOQuery здесь вообще не при чем, все на уровне базы, какой компонент использовать на это соверщенно наплевать, хоть квери (но лучше ADOCommand), а Table1 это имя таблици в access и листа в excel (свои подставь).


 
Megabyte ©   (2005-02-25 16:44) [8]


> ] sniknik

Я использую ADO+MSSQL.
Спасибо. Все сработало для Access. Протестил.
Для MSSQL "Excel 5.0;" писать или что-то другое? Дома MSSQL"я нет. Просто я с понятием "isam Excel" не сталкивался.

Извини, если достал, но уж выяснять, то до конца.


 
Соловьев ©   (2005-02-25 17:21) [9]


> каким образом информацию, содержащуюся в DBGrid можно загнать
> в Excel?

www.EhLib.com


 
sniknik ©   (2005-02-25 19:08) [10]

> Для MSSQL "Excel 5.0;" писать или что-то другое?
естественно другое,  OPENROWSET, OPENDATASOURSE синтаксис см. в BOL, для екселя прям там в примерах есть.


 
Девушка ©   (2005-02-25 20:45) [11]


> SELECT * INTO Table1 IN "D:\Excel.xls" "Excel 5.0;" FROM
> Table1

Классно!!!
А можно так же, только из Access в IB?


 
sniknik ©   (2005-02-25 23:42) [12]

> А можно так же, только из Access в IB?
ну, попробовать можно, isam для ODBC тоже есть (через него подобный "фокус" с MSSQL проходит, т.ю. не из MSSQL что нормально, а именно из аксесса).


 
sniknik ©   (2005-02-26 00:23) [13]

нда, даже не интересно... с первой же попытки прошло
скачал драйвер gemini, поставил настроил DSN - Gemini. запрос
SELECT * INTO [ODBC;DSN=Gemini;].Table1 FROM Table1
отработал без проблем.


 
Step[B.M.]   (2005-02-26 09:31) [14]

.Проблемы с експортированием отпадут если будешь юзать DBGridEh из библиотеки EhLib. Для нашей братвы от бесплатный, вот только резмеры будущего ЕХЕ шника смущают ...


 
Megabyte ©   (2005-03-01 16:13) [15]


> > Для MSSQL "Excel 5.0;" писать или что-то другое?
> естественно другое,  OPENROWSET, OPENDATASOURSE синтаксис
> см. в BOL, для екселя прям там в примерах есть.

Кучу сайтов, форумов, факов перерыл. Нигде не нашел ни одного примера экспортирования из MSSQL в Excel через SQL-запрос(только через OLE). :(
А так понравилось решение. Не знаю, какой синтаксис нужен для MSSQL"я.
Что такое BOL, я не знаю? Подскажите неправление, хоть где искать?


 
Shirson ©   (2005-03-02 08:29) [16]

>Megabyte

В чём суть экспортирования из MSSQL в Excel именно через SQL-запрос?
Дело в том, что MSSQL может напрямую выбрасывать данные в XL. В DTS есть даже connection Microsoft Excel. Настраиваешь пакет и запускаешь когда надо. Но тут есть один подводный камень - понятия не имею почему, но MSSQL и Excel не дружат на уровне .xls файлов. Данные вываленные именно в .xls получаются "проблемные". Напрмер числа идут как текст, если поле (varcahr или иже с ним) содержит записи чисто из чисел, перемежающиеся с записями с текстом, то либо текст, либо числа не выводятся.
Поэтому, самое удобное решение основывается на предложении _Lucky_ [2].
В DTS создаётся пакет, который выбрасывает информацию в .csv, которая потом загружается в XL.


 
sniknik ©   (2005-03-02 08:34) [17]

> Кучу сайтов, форумов, факов перерыл.
тебя сразу в BOL послали. букс онлайн, справка MSSQL с ним и идет. смотриш раздел по указаным словам... имееш -

Examples
This example accesses data from a table on another instance of SQL Server.

SELECT   *
FROM      OPENDATASOURCE(
        "SQLOLEDB",
        "Data Source=ServerName;User ID=MyUID;Password=MyPass"
        ).Northwind.dbo.Categories

This is an example of a query against an Excel spreadsheet through the OLE DB provider for Jet.

SELECT *
FROM OpenDataSource( "Microsoft.Jet.OLEDB.4.0",
 "Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0")...xactions




Страницы: 1 вся ветка

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

Наверх





Память: 0.51 MB
Время: 0.037 c
6-1106656964
Separator
2005-01-25 15:42
2005.03.27
WM_RASDIALEVENT


3-1109053846
WondeRu
2005-02-22 09:30
2005.03.27
MSSQL. Настройка репликации


1-1111061635
Быстрый Шу
2005-03-17 15:13
2005.03.27
Приведение типа Variant


6-1106623413
OneFragLeft
2005-01-25 06:23
2005.03.27
Broadcast передача файлов по Lan


1-1110377855
Bogdan
2005-03-09 17:17
2005.03.27
Создание инсталяционного пакета





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский