![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Из DBGrid в Excel.
shestoff © (2005-02-23 04:54:00)Подскажите, пожалуйста, начинающему: каким образом информацию, содержащуюся в DBGrid можно загнать в Excel? (в DBGrid тяну из таблиц SQL).Спасибо.
sniknik (2005-03-02 08:34:00) [1]> Кучу сайтов, форумов, факов перерыл.
тебя сразу в 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
Shirson (2005-03-02 08:29:00) [2]>Megabyte
В чём суть экспортирования из MSSQL в Excel именно через SQL-запрос?
Дело в том, что MSSQL может напрямую выбрасывать данные в XL. В DTS есть даже connection Microsoft Excel. Настраиваешь пакет и запускаешь когда надо. Но тут есть один подводный камень - понятия не имею почему, но MSSQL и Excel не дружат на уровне .xls файлов. Данные вываленные именно в .xls получаются "проблемные". Напрмер числа идут как текст, если поле (varcahr или иже с ним) содержит записи чисто из чисел, перемежающиеся с записями с текстом, то либо текст, либо числа не выводятся.
Поэтому, самое удобное решение основывается на предложении _Lucky_ [2].
В DTS создаётся пакет, который выбрасывает информацию в .csv, которая потом загружается в XL.
Megabyte (2005-03-01 16:13:00) [3]
> > Для MSSQL "Excel 5.0;" писать или что-то другое?
> естественно другое, OPENROWSET, OPENDATASOURSE синтаксис
> см. в BOL, для екселя прям там в примерах есть.
Кучу сайтов, форумов, факов перерыл. Нигде не нашел ни одного примера экспортирования из MSSQL в Excel через SQL-запрос(только через OLE). :(
А так понравилось решение. Не знаю, какой синтаксис нужен для MSSQL'я.
Что такое BOL, я не знаю? Подскажите неправление, хоть где искать?
Step[B.M.] (2005-02-26 09:31:00) [4].Проблемы с експортированием отпадут если будешь юзать DBGridEh из библиотеки EhLib. Для нашей братвы от бесплатный, вот только резмеры будущего ЕХЕ шника смущают ...
sniknik (2005-02-26 00:23:00) [5]нда, даже не интересно... с первой же попытки прошло
скачал драйвер gemini, поставил настроил DSN - Gemini. запрос
SELECT * INTO [ODBC;DSN=Gemini;].Table1 FROM Table1
отработал без проблем.
sniknik (2005-02-25 23:42:00) [6]> А можно так же, только из Access в IB?
ну, попробовать можно, isam для ODBC тоже есть (через него подобный "фокус" с MSSQL проходит, т.ю. не из MSSQL что нормально, а именно из аксесса).
Девушка (2005-02-25 20:45:00) [7]
> SELECT * INTO Table1 IN "D:\Excel.xls" "Excel 5.0;" FROM
> Table1
Классно!!!
А можно так же, только из Access в IB?
sniknik (2005-02-25 19:08:00) [8]> Для MSSQL "Excel 5.0;" писать или что-то другое?
естественно другое, OPENROWSET, OPENDATASOURSE синтаксис см. в BOL, для екселя прям там в примерах есть.
Соловьев (2005-02-25 17:21:00) [9]
> каким образом информацию, содержащуюся в DBGrid можно загнать
> в Excel?
www.EhLib.com
Megabyte (2005-02-25 16:44:00) [10]
> ] sniknik
Я использую ADO+MSSQL.
Спасибо. Все сработало для Access. Протестил.
Для MSSQL "Excel 5.0;" писать или что-то другое? Дома MSSQL'я нет. Просто я с понятием "isam Excel" не сталкивался.
Извини, если достал, но уж выяснять, то до конца.
sniknik (2005-02-25 08:10:00) [11]> "Excel 5.0;" - это версия? А зачем указывать?
это указание jet-у (пример для него / access(!)) использовать isam Excel для выгрузки.
> INTO Table1 - Это указание, из какого компонента (в моем случае ADOQuery) берем данные для Excel?
ADOQuery здесь вообще не при чем, все на уровне базы, какой компонент использовать на это соверщенно наплевать, хоть квери (но лучше ADOCommand), а Table1 это имя таблици в access и листа в excel (свои подставь).
Megabyte (2005-02-25 01:34:00) [12]
> ] 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 01:02:00) [13]ну почему всегда выбирают самый сложный и тормозной путь? (риторический вопрос)
зачем вообше грид? почему не выгружать из базы? это же проще, и быстрее, зачем сначала туда потом обратно?
к примеру (база неуказана, но к примеру 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-24 23:04:00) [14]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. Но ты ничего не написал про хранимые процедуры. Или я опять ничего не понял? :)
з.ы. Помогите разобраться...
Dell3r (2005-02-23 14:37:00) [15]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;
_Lucky_ (2005-02-23 10:55:00) [16]Вообще-то MS Excel умеет грузить почти любые файлы, т.е. например у него есть *.csv, в которых разделителим столбцов является ";", а сам файл ничто иное как обычный текстовик. Например
Фамилия;Имя;Отчество
Иванов;Иван;Иваныч
....
Т.о. надо пробежатся по всему гриду и сохранить в файле с расширение *.csv, поля при этом отделив точкой с запятой.
Кроме того можно грузить файлы и с другим символом в качестве разделителя, в самом Excel'e есть режим позволяющий выбрать разделитель, а также можно грузить файлы указавая ширину стлобца. Как видно вариантов достаточно, выбирайте сами.
Desdechado (2005-02-23 10:18:00) [17]посмотри на закладке компонентов Servers
а в датасете пробегаешься по записям и пересылаешь на выбранный сервер с учетом форматирования