З dbgrid в excel

З DBGrid в Excel.

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

подивися на закладці компонентів Servers
а в датасета пробігає по записах і пересилати на обраний сервер з урахуванням форматування

Взагалі-то MS Excel вміє вантажити майже будь-які файли, тобто наприклад у нього є * .csv, в яких роздільник стовпчиків є ";", а сам файл ніщо інше як звичайний текстовік. наприклад
Прізвище ім'я по батькові
Іванов, Іван; Іванович
.

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

Крім того можна вантажити файли і з іншим символом як роздільник, в самому Excel "e є режим дозволяє вибрати роздільник, а також можна вантажити файли указавая ширину стлобца. Як видно варіантів досить, вибирайте самі.

procedure TForm1.btnExportClick (Sender: TObject);
var

XL, // Додаток Excel
TableVals. Variant; # XA0;
i, LineCounter, # XA0;
queSelectRecCount,
queSelectFieldsCount. Integer;
begin

with queSelect do
begin
SQL.Assign (memSelect.Lines);
DatabaseName: = edtDatabaseName.Text;
Open;

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;

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. Але ти нічого не написав про процедури, що зберігаються. Або я знову нічого не зрозумів. )

з.и. Допоможіть розібратись.

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

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

і все

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


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

Тому що не знають варіант краще. )
З 2-х, запропонованих (знайдених на форумі) цей був принаймні зрозуміліше.

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

"Excel 5.0;" - це версія? А навіщо вказувати?
INTO Table1 - Це вказівка, з якого компонента (в моєму випадку ADOQuery) беремо дані для Excel?

> "Excel 5.0;" - це версія? А навіщо вказувати?
це вказівка ​​jet-у (приклад для нього / access (!)) використовувати isam Excel для вивантаження.

> INTO Table1 - Це вказівка, з якого компонента (в моєму випадку ADOQuery) беремо дані для Excel?
ADOQuery тут взагалі ні до чого, все на рівні бази, який компонент використовувати на це соверщенно наплювати, хоч квері (але краще ADOCommand), а Table1 це ім'я таблици в access і листа в excel (свої підстав).


>] Sniknik

Я використовую ADO + MSSQL.
Дякуємо. Все спрацювало для Access. Протести.
Для MSSQL "Excel 5.0;" писати або щось інше? Будинки MSSQL "я немає. Просто я з поняттям" isam Excel "не стикався.

Вибач, якщо дістав, але вже з'ясовувати, то до кінця.


> Яким чином інформацію, що міститься в DBGrid можна загнати
> В Excel?

www.EhLib.com

> Для MSSQL "Excel 5.0;" писати або щось інше?
природно інше, # XA0; OPENROWSET, OPENDATASOURSE синтаксис см. В BOL, для Ексель прям там в прикладах є.


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

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

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

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

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


>> Для MSSQL "Excel 5.0;" писати або щось інше?
> Природно інше, # XA0; OPENROWSET, OPENDATASOURSE синтаксис
> См. В BOL, для Ексель прям там в прикладах є.

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

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

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

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

SELECT # XA0; *
FROM # XA0; # XA0; # XA0; OPENDATASOURCE (
# XA0; # XA0; # XA0; # XA0; "SQLOLEDB",
# XA0; # XA0; # XA0; # XA0; "Data Source = ServerName; User ID = MyUID; Password = MyPass"
# XA0; # XA0; # XA0; # XA0; ) .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",
# XA0; "Data Source =" c: \ Finance \ account.xls "; User ID = Admin; Password =; Extended properties = Excel 5.0"). xactions

Схожі статті