将Excel数据导入PostgreSQL 9.3
我已经在excel中开发了一个巨大的表格,现在面临将其转移到postgresql数据库中的问题。 我已经下载了odbc软件,我可以用excel打开在postgresql中创build的表格。 但是,我无法以相反的方式在excel中创build表并在postgresql中打开它。 所以我想知道这是可以这样做,或者是否有任何其他的方式,可以创build一个大的表与pgAdmin III因为原始插入数据是非常繁琐的。
在此先感谢所有的帮助!
典型的答案是这样的:
-
在Excel,文件/另存为,selectCSV,保存您当前的工作表。
-
转移到Postgres用户可以访问的Pg服务器上的保存目录
-
在PostgreSQL中:
COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
但也有其他方法可以做到这一点。 PostgreSQL是一个惊人的可编程数据库。 这些包括:
-
用pl / javaU,pl / perlU或其他不受信任的语言编写一个模块来访问文件,parsing它并pipe理结构。
-
使用CSV和fdw_file作为伪表访问它
-
使用DBILink和DBD :: Excel
-
编写自己的外部数据包装器来读取Excel文件。
可能性从字面上看是无止境的….
您也可以使用psql控制台执行\ copy,而无需将文件发送到Postgresql服务器机器。 命令是一样的:
\copy mytable [ ( column_list ) ] FROM '/path/to/csv/file' WITH CSV HEADER
对于python,你可以使用openpyxl来处理所有2010和更新的文件格式(xlsx)。
Al Sweigart有一个完整的教程,从无聊部分的自动化与Excel电子表格的工作非常深入,整本书和伴随的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">
可以理解的是,一旦你有了这个访问权限,你现在可以像通常那样使用psycopg来parsing数据到postgres。
这是python-excel中python资源列表的链接, xlwings还提供了一大堆使用python代替vba的function。
我使用的方法是将表作为data.frame
加载到R中,然后使用dbWriteTable
将其推送到PostgreSQL。 这两个步骤如下所示。
将Excel数据加载到R中
R的data.frame
对象是类似数据库的,其中named列有明确的types,如文本或数字。 有几种方法可以将电子表格转换为R ,如XLConnect 。 但是,一个非常简单的方法是selectExcel表(包括头)的范围,复制它(即CTRL + C ),然后在R中使用此命令从剪贴板中获取它:
d <- read.table("clipboard", header=TRUE, sep="\t", quote="\"", na.strings="", as.is=TRUE)
如果您有RStudio,您可以轻松查看d
对象,以确保其符合预期。
推送到PostgreSQL
确保您从CRAN安装了RPostgreSQL ,然后build立连接并将数据发送到数据库:
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);
使用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"
-
使用“ogr_fdw_info.exe -l”来检测单个表并生成表定义代码。
ogr_fdw_info -s "C:/excel.xlsx" -l "sheetname"
在pgsql中执行生成的定义代码,创build一个外部表并映射到你的excel文件。 可以像普通表一样查询。
如果你有许多具有相同表结构的小文件,这是特别有用的。 只需在定义中更改path和名称,更新定义就足够了。
这个插件支持XLSX和XLS文件。 根据文档,也可以将数据写回到电子表格文件中,但是excel中的所有花式格式都将丢失,文件将在写入时重新创build。
如果excel文件很大。 这是行不通的。 这是我没有使用这个扩展的另一个原因。 它一次加载数据。 但是这个扩展也支持ODBC接口,应该可以使用windows的ODBC excel文件驱动来为excel文件创build一个ODBC源文件,并使用ogr_fdw或其他任何pgsql的ODBC外部数据包装来查询这个中间的ODBC源文件。 这应该是相当稳定的。
缺点是你不能像在前面的方法中那样在pgsql中轻松地更改文件位置或名称。
友好的提醒。 权限问题适用于此fdw扩展。 自从把它加载到pgsql服务中。 pgsql必须具有对excel文件的特权。
我已经使用Excel / PowerPivot来创buildpostgreSQL insert
语句。 似乎过度杀伤,除非你需要一遍又一遍地做。 一旦数据在PowerPivot窗口中,我将使用concatenate
语句添加连续的列来“build立” insert
语句。 我创build了最后一列和最后一列的扁平化数据透视表。 使用pgAdmin将结果insert
语句复制并粘贴到我现有的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 into table_name values ('a','1'); insert into table_name values ('b','2'); insert into table_name values ('c','3');
注意:如果您熟悉function主元CONCATENATE语句,则知道它只能处理2个参数(螺母)。 如果允许的话会更好。
您可以通过使用Apache POI库( https://poi.apache.org/ )编写Java代码来处理加载excel文件内容。 该库是为了处理MS Office应用程序数据(包括Excel)而开发的。
我最近创build了基于该技术的应用程序,它将帮助您将Excel文件加载到Postgres数据库。 该应用程序可在http://www.abespalov.com/下获得。 该应用程序仅针对Windows进行testing,但也适用于Linux。
应用程序会自动创build与Excel文件中相同列的必要表格,并使用内容填充表格。 您可以并行导出多个文件。 您可以跳过将文件转换为CSV格式的步骤。 该应用程序处理xls和xlsx格式。
总体应用阶段是:
- 加载excel文件的内容。 这是取决于文件扩展名的代码:
{
fileExtension = FilenameUtils.getExtension(inputSheetFile.getName()); if (fileExtension.equalsIgnoreCase("xlsx")) { workbook = createWorkbook(openOPCPackage(inputSheetFile)); } else { workbook = createWorkbook(openNPOIFSFileSystemPackage(inputSheetFile)); } sheet = workbook.getSheetAt(0);
}
- build立Postgres JDBC连接
- 创build一个Postgres表
- 遍历表单并将行插入表中。 这是一段Java代码:
{
Iterator<Row> rowIterator = InitInputFilesImpl.sheet.rowIterator(); //skip a header if (rowIterator.hasNext()) { rowIterator.next(); } while (rowIterator.hasNext()) { Row row = (Row) rowIterator.next(); // inserting rows }
}
在这里,您可以find创build用于将excel导出到Postgres的应用程序的所有Java代码( https://github.com/palych-piter/Excel2DB )。