Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Экспортирование данных Из MsSQL c помощью С#


Автор: n00d13 26.7.2005, 15:22
Есть софтина выбираюшие данные из бд на MsSQL через ADO.NET
А вот как сделать чтобы она эти данные могла загонять в фаил *.doc/*.xls
Вопрос как вот реализовать такую вешЧь с помошью C#???
Спасибо.

Автор: Дрон 26.7.2005, 16:43
Цитата(n00d13 @ 26.7.2005, 16:22)
Вопрос как вот реализовать такую вешЧь с помошью C#???

При помощи Excel (или Word) automation, естественно smile

Только для этого, к сожалению, нужен установленный офис.

ЗЫ: Я бы рекомендовал использовать XML совместно с XSLT для создания читаемых документов на основе выборок.


Автор: Дрон 26.7.2005, 17:09
Если пользуемся Visual Studio .NET

То жмём правой кнопкой на References проекта -> Add Reference...
Вкладка COM
Там выбираем Microsoft Excel xx Object Library (где xx - версия библиотеки, для Excel 2003 - 11.0)
Двойной щелчок по ней, жмём ОК.

Теперь в проекте пишем что-то вроде

Код

            Excel.Application app = new Excel.ApplicationClass();
            app.Workbooks.Add(Type.Missing);
            Excel.Worksheet ws = (Excel.Worksheet)app.Worksheets[1];
            for(int i=1;i<=10;i++)
                for(int j=1;j<=10;j++)
                    (ws.Cells[i,j] as Excel.Range).set_Value(Type.Missing,i*j);
            ws.SaveAs(@"C:\test.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                               Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            app.Quit();


В итоге в файле C:\test.xls будет таблица умножения smile

Внимание:
Если выкидывает исключение Access Denied, то делаем следующие манипуляции:
Запускаем из командной строки: dcomcnfg
В нём находим Microsoft Excel Application (в WinXP оно в Component Services\Computers\My Computer\DCOM Config)
Правой кнопкой -> Properties
Вкладка Security -> Группа Access Permissions
Устанавливаем Customize, жмём Edit добавляем своего пользователя с флажком Allow.

Автор: master of universe 26.7.2005, 21:54
Не надо так извращаться. Пишешь всё в HTML файлик потом открываешь вордом экселем браузером любым другим офисным пакетом. Эксель отлично понимает таблицы. Забудь про ком и совместимости версий оффиса у клиентов.

Автор: mr.DUDA 26.7.2005, 23:20
Цитата(master @ 26.7.2005, 21:54)

Не надо так извращаться. Пишешь всё в HTML файлик потом открываешь вордом экселем браузером любым другим офисным пакетом. Эксель отлично понимает таблицы. Забудь про ком и совместимости версий оффиса у клиентов.

Изврат, имхо. Эксель стопудово понимает только CSV-формат с разделителями, либо свой "родной" формат.

Автор: n00d13 27.7.2005, 15:10
10x всем за ответы!
--
2Дрон,
А можно код с комментами ?
зы. НУ ньюб я. 8)

Автор: Дрон 27.7.2005, 18:44
Цитата(n00d13 @ 27.7.2005, 16:10)
А можно код с комментами ?
зы. НУ ньюб я. 8)

Странные для новичка задачи ты ставишь smile
Как создать проект и сделать выборку из базы ты, надеюсь, знаешь?

Код

// открываем ёксель 
            Excel.Application app = new Excel.ApplicationClass();
// добавляем новую книгу (Workbook)
            app.Workbooks.Add(Type.Missing);
// выбираем первый лист (Worksheet) из книги
            Excel.Worksheet ws = (Excel.Worksheet)app.Worksheets[1];
// циклы
            for(int i=1;i<=10;i++)
                for(int j=1;j<=10;j++)
// в ячейку i,j пишем значение i*j
                    (ws.Cells[i,j] as Excel.Range).set_Value(Type.Missing,i*j);
//  сохраняем документ
            ws.SaveAs(@"C:\test.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                               Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
// закрываем ёксель
            app.Quit();


По хорошему надо MSDN почитать по этому поводу, т.к. реально я этот код набросал методом тыка и детали объяснить не могу.


ЗЫ: Я бы всё-таки не извращался а сделал так:
Код
select ... from ... for xml

к результату выборки добавил бы нужный xsl и получил бы готовый документ, который можно смотреть хоть в Internet Explorer, хоть в Microsoft Word

Автор: n00d13 28.7.2005, 07:08
Цитата
Странные для новичка задачи ты ставишь smile
Как создать проект и сделать выборку из базы ты, надеюсь, знаешь?

ДА.Это сделал.
Тогда можно мушшина я вас дальше попытаю?
Вопрос в том. Если вы знаете какой код минимизирует и ресторит приложение.
А то закрывать как занем а вот такие рюшечки незнаем.
Ааа ещё как заставлять приложение сворачивать в трей?
Иконка то делаеться а как сворачивать. Незнамо 8)
Зарание благодарю.


Автор: mr.DUDA 28.7.2005, 08:04
Модератор: Пожалуйста, один топик - один вопрос.

Цитата(n00d13 @ 28.7.2005, 07:08)
Если вы знаете какой код минимизирует и ресторит приложение.

this.WindowState = FormWindowState.Minimized;
и
this.WindowState = FormWindowState.Normal;

Цитата(n00d13 @ 28.7.2005, 07:08)
Ааа ещё как заставлять приложение сворачивать в трей?

Просто делай this.Visible = false при сворачивании формы, и this.Visible = true при клике по иконке в трее. Чтобы узнать о том, что форма свёрнута, подписывайся на событие Resize:
Код

        private void Form1_Resize(object sender, System.EventArgs e)
        {
            if(this.WindowState == FormWindowState.Minimized)
                this.Visible = false;
        }


Автор: n00d13 28.7.2005, 14:27
2 Дрон,
Всё работает только пришлось сделать так
Код

Microsoft.Office.Interop.Excel

По другому не хотел бегать.

А можешь объяснить этот момент.
Код

            for(int i=1;i<=10;i++)    
                for(int j=1;j<=10;j++)    

                    (ws.Cells[i,j] as Excel.Range).set_Value(Type.Missing,i*j);

Что тут каr дышит,почему работает?
Просто хотел прикрутить сюда чтобы он высасывал всё из MsSQL через адаптЕр.
зы.Кста полазил на MSDN там всё по другому чем у тебя но тоже работает.(странно 8)

2 Модератор,
Извиняюсь.Просто тут отвечают на мои глупости я подумал может это временно и завтро не будут вот и оплошал.

Автор: Дрон 28.7.2005, 14:35
Microsoft.Office.Interop.Excel -- это вроде от других версий ёкселя. Но разницы никакой.

Самая интересная строчка тут:

Код
(ws.Cells[i,j] as Excel.Range).set_Value(Type.Missing,i*j);


В ней в ячейку на i-й строке j-м столбце записывается значение i*j.

Пусть у тебя есть DataTable с именем tbl. Чтобы перенести её на лист екселя тебе нужно написать что-то вроде (не проверял, но по-идее так):
Код

for(int i=0; i< tbl.Rows.Count; i++)
   for(int j=0; j<tbl.Columns.Count; j++)
       (ws.Cells[i+1 ,j+1] as Excel.Range).set_Value(Type.Missing, tbl.Rows[i][j].ToString());

Автор: n00d13 28.7.2005, 15:12
2 Дрон,
10x Всё пашит только пришло дополнительно ДатаТаблю делать.(У мну просто были дата сорсы с дбГридо)
зы.Чувак я твой фанат!
зыы.Ещё раз спасибо!

Автор: Дрон 4.8.2005, 19:13
Подниму тему, т.к. нашёл в своём коде недочёт smile

Нужно писать не так:
Код
Excel.Application app = new Excel.ApplicationClass();

а вот так:
Код
Excel.Application app = new Excel.Application();


Источник: http://blogs.msdn.com/ptorr/archive/2004/2/5.aspx

Автор: Papirus 5.8.2005, 09:46
Цитата
а вот так:

код C#
Код

1:

Excel.Application app = new Excel.Application();

Я наступил на эти грабли, когда сделал такую ссылку. У меня Офис 2003 - у пользователей ХР. Облом.
Удали ссылку на EXCEL из References, использовал такое объявление (пардон, что ВБ) и заработало у всех независимо от версии Офиса.
Код


Dim app, ws  as Object

app = CreateObject("Excel.Application")
ws = app.Worksheets.Add

Прикиньте еще такой момент. В прежних версиях ADO для вставки набора записей из рекордсета в EXCEL достаточно было одной строки (оч быстро работает)

Код

ws.Range("A1").CopyromRecordset  rs

где rs - открытый рекордсет.
Точно также в массив ячеек можно вставить данные из массива одной командой, определив предварительно область вставки в точности совпадающей с размерностью и количестьвом элементов массива. Вероятно из таблицы датасета тоже можно, но не пробовал - нет пока потребности.
Добавлено @ 09:48
CopyFromRecordset пардон так правильно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)