将Excel数据导入PostgreSQL 9.3

时间:2013-11-18 04:00:57

标签: sql excel postgresql

我在excel中开发了一个庞大的表,现在面临将其转移到postgresql数据库的问题。我已经下载了odbc软件,我可以用excel打开在postgresql中创建的表。但是,我无法以相反的方式执行此操作,即在Excel中创建表并在postgresql中打开它。所以我想知道它可以通过这种方式完成,或者是否有任何替代方法可以创建一个带有pgAdmin III的大表,因为原始插入数据是非常繁琐的。

提前感谢所有帮助!

9 个答案:

答案 0 :(得分:32)

典型的答案是:

  1. 在Excel,文件/另存为中,选择CSV,保存当前工作表。

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

  3. PostgreSQL中的
  4. COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
    
  5. 但是还有其他方法可以做到这一点。 PostgreSQL是一个令人惊讶的可编程数据库。其中包括:

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

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

    3. 使用DBILink和DBD :: Excel

    4. 编写您自己的外部数据包装器以读取Excel文件。

    5. 可能性几乎无穷无尽......

答案 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)

如此处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/ 更改链接中的版本号以下载相应的版本。 将文件解压缩到pgsql文件夹以覆盖相同名称的子文件夹。 重启pgsql。在测试驱动之前,需要通过执行以下命令来安装模块:

CREATE EXTENSION ogr_fdw;

简述用法:

  1. 使用ogr_fdw_info.exe来查询工作表名称列表的Excel文件

    ogr_fdw_info -s "C:/excel.xlsx"
    
  2. 使用&#34; ogr_fdw_info.exe -l&#34;查询单个工作表并生成表定义代码。

    ogr_fdw_info -s "C:/excel.xlsx" -l "sheetname"
    
  3. 在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。这两个步骤如下所示。

将Excel数据加载到R

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对象,以确保它符合预期。

将其推送到PostgreSQL

确保您已从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格式。

总体应用阶段是:

  1. 加载Excel文件内容。以下是取决于文件扩展名的代码:
  2. {

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

    }

    1. 建立Postgres JDBC连接
    2. 创建Postgres表
    3. 遍历工作表并将行插入表中。这是一段Java代码:
    4. {

      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轻松地做到这一点。

  1. 首先将excel文件另存为csv formate。打开excel文件,然后另存为csv格式
  2. 转到datagrip,然后根据csv文件创建表结构。建议创建列名作为列名作为Excel列
  3. 从数据库的表名列表中右键单击表名,然后单击“从文件导入数据”。然后选择转换后的csv文件。 enter image description here

答案 8 :(得分:0)

可以使用ogr2​​ogr:

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扩展名获得它。)