Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/89: Рейтинг темы: голосов - 89, средняя оценка - 4.52
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235

Экспорт и импорт данных в Excel

14.03.2012, 23:37. Показов 16558. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Есть задание В проект добавьте команду/кнопку экспорта данных выборки из БД в файл Excel. Добавьте команду/кнопку загрузки данных в одну из таблиц БД из файла Excel.
Собственно сразу и загвоздка. Как программно работать с exel? Вычитал, что можно работать с екселем как с обычной базой данных, т.е. через oledb. Но написать рабочий запрос не могу. Собственно, прошу помочь, хоть чем.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.03.2012, 23:37
Ответы с готовыми решениями:

Экспорт-импорт данных Excel-Access-Excel
Доброе время суток уважаемые форумчане. Приходит информация в экселевской таблице. Скидываю её в общую базу в Access. Для отчета...

Импорт/Экспорт данных Excel
Просьба помочь начинающим. Пытаюсь сделать импорт/экспорт с экселем но пока тщетно. Знания на уровне начинающего. Суть такова. ...

Импорт и экспорт данных в Excel
Принимаю небольшой массив данных через COM порт, который хочу записывать в Excel файл и в дальнейшем с него же и считывать данные, но до...

10
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
15.03.2012, 10:18
Используйте Microsoft.Office.Interop.Excel, а ещё лучше библиотеку работающую напрямую с файлом, а не через COM, например NPOI. OLE для выгрузки в Excel - изврат, имхо.
1
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
15.03.2012, 15:48
Используй OleDbConnection для подключения к файлу Excel как к базе данных.
Строку подключения спросите у Гугла.

ИМХО это самый простой способ.
0
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
21.03.2012, 21:55  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
Используй OleDbConnection для подключения к файлу Excel как к базе данных.
Строку подключения спросите у Гугла.

ИМХО это самый простой способ.
Это да, с подключением у меня проблением не было. Я не знаю как написать правильный запрос, т.к. никогда не работал в sql с exel.
Вот, что написал:
C#
1
2
3
4
5
6
           exelbd = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\\list.xls; Extended Properties=Excel 12.0;");
            exelbd.Open();
            cmnd = new OleDbCommand("SELECT * INTO [MS Access;Database=C:\\бд.accdb] FROM [лист1$]", exelbd);
            cmnd.ExecuteNonQuery();
 
            exelbd.Close()
Пишет, что не может найти элемент лист1.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
22.03.2012, 16:12
Лист1 - это название страницы книги Excel. в приложении Excel название страницы можно увидеть её название в самом низу(TabPage)


с Acsess тесно не работал, но вроде у Вас ошибка в запросе вставки.
вот правильный синтаксис.
должно быть что-то вроде

SQL
1
SELECT * INTO [имя новой таблицы] IN [полный путь к ексель] FROM [имя страницы эксель]
еще можно подключить файл Excel как ВНЕШНЮЮ БД или сделать выгрузку Excel в DataTable и уже с DataTale вставить в Acsess
0
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
23.03.2012, 01:15  [ТС]
В общем, такая тема. Сказали мне не извращаться, а делать через Microsoft.Office.Interop.Excel. С открытием данных БД в экселе я разобрался. Осталось научиться доставать оттуда данные и добавлять в БД. Есть какая-нибудь функция?
Вот кстати, как открывается:
C#
1
2
3
app = new Excel.Application();
                openFileDialog1.ShowDialog();
                app.Workbooks.OpenDatabase(openFileDialog1.FileName);
Ведь так?)

Добавлено через 18 минут
Короче проблема решена...но таким идиотским путём, что я не знаю.
Вопрос только один:
Есть какая-нибудь функция?
Встроенная.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
23.03.2012, 13:45
вот рабочий пример:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
       OpenFileDialog fd = new OpenFileDialog();
 
            fd.Multiselect = false;
            DataTable tt = new DataTable();
            if (fd.ShowDialog() == DialogResult.OK)
            {
                OleDbConnection Oleconn;
                OleDbDataAdapter cad = new OleDbDataAdapter();
                OleDbConnectionStringBuilder builder = new OleDbConnectionStringBuilder();
                builder.Provider = "Microsoft.Jet.OLEDB.4.0";
                builder.Add("Extended Properties", "Excel 8.0");
                try
                {
                    builder.DataSource = fd.FileName;
                    Oleconn = new OleDbConnection();
                    Oleconn.ConnectionString = builder.ToString();
                    Oleconn.Open();
                    cad = new OleDbDataAdapter(@"Select * from [statements$]", Oleconn);
 
                    cad.Fill(tt);
 
 
                    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyDb.MsSql"].ConnectionString))
                    {
 
                        scomm = new SqlCommand(@"Insert into Card  ([Trans],[Pay],[Descript])  VALUES (@Trans, @Pay,@Descript)", conn);
                        scomm.Parameters.Add("@Trans", SqlDbType.DateTime).SourceColumn = "Trans";
                        scomm.Parameters.Add("@Pay", SqlDbType.Decimal).SourceColumn = "Pay";
                        scomm.Parameters.Add("@Descript", SqlDbType.NVarChar).SourceColumn = "Descript";
                        SqlDataAdapter adapter = new SqlDataAdapter();
                        adapter.InsertCommand = scomm;
                        adapter.UpdateCommand = new SqlCommand(@"Update Card Set Pay=@Pay, Trans=@Trans, Descript=@Descript", conn);
                        adapter.UpdateCommand.Parameters.Add("@Trans", SqlDbType.DateTime).SourceColumn = "Trans";
                        adapter.UpdateCommand.Parameters.Add("@Pay", SqlDbType.Decimal).SourceColumn = "Pay";
                        adapter.UpdateCommand.Parameters.Add("@Descript", SqlDbType.NVarChar).SourceColumn = "Descript";
                        adapter.Update(tt);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
23.03.2012, 15:02
Вот мой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        
private void saveToolStripButton_Click(object sender, EventArgs e)
        {
            Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
            Workbook ExcelWorkBook;
            Worksheet ExcelWorkSheet;
            //Книга.
            ExcelWorkBook = ExcelApp.Workbooks.Add(System.Reflection.Missing.Value);
            //Таблица
            ExcelWorkSheet = (Worksheet)ExcelWorkBook.Worksheets.get_Item(1);
 
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                for (int j = 0; j < dataGridView1.ColumnCount; j++)
                {
                    if (dataGridView1.Rows[i].Cells[j].GetType().Name == "DataGridViewComboBoxCell")
                    {
                        DataGridViewComboBoxCell dgvcbc = new DataGridViewComboBoxCell();
                        dgvcbc = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells[j];
                        ExcelApp.Cells[i + 1, j + 1] = dgvcbc.EditedFormattedValue;
                    }
                    else
                    {
                        ExcelApp.Cells[i + 1, j + 1] = dataGridView1.Rows[i].Cells[j].Value;
                    }
                }
            }
            //Вызываем нашу созданную эксельку.
            ExcelApp.Visible = true;
            ExcelApp.UserControl = true; 
        }
1
124 / 106 / 7
Регистрация: 14.02.2010
Сообщений: 263
23.03.2012, 15:12
Лучший ответ Сообщение было отмечено как решение

Решение

Пример чтения (возвращает двумерный массив объектов, по умолчанию - рабочая область первого листа книги).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#region Get data from Excel file
protected object[,] getExcelData(string path, int firstRow = 0, int firstColumn = 0, int lastRow = 0, int lastColumn = 0, uint sheetNum = 1)
{
    object[,] data = null;
    Workbook book = null;
    Worksheet sheet = null;
    Range range = null;
    Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
    try
    {
        book = app.Workbooks.Open(path,
            0,              // не обновлять ссылок
            true,           // открыть только для чтения
            5,              // не задавать разделитель
            Type.Missing,   // без пароля
            Type.Missing,   // без пароля
            true,           // не показывать сообщение "только для чтения"
            Type.Missing,   // не нужен
            Type.Missing,   // не нужен
            Type.Missing,   // не нужен
            Type.Missing,   // не нужен
            Type.Missing,   // не нужен
            Type.Missing,   // не нужен
            Type.Missing,   // не нужен
            Type.Missing);  // не нужен
        sheet = (Worksheet)book.Worksheets[sheetNum];
        if (firstRow == 0) firstRow = sheet.UsedRange[1, 1].Row;
        if (firstColumn == 0) firstColumn = sheet.UsedRange[1, 1].Column;
        int rowsCount = sheet.UsedRange.Rows.Count;
        int columnsCount = sheet.UsedRange.Columns.Count;
        if (lastRow == 0) lastRow = sheet.UsedRange[rowsCount, columnsCount].Row;
        if (lastColumn == 0) lastColumn = sheet.UsedRange[rowsCount, columnsCount].Column;
        range = sheet.Range[sheet.Cells[firstRow, firstColumn], sheet.Cells[lastRow, lastColumn]];
        data = range.get_Value(Type.Missing);
    }
    finally
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        if (range != null) Marshal.FinalReleaseComObject(range);
        if (sheet != null) Marshal.FinalReleaseComObject(sheet);
        if (book != null)
        {
            book.Close(false, Type.Missing, Type.Missing);
            Marshal.FinalReleaseComObject(book);
        }
        app.Quit();
        Marshal.FinalReleaseComObject(app);
    }
    return data;
}
#endregion
Пример записи через NPOI (делалось на коленке, но работает).

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
using System.IO;
 
private void toExcelButton_Click(object sender, EventArgs e)
{
    FolderBrowserDialog fbd = new FolderBrowserDialog();
    fbd.ShowNewFolderButton = true;
    fbd.SelectedPath = @"D:\";
    DialogResult res = fbd.ShowDialog();
    if (res == System.Windows.Forms.DialogResult.OK)
    {
        string path = fbd.SelectedPath + @"\Заявка " + section + " " + DateTime.Now.ToShortDateString().Replace('.', '-') + ".xls";
        HSSFWorkbook book = new HSSFWorkbook();
        ISheet sheet = book.CreateSheet("Sheet1");
        ICellStyle blackBorder = book.CreateCellStyle();
        blackBorder.BorderBottom = CellBorderType.THIN;
        blackBorder.BorderLeft = CellBorderType.THIN;
        blackBorder.BorderRight = CellBorderType.THIN;
        blackBorder.BorderTop = CellBorderType.THIN;
        blackBorder.BottomBorderColor = HSSFColor.BLACK.index;
        blackBorder.LeftBorderColor = HSSFColor.BLACK.index;
        blackBorder.RightBorderColor = HSSFColor.BLACK.index;
        blackBorder.TopBorderColor = HSSFColor.BLACK.index;
 
 
        IFont font1 = book.CreateFont();
        font1.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.BOLD;
        font1.FontName = "Calibri";
        font1.FontHeightInPoints = 11;
 
        IFont font2 = book.CreateFont();
        font2.FontName = "Calibri";
        font2.FontHeightInPoints = 11;
 
        ICellStyle header = book.CreateCellStyle();
        header.CloneStyleFrom(blackBorder);
        header.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
        header.SetFont(font1);
 
        ICellStyle cs = book.CreateCellStyle();
        cs.CloneStyleFrom(blackBorder);
        cs.Alignment = NPOI.SS.UserModel.HorizontalAlignment.LEFT;
        cs.SetFont(font2);
 
        // заголовок
        IRow row = sheet.CreateRow(0);
        ICell cell = row.CreateCell(0);
        cell.CellStyle = header;
        cell.SetCellValue("Код");
        cell = row.CreateCell(1);
        cell.CellStyle = header;
        cell.SetCellValue("Артикул");
        cell = row.CreateCell(2);
        cell.CellStyle = header;
        cell.SetCellValue("Название");
        cell = row.CreateCell(3);
        cell.CellStyle = header;
        cell.SetCellValue("Производитель");
        cell = row.CreateCell(4);
        cell.CellStyle = header;
        cell.SetCellValue("Ед. изм.");
        cell = row.CreateCell(5);
        cell.CellStyle = header;
        cell.SetCellValue("Цена");
        cell = row.CreateCell(6);
        cell.CellStyle = header;
        cell.SetCellValue("Количество");
 
 
        for (int i = 0; i < _order.Rows.Count; i++)
        {
            DataRow r = _order.Rows[i];
            row = sheet.CreateRow(i + 1);
            cell = row.CreateCell(0);
            cell.CellStyle = cs;
            cell.SetCellValue(r["goods_id"].ToString());
            cell = row.CreateCell(1);
            cell.CellStyle = cs;
            cell.SetCellValue(r["article"].ToString());
            cell = row.CreateCell(2);
            cell.CellStyle = cs;
            cell.SetCellValue(r["name"].ToString());
            cell = row.CreateCell(3);
            cell.CellStyle = cs;
            cell.SetCellValue(r["unit_name"].ToString());
            cell = row.CreateCell(4);
            cell.CellStyle = cs;
            cell.SetCellValue(r["producer_name"].ToString());
            cell = row.CreateCell(5);
            cell.CellStyle = cs;
            cell.SetCellValue(r["price"].ToString());
            cell = row.CreateCell(6);
            cell.CellStyle = cs;
            cell.SetCellValue(r["count"].ToString());
        }
        for (int i = 0; i < 7; i++)
            sheet.AutoSizeColumn(i);
 
        FileStream file = new FileStream(path, FileMode.Create);
        book.Write(file);
        file.Close();
    }
}
4
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
23.03.2012, 22:25  [ТС]
О_о спасибо, конечно, но как-то это уж очень сложно, тем более мне нужен был только импорт/экспорт.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
24.03.2012, 11:33
штатных средств ADO.NET для такой операции нет, так что приходится писать ручками. и ничего сложного здесь нет. почитай мсдн хотя бы и разберешься за пол дня.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.03.2012, 11:33
Помогаю со студенческими работами здесь

Импорт экспорт данных из Access в Excel и обратно
Вот код: ('Select * INTO Лист IN '+''''+'C:\Данные.xls'+''''+' From Таблица'); им я экспортирую данные в файл, а как потом...

Excel -> Access -> Excel, импорт - экспорт
Добрый день! Есть табель учета рабочего времени в таблице Excel, задача - переместить данные со всех листов книги в DB Access, позже...

Импорт и экспорт картинок из/в Excel?
Добрый день всем. Пока что чисто теоретически, но на будущее, скорее всего, такой вопрос возникнет, потому хотелось бы узнать у знающих...

Экспорт и импорт с Mysql в Excel
У меня вопрос на который я целый день могу найти ответ. Как корректно импортировать данные с Excel(csv) в Mysql? Если я экспортирую...

Импорт из excel и экспорт в word
Добрый день. Есть шаблон Word, в котором есть поля, такие как &quot;форматированный текст&quot; и раскрывающийся список. Раскрывающихся списка 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru