将Excel数据导入PostgreSQL 9.3

我已经在excel中开发了一个巨大的表格,现在面临将其转移到postgresql数据库中的问题。 我已经下载了odbc软件,我可以用excel打开在postgresql中创build的表格。 但是,我无法以相反的方式在excel中创build表并在postgresql中打开它。 所以我想知道这是可以这样做,或者是否有任何其他的方式,可以创build一个大的表与pgAdmin III因为原始插入数据是非常繁琐的。

在此先感谢所有的帮助!

典型的答案是这样的:

  1. 在Excel,文件/另存为,selectCSV,保存您当前的工作表。

  2. 转移到Postgres用户可以访问的Pg服务器上的保存目录

  3. 在PostgreSQL中:

     COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser 

但也有其他方法可以做到这一点。 PostgreSQL是一个惊人的可编程数据库。 这些包括:

  1. 用pl / javaU,pl / perlU或其他不受信任的语言编写一个模块来访问文件,parsing它并pipe理结构。

  2. 使用CSV和fdw_file作为伪表访问它

  3. 使用DBILink和DBD :: Excel

  4. 编写自己的外部数据包装器来读取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中

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

正如这里所解释的http://www.postgresonline.com/journal/categories/journal/archives/339-OGR-foreign-data-wrapper-on-Windows-first-taste.html

使用ogr_fdw模块,可以在pgsql中将excel表格作为外部表格打开,并像在pgsql中的其他常规表格那样直接查询。 这对于从同一个定期更新的表中读取数据非常有用

要做到这一点,电子表格中的表头必须是干净的,当前的ogr_fdw驱动程序不能处理宽字符或换行符等,您可能无法引用pgsql中的列,因为编码问题。 (主要原因,我不能使用这个美妙的扩展。)

用于Windows的ogr_fdw预生成二进制文件位于http://winnie.postgis.net/download/windows/pg96/buildbot/extras/更改链接中的版本号以下载相应的版本&#x3002; 将该文件解压缩到pgsql文件夹以覆盖相同的名称子文件夹。 重新启动pgsql。 在试驾之前,需要通过执行以下步骤安装模块:

 CREATE EXTENSION ogr_fdw; 

简要用法:

  1. 使用ogr_fdw_info.exe来查找excel文件中的表名列表

     ogr_fdw_info -s "C:/excel.xlsx" 
  2. 使用“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/下获得&#x3002; 该应用程序仅针对Windows进行testing,但也适用于Linux。

应用程序会自动创build与Excel文件中相同列的必要表格,并使用内容填充表格。 您可以并行导出多个文件。 您可以跳过将文件转换为CSV格式的步骤。 该应用程序处理xls和xlsx格式。

总体应用阶段是:

  1. 加载excel文件的内容。 这是取决于文件扩展名的代码:

{

 fileExtension = FilenameUtils.getExtension(inputSheetFile.getName()); if (fileExtension.equalsIgnoreCase("xlsx")) { workbook = createWorkbook(openOPCPackage(inputSheetFile)); } else { workbook = createWorkbook(openNPOIFSFileSystemPackage(inputSheetFile)); } sheet = workbook.getSheetAt(0); 

}

  1. build立Postgres JDBC连接
  2. 创build一个Postgres表
  3. 遍历表单并将行插入表中。 这是一段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 )。