将 Excel 数据导入 PostgreSQL 9.3

Posted

技术标签:

【中文标题】将 Excel 数据导入 PostgreSQL 9.3【英文标题】:Import Excel Data into PostgreSQL 9.3 【发布时间】:2013-11-18 04:00:56 【问题描述】:

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

提前感谢所有帮助!

【问题讨论】:

提取 Excel 数据的常用方法是从 Excel 导出为 CSV,然后使用 Postgresql 的 COPY 命令提取该 csv 文件。 查看本部分右侧的“相关”部分,您会看到一些可能会回答您问题的候选人。 自我注意:另存为 CSV,通过右键单击模式导入 Datagrip > 从数据导入。 【参考方案1】:

典型的答案是这样的:

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

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

    在 PostgreSQL 中:

    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 文件。

可能性是无穷无尽的......

【讨论】:

感谢您的回答。 postgres 的新手.. 我有一个类似的案例,我必须定期将数据从 excel 工作簿拉入 PostGres,而不是从 excel 推送到 PostGres 数据库。如果我必须将数据从 Excel 提取到 PostGres,您是否会将其作为定期在 PostGres 服务器上运行的单独服务运行? DBD::Excel 或 foreign data wrapper 的一些推荐链接可以正常工作吗? 在第一组步骤中值得注意的是,在运行COPY 命令之前,需要使用所有必要的列创建mytable 表。【参考方案2】:

您也可以使用 psql 控制台执行 \copy 而无需将文件发送到 Postgresql 服务器机器。命令是一样的:

\copy mytable [ ( column_list ) ] FROM '/path/to/csv/file' WITH CSV HEADER

【讨论】:

【参考方案3】:

对于 python,您可以将 openpyxl 用于所有 2010 和更新的文件格式 (xlsx)。

Al Sweigart 在 working with excel spreadsheets 上提供了一个完整的教程来自动化无聊的部分,它非常深入,整本书和随附的 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 将数据解析为 postgres。

这是一个指向python-excel 的python 资源列表的链接,xlwings 提供了大量的功能,可以在 Excel 中使用 python 代替 vba。

【讨论】:

【参考方案4】:

我使用的一种方法是将表加载到R 作为data.frame,然后使用dbWriteTable 将其推送到PostgreSQL。这两个步骤如下所示。

将 Excel 数据加载到 R

Rdata.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】:

正如这里所解释的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;

用法简述:

    使用 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中执行生成的定义代码,会创建一个外表并映射到你的excel文件中。它可以像普通表一样被查询。

如果您有许多具有相同表结构的小文件,这将特别有用。只需更改定义中的路径和名称,更新定义即可。

此插件同时支持 XLSX 和 XLS 文件。 根据文档,也可以将数据写回电子表格文件,但是您的 excel 中所有花哨的格式都会丢失,文件会在写入时重新创建。

如果 excel 文件很大。这行不通。这是我没有使用这个扩展的另一个原因。它一次加载数据。 但是这个扩展也支持 ODBC 接口,应该可以使用 windows 的 ODBC excel 文件驱动程序为 excel 文件创建一个 ODBC 源,并使用 ogr_fdw 或任何其他 pgsql 的 ODBC 外部数据包装器来查询这个中间 ODBC 源。这应该是相当稳定的。

缺点是您不能像以前的方法那样在 pgsql 中轻松更改文件位置或名称。

友情提醒。权限问题适用于此 fdw 扩展。因为它被加载到 pgsql 服务中。 pgsql 必须具有对 excel 文件的访问权限。

【讨论】:

【参考方案6】:

可以使用 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

(不确定 ogr2ogr 是否包含在 postgres 安装中,或者我是否通过 postgis 扩展获得了它。)

【讨论】:

很好,但不幸的是 ogr2ogr 不会使用 excel 列类型,因此第一行看起来像整数的字符 id 将被严重转换。也许一些额外的 -lco 可以挽救这一天?【参考方案7】:

我使用 Excel/PowerPivot 创建了 postgreSQL insert 语句。似乎有点矫枉过正,除非你需要一遍又一遍地做。一旦数据在 PowerPivot 窗口中,我添加带有 concatenate 语句的连续列以“构建”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 into table_name values ('a','1');

insert into table_name values ('b','2');

insert into table_name values ('c','3');

注意:如果您熟悉 power pivot CONCATENATE 语句,您就会知道它只能处理 2 个参数(坚果)。如果它允许更多,那就太好了。

【讨论】:

【参考方案8】:

您可以通过使用 Apache POI 库 (https://poi.apache.org/) 编写 Java 代码来处理加载 excel 文件内容。该库是为处理包括 Excel 在内的 MS Office 应用程序数据而开发的。

我最近基于可帮助您将 Excel 文件加载到 Postgres 数据库的技术创建了应用程序。该应用程序可在http://www.abespalov.com/ 下获得。该应用程序仅针对 Windows 进行了测试,但也应适用于 Linux。

应用程序会自动创建必要的表格,其列与 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);

    建立 Postgres JDBC 连接 创建 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
  

在这里您可以找到为将 excel 导出到 Postgres (https://github.com/palych-piter/Excel2DB) 而创建的应用程序的所有 Java 代码。

【讨论】:

【参考方案9】:

最简单的答案是使用 psql 命令: 它是免费的,并且包含////

psql -U postgres -p 5432 -f sql-command-file.sql

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 简单的答案就是所需要的,也是我在 POSTGRESS 上使用最多的,命令行非常强大,为非常复杂的 SQL 操作提供简单的命令。【参考方案10】:

您可以通过 DataGrip 轻松做到这一点。

    首先将您的 excel 文件保存为 csv 格式。打开excel文件,然后另存为csv格式 转到datagrip然后根据csv文件创建表结构。建议将列名创建为Excel列的列名 右键单击数据库表名列表中的表名,然后单击从文件中导入数据。然后选择转换后的 csv 文件。

.

【讨论】:

以上是关于将 Excel 数据导入 PostgreSQL 9.3的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 Excel 导入 PostgreSQL

无法将 PostgreSQL10 转储导入 9.6 数据库

postgresql入门

将 CSV 文本数组导入 PostgreSQL 9.2

PostgreSQL Excel包含中文字符的数据导入方法

将数据从 Excel 文件导入 SQL 表而不重复?