2016-11-13 10 views
0

タイトルで見るとどういうのでしょうか、これについて多くの質問と回答を読んだにもかかわらず、データをExcelからデータベースにインポートする方法を知りたいのですが、私の問題を解決するものを見つけてください。 私のExcelシートは毎分(インターネットからの新しい値を取得して同じセルを上書きすることによって)数字をリフレッシュするので、Excelは常に開かれる必要があります。 これらの値をVisual Studioから読み込み、これらの値を取得してデータベースに書きたいと思います。 私はすでにOleDbを使ってPostgreSQLに書き込んでいますが、Excelが閉じているときにのみ機能します(OleDbがそれを読むために優秀だと思っていますし、すでにオープンされています。 私は本当に助けてくれる人に感謝します... ありがとう!Excelのデータをデータベースに動的にインポートする

+0

見てください:http://superuser.com/questions/731723/one-excel-file-multiple-editing-users-live-updates –

+0

あなたはすでに必要なデータを取得するためのメカニズムを持っています。 Excelに書き込む。確かに、そこにラインを追加するだけで、さらにPostresにアップアップする必要がありますか? – mlinth

+0

もう少し考えてみると、データを直接postgresqlに書き込んで、ODBC/OLE経由でExcelのPostgresqlデータを表示したいと考えています。 – mlinth

答えて

3

...私は、Visual Studioからこれらの値を読みたい...

ないVBAは、これらの値を読み、Postgresのに書き込むのはなぜ? ExcelワークブックでVBAマクロを実行できます。例えば: - それは(この場合はC#の、VSTOを使用して)表を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

ああ申し訳ありません!つまり、その作成者はExcelで開いたファイルにVBAを使用できます。 –

+0

Gotcha。私のコメントを削除しました –

+0

それは良い提案であり、当時、他の人の投稿にコメントするのに十分な担当者がいなかったので、アップアップされました。 –

0

は、これは私がアドインそのために書いたいくつかのコードはまさにそれんです。

このコードは数多くの繰り返しを経て、最終的には非常に満足しています。これは非常に高速です(これまで試みたどのバージョンよりも速く、PgAdminのインポートより高速です)。データ型には非常に寛容です。ターゲット表のデータ型を知る必要はありません。 PostgresSQLのcopyコマンドでロードできます。

一言で言えば、範囲をとり、新しいシートに特別な値をコピーして貼り付け、シートをCSV(Fast、ネイティブのExcel機能を使用)として保存し、CSVファイルを圧縮し、ファイルをPostgreSQLサーバに接続し、copyコマンドを実行します。

注意:これは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 Class Libraryを動作させることができませんでした。 、

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); 

これの上に、ユーザーがテーブルを切り捨ておよび/または読み込む権限を持っていることを確認します。

最後の1つの注記 - このコードは概念的ではありません。本番環境で動作し、ユーザーは毎日何十件もの表のアップロードを行います。

関連する問題