查看另一个 .ods 文件时转换为 .ods 时出现问题

查看另一个 .ods 文件时转换为 .ods 时出现问题

我的 Python 软件经常使用以下命令:-

soffice --headless --convert-to ods --outdir /tmp tblIssues.csv
soffice --view /tmp/tblIssues.ods
rm /tmp/tblIssues.ods

回答我的问题打开 CSV 文件并直接进入电子表格

用户现在请求能够同时查看两个或多个文件。问题是在查看文件时转换将不会再次运行。没有报告错误,所以我有点困惑。如果我尝试从命令行运行转换,它就会挂起。

答案1

从命令行或脚本,您可以使用 LibreOffice 以任何您喜欢的方式进行转换(也可以执行其他操作)。

您可以转换然后查看多个文件(示例 1),或者以所需的任何方式在后台打开视图并转换其他文件(示例 2)。

这些操作可以串行或并行(作为协程)完成。关键是创建一个新的用户环境并将其绑定到 TCP 端口,同时进行转换或其他后台进程。只要用户位置和端口可用,就可以随意创建这些。

下面的两个示例以适合编写脚本的形式呈现。

的解释-env:用户安装1可以被找寻到这里以及参考- 接受可以在表中找到这里。连接可以是插座或一个管道(需要命名管道)。命令行选项的摘要可以在LibreOffice 文档。 LibreOffice 的默认设置位于引导程序1办公室2

语法可能看起来有点复杂,因为需要 uno 字符串。在我看来,uno 字符串没有得到很好的记录。但这种方法的一个优点是,如果需要,它可以分布在网络上,以启用文档生成/处理系统。

示例 1. 转换然后查看

以下源代码首先说明了如何并行完成此操作(需要为每个实例进行单独的用户/端口绑定)以及如何串行完成此操作。

# My LibreOffice version is:

# $ libreoffice --version
# LibreOffice 4.2.8.2 420m0(Build:2)

# My files are in a local folder '.'

# $ ls .
# sample00.csv sample01.csv sample02.csv

# Parallel conversion: convert as many as you wish; to be done in parallel
# each instance will exit when completed.  You can set UserInstallation 
# to the location desired, as long as the user can access it, and you can 
# use any tcp port you wish, as long as it is available. The location and
# port are created if they do not exist. Note that each location and port
# must be unique. The location ~/.loports/<port number> is a convenient
# construct. An explanation of -env:UserInstallation and --accept follows.

# -env:UserInstallation=</absolute/path/to/unique/location>
# changes the default user location that is found in bootstraprc.

# --accept
# 'socket,' use a socket 
# 'host=0,' any host (also can use localhost or nnn.nnn.nnn.nnn).
# 'port=NNNN,' can be any available tcp port number.
# 'tcpNoDelay=1;' for uno connections, 0 for 200ms delay (default).

# Now do:

soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8100" --accept="socket,host=0,port=8100,tcpNoDelay=1;" --convert-to ods --outdir . sample00.csv &
soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8101" --accept="socket,host=0,port=8101,tcpNoDelay=1;" --convert-to ods --outdir . sample01.csv &
soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8102" --accept="socket,host=0,port=8102,tcpNoDelay=1;" --convert-to ods --outdir . sample02.csv &

# ... and so on ...

# To open multiple views, do:

soffice --nologo --view sample00.ods sample01.ods sample02.ods &

# ... and so on ... 

# Serial conversion:  you can do serial conversion by sending each csv
# file to the same port but you must wait for it to finish first.
# Each conversion will exit when completed. Do something like:

( soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8100" --accept="socket,host=0,port=8100,tcpNoDelay=1;" --convert-to ods --outdir . sample00.csv &&
  soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8100" --accept="socket,host=0,port=8100,tcpNoDelay=1;" --convert-to ods --outdir . sample01.csv &&
  soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8100" --accept="socket,host=0,port=8100,tcpNoDelay=1;" --convert-to ods --outdir . sample02.csv &&
  soffice --nologo --view sample00.ods sample01.ods sample02.ods ) &

# Quick note, when completed, check that your directory, in this case,
# ~/.loports, has been removed. 

示例 2:查看然后转换(在后台)

查看文件时可以进行后台转换。对于 LibreOffice 的每个实例,您只需创建一个新用户并将新的 tcp 端口绑定到该用户。下面是一个例子:

# Open a view:

soffice --nologo --view sample00.ods sample01.ods sample02.ods &

# Then convert in the background as you like:

( soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8101" --accept="socket,host=0,port=8100,tcpNoDelay=1;" --convert-to ods --outdir . sample00.csv &&
  soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8101" --accept="socket,host=0,port=8100,tcpNoDelay=1;" --convert-to ods --outdir . sample01.csv &&
  soffice --headless "-env:UserInstallation=file:///home/$USER/.loports/8101" --accept="socket,host=0,port=8100,tcpNoDelay=1;" --convert-to ods --outdir . sample02.csv ) &

文件以串行方式转换;因此它们可以绑定到同一端口。您会注意到正在查看的文件也在后台进行转换。然而,当并行转换时,每个转换器必须绑定到唯一的 TCP 端口。当然,您可以使用任何用户/端口,只要它们是唯一且可用的。

在结束时...

您可以根据需要在脚本中安排此过程,而无需使用其他电子表格或软件,并充分利用 LibreOffice 提供的广泛转换过滤器。

或者,可以使用 ooBasic 在 LibreOffice 中完成此操作。例如,可以为此目的访问内置的导入导出过滤器,以通过菜单选项进行操作。

作为额外的好处,如果您在后台转换后执行以下操作(按照示例 2),它将强制刷新 LibreOffice,并加载新转换的文件:

xdotool search --name sample00.ods windowactivate --sync key --clearmodifiers ctrl+shift+r &&
xdotool search --name sample01.ods windowactivate --sync key --clearmodifiers ctrl+shift+r &&
xdotool search --name sample02.ods windowactivate --sync key --clearmodifiers ctrl+shift+r

但你必须安装xdo工具首先,做sudo apt-get install xdotool

脚注

1默认用户安装设置位于/usr/lib/libreoffice/程序/bootstraprc

2常规配置设置位于/etc/libreoffice/sofficerc

答案2

经过进一步研究和测试(包括使用 CLI),很明显,一旦 soffice (LibreOffice) 打开电子表格,它就不会以 –headless 模式启动第二个实例来将更多 .csv 文件转换为 .ods 格式。然后我发现gnumeric有一个转换程序ssconvert。安装 gnumeric 后,我将代码更改为:

soffice --headless --convert-to ods --outdir /tmp tblIssues.csv
soffice --view /tmp/tblIssues.ods
rm /tmp/tblIssues.ods

到:-

ssconvert /tmp/tblIssues.csv /tmp/tblIssues.ods
soffice --view /tmp/tblIssues.ods
rm /tmp/tblIssues.csv /tmp/tblIssues.ods

虽然我不太热衷于使用两个单独的电子表格包,但一项快速民意调查表明用户不愿意从 LibreOffice 进行更改。事实上,不少人说“为什么我们不能有 Excel?”

相关内容