我在excel中开发了一个庞大的表,现在面临将其转移到postgresql数据库的问题。我已经下载了odbc软件,我可以用excel打开在postgresql中创建的表。但是,我无法以相反的方式执行此操作,即在Excel中创建表并在postgresql中打开它。所以我想知道它可以通过这种方式完成,或者是否有任何替代方法可以创建一个带有pgAdmin III的大表,因为原始插入数据是非常繁琐的。
提前感谢所有帮助!
答案 0 :(得分:32)
典型的答案是:
在Excel,文件/另存为中,选择CSV,保存当前工作表。
转移到postgres用户可以访问的Pg服务器上的保留目录
:
COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
但是还有其他方法可以做到这一点。 PostgreSQL是一个令人惊讶的可编程数据库。其中包括:
用pl / javaU,pl / perlU或其他不受信任的语言编写模块来访问文件,解析它并管理结构。
使用CSV和fdw_file将其作为伪表访问
使用DBILink和DBD :: Excel
编写您自己的外部数据包装器以读取Excel文件。
可能性几乎无穷无尽......
答案 1 :(得分:5)
您还可以使用psql控制台执行\ copy而无需将文件发送到Postgresql服务器计算机。命令是相同的:
\copy mytable [ ( column_list ) ] FROM '/path/to/csv/file' WITH CSV HEADER
答案 2 :(得分:5)
对于python,您可以将openpyxl用于所有2010及更新的文件格式(xlsx)。
Al Sweigart提供了一个完整的教程,可以自动化working with excel spreadsheets psycopg的无聊部分,整本书和随附的Udemy课程都是很好的资源。
从他的例子
>>> import openpyxl
>>> wb = openpyxl.load_workbook('example.xlsx')
>>> wb.get_sheet_names()
['Sheet1', 'Sheet2', 'Sheet3']
>>> sheet = wb.get_sheet_by_name('Sheet3')
>>> sheet
<Worksheet "Sheet3">
可以理解,一旦获得此访问权限,您现在可以使用python-excel将数据解析为postgres,就像通常那样。
这是指向xlwings的python资源列表的链接,bc提供了大量的功能,可以在excel中使用python代替vba。
答案 3 :(得分:2)
使用ogr_fdw模块,可以在pgsql中打开excel表作为外表,并像pgsql中的任何其他常规表一样直接查询。 这对于从同一个定期更新的表中读取数据非常有用
为此,电子表格中的表格标题必须干净,当前的ogr_fdw驱动程序无法处理带有这些字符的宽幅字符或新行等,您可能无法参考由于编码问题导致pgsql中的列。 (主要原因是我无法使用这个精彩的扩展。)
Windows的ogr_fdw预构建二进制文件位于http://winnie.postgis.net/download/windows/pg96/buildbot/extras/ 更改链接中的版本号以下载相应的版本。 将文件解压缩到pgsql文件夹以覆盖相同名称的子文件夹。 重启pgsql。在测试驱动之前,需要通过执行以下命令来安装模块:
CREATE EXTENSION ogr_fdw;
简述用法:
使用ogr_fdw_info.exe来查询工作表名称列表的Excel文件
ogr_fdw_info -s "C:/excel.xlsx"
使用&#34; ogr_fdw_info.exe -l&#34;查询单个工作表并生成表定义代码。
ogr_fdw_info -s "C:/excel.xlsx" -l "sheetname"
在pgsql中执行生成的定义代码,创建外表并将其映射到excel文件。它可以像常规表一样查询。
如果您有许多具有相同表结构的小文件,这将特别有用。只需更改定义中的路径和名称,更新定义即可。
此插件支持XLSX和XLS文件。 根据该文档,还可以将数据写回电子表格文件,但excel中的所有花哨格式都将丢失,文件将在写入时重新创建。
如果excel文件很大。这不行。这是我没有使用此扩展的另一个原因。它一次加载数据。 但是这个扩展还支持ODBC接口,应该可以使用windows&#39; ODBC excel文件驱动程序为excel文件创建ODBC源,并使用ogr_fdw或任何其他pgsql的ODBC外部数据包装器来查询此中间ODBC源。这应该相当稳定。
缺点是您无法像以前的方法那样在pgsql中轻松更改文件位置或名称。
友情提醒。权限问题适用于此fdw扩展。因为它加载到pgsql服务中。 pgsql必须具有excel文件的特权访问权限。
答案 4 :(得分:2)
我使用的方法是将表作为data.frame
加载到R,然后使用dbWriteTable
将其推送到PostgreSQL。这两个步骤如下所示。
R 的data.frame
个对象与数据库类似,其中命名列具有显式类型,例如文本或数字。有几种方法可以将电子表格转换为 R ,例如XLConnect。但是,一个非常简单的方法是选择Excel表的范围(包括标题),复制它(即 CTRL + C ),然后在 R中使用此命令从剪贴板中获取它:
d <- read.table("clipboard", header=TRUE, sep="\t", quote="\"", na.strings="", as.is=TRUE)
如果你有RStudio,你可以轻松查看d
对象,以确保它符合预期。
确保您已从CRAN安装RPostgreSQL,然后建立连接并将data.frame
发送到数据库:
library(RPostgreSQL)
conn <- dbConnect(PostgreSQL(), dbname="mydb")
dbWriteTable(conn, "some_table_name", d)
现在some_table_name
应出现在数据库中。
可以从pgAdmin或psql:
完成一些常见的清理步骤ALTER TABLE some_table_name RENAME "row.names" TO id;
ALTER TABLE some_table_name ALTER COLUMN id TYPE integer USING id::integer;
ALTER TABLE some_table_name ADD PRIMARY KEY (id);
答案 5 :(得分:0)
我使用Excel / PowerPivot创建了postgreSQL insert
语句。看起来像矫枉过正,除非你需要一遍又一遍地做。一旦数据在PowerPivot窗口中,我就会添加带有concatenate
语句的连续列到&#39; build&#39; insert
声明。我用最后一列和最后一列创建了一个展平的数据透视表。使用pgAdmin将生成的insert
语句复制并粘贴到我的EXISTING postgreSQL表中。
示例二列表(我的表有30列,我使用相同的Excel / PowerPivot一遍又一遍地导入连续内容。)
Column1 {a,b,...} Column2 {1,2,...}
在PowerPivot中,我使用以下命令添加计算列:
计算的第1列有"insert into table_name values ('"
计算第2列有CONCATENATE([Calculated Column 1],CONCATENATE([Column1],"','"))
...直到你到达最后一列,你需要终止插入语句:
计算的第3列有CONCATENATE([Calculated Column 2],CONCATENATE([Column2],"');"
然后在PowerPivot中我添加一个展平的数据透视表,并拥有我只是复制并粘贴到pgAgent的所有insert语句。
产生的插入语句:
insert into table_name values ('a','1');
insert into table_name values ('b','2');
insert into table_name values ('c','3');
注意:如果您熟悉power pivot CONCATENATE语句,您知道它只能处理2个参数(坚果)。如果它允许更多的话会很好。
答案 6 :(得分:0)
您可以通过使用Apache POI库(https://poi.apache.org/)编写Java代码来处理加载Excel文件内容。该库是为处理包括Excel在内的MS office应用程序数据而开发的。
我最近基于这项技术创建了应用程序,该技术将帮助您将Excel文件加载到Postgres数据库。该应用程序位于http://www.abespalov.com/下。该应用程序仅针对Windows进行测试,但也适用于Linux。
应用程序使用与Excel文件中相同的列自动创建必要的表,并使用内容填充表。您可以并行导出多个文件。您可以跳过将文件转换为CSV格式的步骤。该应用程序处理xls和xlsx格式。
总体应用阶段是:
{
fileExtension = FilenameUtils.getExtension(inputSheetFile.getName());
if (fileExtension.equalsIgnoreCase("xlsx")) {
workbook = createWorkbook(openOPCPackage(inputSheetFile));
} else {
workbook =
createWorkbook(openNPOIFSFileSystemPackage(inputSheetFile));
}
sheet = workbook.getSheetAt(0);
}
{
Iterator<Row> rowIterator = InitInputFilesImpl.sheet.rowIterator();
//skip a header
if (rowIterator.hasNext()) {
rowIterator.next();
}
while (rowIterator.hasNext()) {
Row row = (Row) rowIterator.next();
// inserting rows
}
}
在这里,您可以找到为将Excel导出到Postgres(https://github.com/palych-piter/Excel2DB)而创建的应用程序的所有Java代码。
答案 7 :(得分:0)
您可以通过DataGrip轻松地做到这一点。
。
答案 8 :(得分:0)
可以使用ogr2ogr:
C:\Program Files\PostgreSQL\12\bin\ogr2ogr.exe -f "PostgreSQL" PG:"host=someip user=someuser dbname=somedb password=somepw" C:/folder/excelfile.xlsx -nln newtablenameinpostgres -oo AUTODETECT_TYPE=YES
(不确定ogre2ogr是否包含在postgres安装中,或者我是否使用postgis扩展名获得它。)