动态地将Excel数据导入DataBase

时间:2016-11-13 18:03:01

标签: c# sql database excel postgresql

你怎么可能看到标题,我想知道一种从excel导入数据到数据库的方法,即使我读了很多问题和答案,我也找不到解决我的问题。 因此,我的excel表格每分钟都会刷新其数字(通过从互联网获取新值并覆盖相同的单元格),因此需要始终打开Excel。 我想从visual studio读取这些值,获取这些值并将其写入我的数据库。 我已经使用OleDb工作并在PostgreSql上编写了它,但它只在我的excel关闭时才有效(我认为就是这样,因为OleDb打开excel来读取它,而且它已经打开了,它不起作用)。 我非常感谢能帮助我的人... 谢谢!

2 个答案:

答案 0 :(得分:3)

  

...我想从visual studio读取这些值......

为什么VBA不读取这些值并写入Postgres? 您可以在Excel工作簿中运行VBA宏。例如:

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

答案 1 :(得分:0)

这是我为加载项编写的一些代码,它完全是这样 - 它在Excel中采用突出显示的范围并将其上传到表中(在这种情况下使用C#,VSTO)。

这段代码经历了很多次迭代,最后我们非常满意。它非常快(比我们之前尝试的任何版本都快,并且比PgAdmin的导入速度更快)并且对数据类型非常宽容 - 你甚至不需要知道目标表的数据类型,前提是你以PostgresSQL的copy命令可以加载它的方式格式化它。

简而言之,它需要范围,将特殊值复制粘贴到新工作表,将工作表保存为CSV(快速,使用本机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);

在此上游,我们会进行检查,以确保用户有权截断和/或加载表格。

最后一点 - 这段代码不是名义上的。它在生产中运行,用户每天都会上传几十个表。

相关问题