Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.51/41: Рейтинг темы: голосов - 41, средняя оценка - 4.51
Sick2
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
1

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

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

Всем привет. Есть задание В проект добавьте команду/кнопку экспорта данных выборки из БД в файл Excel. Добавьте команду/кнопку загрузки данных в одну из таблиц БД из файла Excel.
Собственно сразу и загвоздка. Как программно работать с exel? Вычитал, что можно работать с екселем как с обычной базой данных, т.е. через oledb. Но написать рабочий запрос не могу. Собственно, прошу помочь, хоть чем.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2012, 23:37
Ответы с готовыми решениями:

Экспорт базы данных из С# в excel
Раскажите, приведите пример или скиньте что нибудь почитать по этой теме. заранее благодарю

Экспорт данных в Excel и XML
Есть база данных, которая хранится в MS SQL Server. Доступ к БД реализован с помощью Entity...

Экспорт данных из MS SQL в Excel
Подскажите, пожалуйста, как можно экспортировать данные из MS SQL в Excel. Желательно бы с...

Импорт данных из Excel в MS SQL
Добрый день. Знаю что много таких вопросов и большую часть из них я просмотрел не найдя ответа. ...

Импорт данных из excel в DataGridView
Здравствуйте, нужна Ваша помощь. Необходимо организовать импорт данных их Excel в datagridview c#....

10
serg42
118 / 100 / 7
Регистрация: 14.02.2010
Сообщений: 263
15.03.2012, 10:18 2
Используйте Microsoft.Office.Interop.Excel, а ещё лучше библиотеку работающую напрямую с файлом, а не через COM, например NPOI. OLE для выгрузки в Excel - изврат, имхо.
1
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
15.03.2012, 15:48 3
Используй OleDbConnection для подключения к файлу Excel как к базе данных.
Строку подключения спросите у Гугла.

ИМХО это самый простой способ.
0
Sick2
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
21.03.2012, 21:55  [ТС] 4
Цитата Сообщение от 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
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
22.03.2012, 16:12 5
Лист1 - это название страницы книги Excel. в приложении Excel название страницы можно увидеть её название в самом низу(TabPage)


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

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

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

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_
384 / 240 / 20
Регистрация: 03.10.2011
Сообщений: 1,002
23.03.2012, 15:02 8
Вот мой код:
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
serg42
118 / 100 / 7
Регистрация: 14.02.2010
Сообщений: 263
23.03.2012, 15:12 9
Лучший ответ Сообщение было отмечено как решение

Решение

Пример чтения (возвращает двумерный массив объектов, по умолчанию - рабочая область первого листа книги).
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
Sick2
14 / 14 / 6
Регистрация: 26.11.2010
Сообщений: 235
23.03.2012, 22:25  [ТС] 10
О_о спасибо, конечно, но как-то это уж очень сложно, тем более мне нужен был только импорт/экспорт.
0
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
24.03.2012, 11:33 11
штатных средств ADO.NET для такой операции нет, так что приходится писать ручками. и ничего сложного здесь нет. почитай мсдн хотя бы и разберешься за пол дня.
1
24.03.2012, 11:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2012, 11:33

Импорт данных из Excel в БД SQL
Доброе время суток! Помогите народ, диплом горит :help::help::help: Как реализовать перенос данных...

Экспорт данных из файла Excel в БД SQL
Здравствуйте! Надо написать программу для экспорта данных из файла Excel в БД SQL. Помогите...

Импорт данных из Excel в компонент datagridview
У меня такой вопрос: каким образом можно импортировать данные из Excel в компонент datagridview в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru