2016-11-13 3 views
0

как вы можете видеть по названию, я хочу знать способ импорта данных из excel в базу данных, хотя я прочитал много вопросов и ответов об этом, я не знаю найдите тот, который решит мою проблему. Так что мой лист excel каждые минуты обновляет его номера (получая новые значения из Интернета и перезаписывая одну и ту же ячейку), поэтому excel нужно всегда открывать. Я хочу прочитать эти значения из visual studio, получить эти значения и записать их в моей базе данных. У меня уже есть работа с OleDb и запись ее на PostgreSql, но она работает только тогда, когда мой excel закрыт (я думаю, что это так, потому что OleDb открывает excel для его чтения, а синтаксис уже открыт, он не работает). Я очень ценю любого, кто мог бы мне помочь ... Спасибо!Импорт данных Excel в базу данных динамически

+0

Посмотрите: http://superuser.com/questions/731723/one-excel-file-multiple-editing-users-live-updates –

+0

У вас уже есть механизм для получения необходимых данных и пишите в Excel. Наверняка, вам нужно добавить строку, чтобы дополнительно добавить Postres? – mlinth

+0

Думая еще немного, я бы написал данные прямо в postgresql и просмотрел данные Postgresql в Excel через ODBC/OLE – mlinth

ответ

3

... Я хочу, чтобы прочитать эти значения из визуальной студии ...

Почему не VBA, чтобы читать эти значения и записать в Postgres? Вы можете запустить макрос VBA в книге Excel. Например:

Sub Cell2Postgres() 
Dim Connection As New ADODB.Connection 
Dim Command As New ADODB.Command 

Connection.ConnectionString = "Driver=PostgreSQL Unicode;Server=localhost;Port=5432;Database=postgres;Uid=postgres;Pwd=postgres" 
Connection.Open 

Command.ActiveConnection = Connection 

Command.CommandText = "INSERT INTO public.mytable (myfield) VALUES (?)" 
Command.Parameters.Append Command.CreateParameter("", adVarChar, adParamInput, 255, Range("A1").Value) 
Command.Execute 


Connection.Close 

End Sub 
+0

О, простите! Я имею в виду, что этот автор может использовать VBA для открытого файла в Excel. –

+0

Gotcha. Убрали мой комментарий –

+0

Утвержден, потому что это хорошее предложение, и в то время у человека не хватило репутации, чтобы прокомментировать пост других людей. –

0

Это некоторый код, который я написал для надстройки, что делает именно то, что - это занимает выделенный диапазон в Excel и автоматически заливаешь таблицу (с помощью C#, VSTO в данном случае).

Этот код прошел через многие МНОГО Итераций и, наконец, мы доволен. Это очень быстро (быстрее, чем любая предыдущая версия, и раньше, чем импорт PgAdmin), и очень прощает типы данных - вам даже не нужно знать тип данных целевой таблицы, если вы отформатируете его таким образом, чтобы Команда PostgresSQL copy может загрузить его.

В двух словах он принимает диапазон, делает специальные значения для копирования в новую таблицу, сохраняет лист как CSV (Fast, использует собственные функции Excel), сжимает CSV-файл, FTP-файл PostgreSQL, а затем запускает команду copy.

CAVEAT: Поскольку это copy, пользователь, который на самом деле выполняет команду, должен быть суперпользователем.

var addIn = Globals.ThisAddIn; 
Excel.Range range = addIn.Application.Selection; 

Excel.Workbook wb = addIn.Application.Workbooks.Add(); 
Excel.Worksheet ws = wb.Worksheets[1]; 

range.Copy(); 
ws.get_Range("A1").PasteSpecial(Excel.XlPasteType.xlPasteValuesAndNumberFormats); 
addIn.Application.DisplayAlerts = false; 
wb.SaveAs(Path.Combine(_Outputdir, string.Format("{0}.csv", TableName)), 
    Excel.XlFileFormat.xlCSV); 
wb.Close(); 
addIn.Application.DisplayAlerts = true; 

string newFile = Commons.Compress(_Outputdir, string.Format("{0}.csv", TableName)); 

Это обычная процедура FTP, которую мы написали. Я не мог заставить библиотеку классов .NET работать. Вы можете делать все, что вы хотите, чтобы получить его на сервер:

Commons.FtpPut(newFile, _Outputdir); 

Теперь загрузите данные:

NpgsqlTransaction trans = conn.BeginTransaction(IsolationLevel.RepeatableRead); 

if (TruncateTable) 
{ 
    cmd = new NpgsqlCommand(string.Format("truncate table {0}", TableName), conn, trans); 
    cmd.ExecuteNonQuery(); 
} 

try 
{ 
    Stopwatch st = new Stopwatch(); 
    st.Start(); 

    string format = HasHeader ? "csv header" : "csv"; 

    cmd.CommandText = string.Format(
     "copy {0} from program 'gzip -dc /apps/external_data/inbound/{0}.csv.gz' " + 
     "with null as '' {1} encoding 'WIN1250'", TableName, format); 

    cmd.ExecuteNonQuery(); 

    trans.Commit(); 

    st.Stop(); 

    Results = string.Format("Upload Completed in {0}", st.Elapsed); 
} 
catch (Exception ex) 
{ 
    trans.Rollback(); 
    Results = ex.ToString(); 
    success = false; 
} 

Опять же, рука-ролл свой собственный процесс FTP очистки:

Commons.FtpDelete(newFile, _Outputdir); 

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

Последнее примечание - этот код не является условным. Он работает в производстве, и пользователи ежедневно выполняют множество загрузок таблиц.

Смежные вопросы