Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Экспорт данных из Excel в таблицу базы данных / 13 сообщений из 13, страница 1 из 1
19.08.2010, 11:30
    #36799637
dmitriy22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
Доброе время суток !!!
По заголовку темы понятно о чем речь, но подробнее:
Есть файл excel, в нем есть записи, необходимо выгрузить данные в таблицу SQL.
Существует много способов выгрузки данных:
1. Можно или подключить библиотеку и работать с ней
2. Можно в sql запросом, к примеру,
Код: plaintext
1.
SELECT * INTO test_new 
FROM OPENROWSET('MSDASQL','Driver={Microsoft Excel Driver (*.xls)};DBQ=c:\test.xls','SELECT * FROM [Лист1$]')
3. Или же сделать из excel такой же источник как sql, oledb или odbc и работать как с обычным ADO
Если вы знаете еще методы выгрузки,то пишите здесь, буду очень признателен расширить свой кругозор, может ваш метод будет проще :)

Зная это, я решил выбрать 3-й вариант, т.к. 1-й как мне показалось геморойный, 2-й не подходит, т.к. конечная таблица находится на sybase
и вот код который я сделал c помощью ODBC, т.к. не понял, что лучше:
Код: plaintext
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.
// сначала достаю данные в datatable из Excel
 OdbcConnection cn = new OdbcConnection();
 cn.ConnectionString = string.Format(@"Driver={{Microsoft Excel Driver (*.xls)}};DBQ={0};ReadOnly=0;", workbookPath);
 string strCom = "select * from [Лист1$]";
 cn.Open();
 OdbcCommand comm_mon = new OdbcCommand(strCom, cn);
 OdbcDataAdapter da = new OdbcDataAdapter();
 da.SelectCommand = comm_mon;
 System.Data.DataTable dt = new System.Data.DataTable();
 da.Fill(dt);

// затем подключаю свою бд, также через ODBC, т.к. иначе будет ругаться
string strCon = "Dsn=srvr;uid=login;srvr=srvr;db=db;pwd=pwd";
OdbcConnection conn = new OdbcConnection(strCon);
       conn.Open();

//и потом пробегаясь по всем строкам и столбцам вставляю данные в таблицу, которую я до этого сделал в бд
foreach (DataRow row in dt.Rows)
                {
                    string strCom2 = "insert into tmp_export_excel select"
                    + "'" + row[0].ToString() + "',"
                    + "'" + row[1].ToString() + "',"
                    + "'" + row[2].ToString() + "',"
                    + "'" + row[3].ToString() + "',"
                    + "'" + row[4].ToString() + "',"
                    + "'" + row[5].ToString() + "',"
                    + "'" + row[6].ToString() + "',"
                    + "'" + row[7].ToString() + "',"
                    + "'" + row[8].ToString() + "',"
                    + "'" + row[9].ToString() + "',"
                    + "'" + row[10].ToString() + "',"
                    + "'" + row[11].ToString() + "',"
                    + "'" + row[12].ToString() + "',"
                    + "'" + row[13].ToString() + "',"
                    + "'" + row[14].ToString() + "',"
                    + "'" + row[15].ToString() + "',"
                    + "'" + row[16].ToString() + "',"
                    + "'" + row[17].ToString() + "'";


                            OdbcCommand cm = new OdbcCommand(strCom2, conn);
                            cm.ExecuteNonQuery();
                 }
  conn.Close();

  cn.Close();

                }

вот код для создания бд
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table tmp_export_excel
(
F1 VARCHAR( 10 ) NULL,
F2 VARCHAR( 20 ) NULL,
F3 VARCHAR( 20 ) NULL,
F4 VARCHAR( 20 ) NULL,
F5 VARCHAR( 30 ) NULL,
F6 VARCHAR( 10 ) NULL,
F7 VARCHAR( 10 ) NULL,
F8 VARCHAR( 50 ) NULL,
F9 VARCHAR( 50 ) NULL,
F10 VARCHAR( 30 ) NULL,
F11 VARCHAR( 50 ) NULL,
F12 VARCHAR( 20 ) NULL,
F13 VARCHAR( 20 ) NULL,
F14 VARCHAR( 20 ) NULL,
F15 VARCHAR( 20 ) NULL,
F16 VARCHAR( 20 ) NULL,
F17 VARCHAR( 20 ) NULL,
F18 VARCHAR( 20 ) NULL
)


в принципе это все работает, но я бы хотел сделать более гибкую систему:
т.е. возможно ли как-то сделать, чтобы не создавать таблицу в бд, т.к. я могу не знать количество и названия столбцов
и можно ли как-то всю datatble вставить в бд, не пробегаясь по строкам.
Т.е. в итоге, чтобы грузить любой excel файл, не зная сколько там столбцо и их названий, что мне нужно поменять или добавит в моем коде ?
а может у вас есть свой вариант, буду признателен, т.к. охота иметь более автоматизированную вещь, а так это получаетсякак одноразовая посуда :(
Жду предложений :wink:
...
Рейтинг: 0 / 0
19.08.2010, 11:51
    #36799711
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
dmitriy22охота иметь более автоматизированную вещь

Чтобы помочь Вам поиметь "более автоматизированную вещь", надо знать, что Вы автоматизируете.
Если Ваша цель "взять что угодно из какой угодно книги Excell и поместить в не-пойми-какую таблицу БД" - это будет затруднительно.

Еще не понятно, чем Вас обидела СУБД Sybase: "2-й не подходит, т.к. конечная таблица находится на sybase"?

Вот Вам еще вариант в Вашу необъятную копилку знаний: подключиться собственно к Excell, как к OLE-объекту и попросить у него данные.
...
Рейтинг: 0 / 0
19.08.2010, 12:00
    #36799736
dmitriy22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
Курдль,

а как тогда 2-й вариант в Sybase реализовать ?
...
Рейтинг: 0 / 0
19.08.2010, 12:29
    #36799846
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
dmitriy22Курдль,

а как тогда 2-й вариант в Sybase реализовать ?

Вы хотите, чтобы я все за Вас написал, или все же конкретизируете, что именно у Вас не получается?
...
Рейтинг: 0 / 0
19.08.2010, 13:48
    #36800103
Thermik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
Да можно сделать такую таблицу

Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE [Excel](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Row] [int] NULL,
	[Col] [int] NULL,
	[CellDataDisplay] [varchar](1024) NULL
) 

И потихонечку перебирая по очереди все ячейки страницы заполнять эту таблицу.
...
Рейтинг: 0 / 0
19.08.2010, 13:52
    #36800113
dmitriy22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
Курдль,
во-первых если бы я хотел, чтобы за меня написали, то я не приводил здесь работающий код, который сам сделал, но который хотел бы оптимизировать. Во вторых пример запроса по 2-му варианту в sql я написал, там он работает, а вот в sybse - нет, вот я и спрашиваю какой тогда код надо написать, может для sybase синтаксис другой

ну и о том, что я хочу добиться, чтобы мог экспортировать любой excel файл, не зная сколько в нем таблиц изначально создавать под него таблицу sql и вставлять туда данные
...
Рейтинг: 0 / 0
19.08.2010, 14:38
    #36800298
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
dmitriy22ну и о том, что я хочу добиться, чтобы мог экспортировать любой excel файл, не зная сколько в нем таблиц изначально создавать под него таблицу sql и вставлять туда данные

Я все равно не понял, чего Вы хотите добиться.
Как Вам помочь, если Вы ленитесь сформулировать свой вопрос по-русски?
Я не могу представить себе, что будет за такая БД, пусть на Sybase, в которой будут накапливаться не-пойми-какие таблицы, созданные на лету из "любых excel-файлов"? Как потом из этой БД данные извлекать, если Вы не будете знать заранее структуру этих таблиц?

Я Вас просил описать бизнес-задачу. Какой процесс Вы пытаетесь автоматизировать?
...
Рейтинг: 0 / 0
19.08.2010, 14:58
    #36800386
dmitriy22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
Курдль,

во-первых когда я вытаскиваю из excel данные, то отсекается первая строка, которая превращается в поля F1,F2,F3...., причем если в первой строке есть текст, то столбец этот тоже будет текст и он datatable попадет как Column, а не как Row

потом вопрос как втавить разом всю строчку по всем столбцам, т.е. не как я
авторstring strCom2 = "insert into tmp_export_excel select"
+ "'" + row[0].ToString() + "',"
+ "'" + row[1].ToString() + "',"
+ "'" + row[2].ToString() + "',"
+ "'" + row[3].ToString() + "',"
+ "'" + row[4].ToString() + "',"
+ "'" + row[5].ToString() + "',"
+ "'" + row[6].ToString() + "',"
+ "'" + row[7].ToString() + "',"
+ "'" + row[8].ToString() + "',"
+ "'" + row[9].ToString() + "',"
+ "'" + row[10].ToString() + "',"
+ "'" + row[11].ToString() + "',"
+ "'" + row[12].ToString() + "',"
+ "'" + row[13].ToString() + "',"
+ "'" + row[14].ToString() + "',"
+ "'" + row[15].ToString() + "',"
+ "'" + row[16].ToString() + "',"
+ "'" + row[17].ToString() + "'";


как вот это оптимизировать

но основным вопросом остается: не зная структуры excel данных загружать их в excel, а по поводу накопления не пойми каких таблиц, то ведь можно использовать в названии одну таблицу вначале ее дропать и все и не будет кучи разных таблиц
...
Рейтинг: 0 / 0
19.08.2010, 15:08
    #36800443
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
dmitriy22,

Вы не ответили на вопрос: "Какой процесс Вы пытаетесь автоматизировать?"
...
Рейтинг: 0 / 0
19.08.2010, 15:13
    #36800470
dmitriy22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
Курдль,

процесс загрузки данных на sql
...
Рейтинг: 0 / 0
19.08.2010, 15:31
    #36800577
Курдль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
dmitriy22,
Каких данных? Куда загрузку? SQL - это Structured Query Language
Вас сами данные попросили их загрузить? Ведь кто-то Вам задачу поставил? Какую программу надо сделать?
Напишите хоть в произвольном виде:
1. Оператор выбирает excell-файл
2. Нажимает кн. "сохранить в БД"
3. Получает уведомление.
...
4. Аудитор открывает форму доступа к БД.
5. Выбирает название сущности
6. Видит перед собой данные, экспортированные оператором из excell-файла.
7. ...
...
Рейтинг: 0 / 0
23.08.2010, 14:32
    #36806288
dmitriy22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
вроде разобрался с проблемой при помощи цикла и класс stringBuilder, если кому интересно, то могу кинуть код

но ту при выгрузке данных одна непонятная штука происходит и я никак не пойму в чем проблема :
вот код выгрузки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  ///подключаемся к Excel
                OdbcConnection cn = new OdbcConnection();
                cn.ConnectionString = string.Format(@"Driver={{Microsoft Excel Driver (*.xls)}};DBQ={0};ReadOnly=0;HDR=No", c:\ 1 .xls);
 
                 cn.Open();
   ///Получение данных из Excel
                string strComExcel = "select * from ["sheet1$]";

                ///Выполнить выборку данных из Excel и положить ее в DataTable 
                OdbcCommand comm_mon = new OdbcCommand(strComExcel, cn);
                OdbcDataAdapter da = new OdbcDataAdapter();
                da.SelectCommand = comm_mon;
                DataTable dt = new DataTable();

                da.Fill(dt); 
                cn.Close(); 


когда я при помощи odbc закачиваю данные из excel в datatable, то закачиваются разные данные:
1.случай:

если у меня в excel такие данные :
Код: plaintext
1.
2.
3.
col1     col2     col3     col4     col5     col6
   0          1            2          3           4          5 
col1     col2     col3     col4     col5     col6
то на выходе я получаю
Код: plaintext
1.
2.
3.
col1     col2     col3     col4     col5     col6

col1     col2     col3     col4     col5     col6
т.е. выгрузились пустые ячейки с цифрами

2.случай:

если у меня в excel такие данные :
Код: plaintext
1.
2.
3.
col1     col2     col3     col4     col5     col6
cl0         1         cl2         3           4          5 
col1     col2     col3     col4     col5     col6
то на выходе я получаю
Код: plaintext
1.
2.
3.
col1     col2     col3     col4     col5     col6
cl0         1         cl2         3           4          5 
col1     col2     col3     col4     col5     col6
т.е. выгрузились все нормально

почему так происходит, в первом случае не выгружаются цифры ???
...
Рейтинг: 0 / 0
23.08.2010, 17:41
    #36806644
dmitriy22
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт данных из Excel в таблицу базы данных
нашел причину, вопрос закрыт.
использовал oledb с параметром IMEX=1
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Экспорт данных из Excel в таблицу базы данных / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]