将 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
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】:正如这里所解释的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的主要内容,如果未能解决你的问题,请参考以下文章