ExcelใขใใคใณใงPostgreSQLใซๆฅ็ถใใๅฎ่ฃ ใซใคใใฆใใใ่ฉณใใ่งฃ่ชฌใใ่จไบใไฝๆใใพใใ
ExcelใใPostgreSQLใซๆฅ็ถใใใขใใคใณใฎ้็บ - ๅฎ่ฃ ่ฉณ่งฃ
ใฏใใใซ
ExcelใใPostgreSQLใใผใฟใใผในใซๆฅ็ถใใSQLใฏใจใชใๅฎ่กใใฆ็ตๆใExcelใทใผใใซๆธใ่พผใๆนๆณใ็ดนไปใใพใใODBCใใฉใคใใใคใณในใใผใซใงใใชใ็ฐๅขใงใๅไฝใใใใใC#ใจExcel DNAใฉใคใใฉใชใไฝฟใฃใฆExcelใขใใคใณใไฝๆใใพใใใใฎ่จไบใงใฏใ็นใซC#ใฎๅฎ่ฃ ้จๅใซใคใใฆ่ฉณใใ่งฃ่ชฌใใพใใ
ๅฟ ่ฆใช็ฐๅขใจใฉใคใใฉใช
้็บ็ฐๅข
- Visual Studio 2019ไปฅ้
- .NET Framework 4.7.2ไปฅ้
- Microsoft Excel (2013ไปฅ้ๆจๅฅจ)
ๅฟ ่ฆใชNuGetใใใฑใผใธ
- ExcelDna.AddIn
- ExcelDna.Integration
- Npgsql
- Microsoft.Office.Interop.Excel
ๅฎ่ฃ ใฎ่ฉณ็ดฐ่งฃ่ชฌ
1. ๅบๆฌๆง้ ใจใฏใฉใน่จญ่จ
using System;
using System.Data;
using System.Runtime.InteropServices;
using Npgsql;
using ExcelDna.Integration;
using Excel = Microsoft.Office.Interop.Excel;
namespace PostgresExcelAddin
{
public static class Functions
{
private static NpgsqlConnection _connection;
// ...
}
}
ใใฎ้จๅใง้่ฆใชใใคใณใ๏ผ
-
ExcelDna.Integrationๅๅ็ฉบ้๏ผExcel DNAใฎๆฉ่ฝใไฝฟ็จใใใใใซๅฟ ่ฆ -
Npgsql๏ผPostgreSQLๆฅ็ถ็จใฎใฉใคใใฉใช -
Microsoft.Office.Interop.Excel๏ผExcelใฎCOMใคใณใฟใผใใงใผใน็จ -
static NpgsqlConnection _connection๏ผใใผใฟใใผในๆฅ็ถใไฟๆใใ้็ใใฃใผใซใ
2. ใใผใฟใใผในๆฅ็ถๆฉ่ฝใฎๅฎ่ฃ
[ExcelFunction(Description = "PostgreSQLใซๆฅ็ถใใพใ")]
public static string ConnectDB(string host, string database, string username, string password, string port = "5432")
{
try
{
var connectionString = $"Host={host};Port={port};Database={database};Username={username};Password={password}";
// ๆขๅญใฎๆฅ็ถใใฏใชใผใณใขใใ
if (_connection != null && _connection.State == ConnectionState.Open)
{
_connection.Close();
_connection.Dispose();
}
// ๆฐใใๆฅ็ถใ็ขบ็ซ
_connection = new NpgsqlConnection(connectionString);
_connection.Open();
return "ๆฅ็ถๆๅ";
}
catch (Exception ex)
{
return $"ๆฅ็ถใจใฉใผ: {ex.Message}";
}
}
้่ฆใชใใคใณใ๏ผ
-
[ExcelFunction]ๅฑๆง๏ผใใฎ้ขๆฐใExcelใใๅผใณๅบใๅฏ่ฝใซใใ - ๆฅ็ถๆๅญๅใฎๆง็ฏ๏ผใปใญใฅใชใใฃไธใฎ็็ฑใใใใใฉใกใผใฟๅใใใๆนๅผใไฝฟ็จ
- ๆขๅญๆฅ็ถใฎ้ฉๅใช็ ดๆฃ๏ผใกใขใชใชใผใฏใ้ฒใ
- ใจใฉใผใใณใใชใณใฐ๏ผไพๅคใใญใฃใใใใฆใฆใผใถใผใใฌใณใใชใผใชใกใใปใผใธใ่ฟใ
3. ใใผใฟใใผในๅๆญๆฉ่ฝ
[ExcelFunction(Description = "PostgreSQLใใๅๆญใใพใ")]
public static string DisconnectDB()
{
try
{
if (_connection != null)
{
if (_connection.State == ConnectionState.Open)
{
_connection.Close();
}
_connection.Dispose();
_connection = null;
}
return "ๅๆญๆๅ";
}
catch (Exception ex)
{
return $"ๅๆญใจใฉใผ: {ex.Message}";
}
}
ๅฎ่ฃ ใฎใใคใณใ๏ผ
- ๆฅ็ถ็ถๆ ใฎใใงใใฏ
- ใชใฝใผในใฎ้ฉๅใช่งฃๆพ
- nullๅ็ งใฎ้ฒๆญข
4. ใฏใจใชๅฎ่กๆฉ่ฝ
[ExcelFunction(Description = "SQLใฏใจใชใๅฎ่กใใฆใทใผใใซ็ตๆใๆธใ่พผใฟใพใ")]
public static object ExecuteQuery(string query, string sheetName)
{
try
{
// ๆฅ็ถใใงใใฏ
if (_connection == null || _connection.State != ConnectionState.Open)
{
return "ใใผใฟใใผในใซๆฅ็ถใใใฆใใพใใ";
}
// Excelๆไฝใฎใใใฎๆบๅ
var app = ExcelDnaUtil.Application as Excel.Application;
Excel.Worksheet sheet;
// ใทใผใใฎๅๅพใพใใฏไฝๆ
try
{
sheet = app.ActiveWorkbook.Worksheets[sheetName];
}
catch
{
sheet = app.ActiveWorkbook.Worksheets.Add();
sheet.Name = sheetName;
}
// ใฏใจใชๅฎ่กใจใใผใฟๅๅพ
using (var cmd = new NpgsqlCommand(query, _connection))
using (var reader = cmd.ExecuteReader())
{
var dataTable = new DataTable();
dataTable.Load(reader);
// ใทใผใใฎใฏใชใข
sheet.UsedRange.Clear();
// ใใใใผใฎๆธใ่พผใฟ
for (int i = 0; i < dataTable.Columns.Count; i++)
{
sheet.Cells[1, i + 1].Value = dataTable.Columns[i].ColumnName;
}
// ใใผใฟใฎไธๆฌๆธใ่พผใฟ
var data = new object[dataTable.Rows.Count, dataTable.Columns.Count];
for (int row = 0; row < dataTable.Rows.Count; row++)
{
for (int col = 0; col < dataTable.Columns.Count; col++)
{
data[row, col] = dataTable.Rows[row][col];
}
}
if (dataTable.Rows.Count > 0)
{
var range = sheet.Range[
sheet.Cells[2, 1],
sheet.Cells[dataTable.Rows.Count + 1, dataTable.Columns.Count]
];
range.Value = data;
}
// ๅๅน
ใฎ่ชๅ่ชฟๆด
sheet.Columns.AutoFit();
return $"{dataTable.Rows.Count}่กใฎใใผใฟใๅๅพใใพใใ";
}
}
catch (Exception ex)
{
return $"ใจใฉใผ: {ex.Message}";
}
}
ๅฎ่ฃ ใฎ้่ฆใใคใณใ๏ผ
-
ใใผใฟๅๅพใใญใผ
- NpgsqlCommandใฎไฝๆ
- DataReaderใไฝฟ็จใใใใผใฟ่ชญใฟๅใ
- DataTableใธใฎใใผใฟใญใผใ
-
Excelๆไฝ
- ใทใผใใฎๅญๅจ็ขบ่ชใจไฝๆ
- ๆขๅญใใผใฟใฎใฏใชใข
- ใใใใผ่กใฎ่จญๅฎ
- ใใผใฟใฎไธๆฌๆธใ่พผใฟ๏ผใใใฉใผใใณในๆ้ฉๅ๏ผ
- ๅๅน ใฎ่ชๅ่ชฟๆด
-
ใจใฉใผใใณใใชใณใฐ
- ใใผใฟใใผในๆฅ็ถ็ถๆ ใฎ็ขบ่ช
- Excelๆไฝๆใฎไพๅคๅฆ็
- ใฆใผใถใผใใฌใณใใชใผใชใจใฉใผใกใใปใผใธ
5. ๆดๆฐ็ณปใฏใจใชๅฎ่กๆฉ่ฝ
[ExcelFunction(Description = "UPDATE/INSERT/DELETEใฏใจใชใๅฎ่กใใพใ")]
public static string ExecuteNonQuery(string query)
{
try
{
if (_connection == null || _connection.State != ConnectionState.Open)
{
return "ใใผใฟใใผในใซๆฅ็ถใใใฆใใพใใ";
}
using (var cmd = new NpgsqlCommand(query, _connection))
{
int result = cmd.ExecuteNonQuery();
return $"{result}่กใๅฝฑ้ฟใๅใใพใใ";
}
}
catch (Exception ex)
{
return $"ใจใฉใผ: {ex.Message}";
}
}
ๅฎ่ฃ ใฎใใคใณใ๏ผ
- ๆดๆฐ็ณปใฏใจใชใฎๅฎ่กใซใฏ
ExecuteNonQueryใไฝฟ็จ - ๅฝฑ้ฟใๅใใ่กๆฐใ่ฟๅด
- ้ฉๅใชใชใฝใผใน็ฎก็๏ผusingในใใผใใกใณใ๏ผ
VBAใใใฎๅผใณๅบใๆนๆณ
ExcelใฎVBAใใC#ใงๅฎ่ฃ ใใ้ขๆฐใๅผใณๅบใไพ๏ผ
' ใใผใฟใใผในๆฅ็ถ
Sub ConnectToDatabase()
Dim result As String
result = Application.Run("ConnectDB", "localhost", "postgres", "username", "password", "5432")
MsgBox result
End Sub
' ใฏใจใชๅฎ่ก
Sub ExecuteQueryExample()
Dim queryResult As String
queryResult = Application.Run("ExecuteQuery", "SELECT * FROM users", "Results")
MsgBox queryResult
End Sub
' ใใผใฟใใผในๆดๆฐ
Sub UpdateDatabase()
Dim nonQueryResult As String
nonQueryResult = Application.Run("ExecuteNonQuery", "UPDATE users SET active = true WHERE id = 1")
MsgBox nonQueryResult
End Sub
' ๅๆญๅฆ็
Sub DisconnectFromDatabase()
Dim disconnectResult As String
disconnectResult = Application.Run("DisconnectDB")
MsgBox disconnectResult
End Sub
ใขใใคใณ้็บๆใฎๆณจๆ็น
-
ใใใใฐๆนๆณ
- Visual StudioใงExcelใใญใปในใซใขใฟใใใใฆๅฎ่กๆใใใใฐใๅฏ่ฝ
- ใใใใฐใใชใณใๆใฏ
Debug.WriteLine()ใไฝฟ็จ
-
ใจใฉใผใใณใใชใณใฐ
- ใในใฆใฎๅ ฌ้ใกใฝใใใง้ฉๅใชไพๅคๅฆ็ใๅฎ่ฃ
- ใฆใผใถใผใใฌใณใใชใผใชใจใฉใผใกใใปใผใธใ่ฟใ
- ใใใใฐๆ ๅ ฑใฏ้็บๆใฎใฟ่กจ็คบ
-
ใใใฉใผใใณในๆ้ฉๅ
- ๅคง้ใใผใฟๅฆ็ๆใฏไธๆฌๆธใ่พผใฟใไฝฟ็จ
- ๆฅ็ถใฎใใผใชใณใฐใ่ๆ ฎ
- ไธ่ฆใชใทใผใๆไฝใๆๅฐ้ใซ
-
ใปใญใฅใชใใฃ่ๆ ฎไบ้
- ๆฅ็ถๆๅญๅใฎๅฎๅ จใช็ฎก็
- SQL injectionๅฏพ็ญ
- ใจใฉใผใกใใปใผใธใงใฎๆฉๅฏๆ ๅ ฑๆผๆดฉ้ฒๆญข
ใพใจใ
ใใฎExcelใขใใคใณใฎๅฎ่ฃ ใซใใใไปฅไธใฎใกใชใใใๅพใใใพใ๏ผ
- ODBCใใฉใคใไธ่ฆใงPostgreSQLใซๆฅ็ถๅฏ่ฝ
- C#ใฎๅๅฎๅ จๆงใจใจใฉใผใใณใใชใณใฐใฎๆฉๆต
- Excel DNAใซใใ็ฐกๅใช้ขๆฐใจใฏในใใผใ
- ๅน็็ใชใใผใฟๅๅพใจๆธใ่พผใฟ
ใพใใใใฎๅฎ่ฃ ใฏไปฅไธใฎ็นใงๆกๅผตๅฏ่ฝใงใ๏ผ
- ใใฉใกใผใฟๅใฏใจใชใฎใตใใผใ
- ใใฉใณใถใฏใทใงใณ็ฎก็ใฎ่ฟฝๅ
- ้ๅๆๅฆ็ใธใฎๅฏพๅฟ
- ใใ่ฉณ็ดฐใชใจใฉใผใญใฐๆฉ่ฝ
ใใฎใขใใคใณใฏใExcelใฆใผใถใผใPostgreSQLใใผใฟใใผในใ็ฐกๅใซๆไฝใงใใใใใซใใๅผทๅใชใใผใซใจใชใใพใใ
Comments
Let's comment your feelings that are more than good