Problema Convertendo para .ods ao visualizar outro arquivo .ods

2

Meu software Python usa regularmente os comandos: -

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

dada em resposta à minha pergunta em Abrir arquivo CSV e Vá direto para a planilha

Um usuário solicitou agora a capacidade de visualizar dois ou mais arquivos simultaneamente. O problema é que a conversão não será executada novamente enquanto um arquivo estiver sendo exibido. Nenhum erro é relatado, então estou um pouco intrigado. Se eu tentar e executar o convert a partir da linha de comando, ele simplesmente trava.

    
por MichaelJohn 26.10.2015 / 18:29

2 respostas

1

A partir da linha de comando ou de um script, você pode converter (e fazer outras coisas também) da maneira que quiser com o LibreOffice.

Você pode converter e, em seguida, visualizar vários arquivos (Exemplo 1) ou abrir uma exibição e converter outros arquivos em segundo plano (Exemplo 2) em praticamente qualquer forma necessária.

Essas ações podem ser feitas em série ou em paralelo (como corrotinas). A chave é criar um novo ambiente de usuário e ligá-lo a uma porta tcp enquanto a conversão ou outro processo em segundo plano ocorre. Eles podem ser criados à vontade, desde que os locais e as portas do usuário estejam disponíveis.

Os dois exemplos a seguir são apresentados de forma a se prestarem a scripts.

Uma explicação de -env: UserInstallation 1 pode ser encontrada aqui e a referência para - accept pode ser encontrada na tabela aqui . A conexão pode ser um socket ou um pipe (requerendo um pipe nomeado). Um resumo das opções da linha de comando pode ser encontrado na documentação do LibreOffice . As configurações padrão para o LibreOffice são encontradas em bootstraprc 1 e sofficerc 2 .

A sintaxe pode parecer um pouco complexa na medida em que cadeias de caracteres são necessárias. Na minha opinião, as alterações não estão bem documentadas. Mas há uma vantagem nessa abordagem, pois ela pode ser distribuída através de uma rede, se necessário, para ativar um sistema de produção / processamento de documentos.

Exemplo 1. Converter Então Visualizar

A fonte a seguir ilustra em primeiro lugar como isso é feito em paralelo (exigindo uma ligação de usuário / porta separada para cada instância) e como isso é feito em série.

# 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. 

Exemplo 2: Ver e depois converter (em segundo plano)

É possível converter em segundo plano enquanto visualiza arquivos. Para cada instância do LibreOffice, você simplesmente precisa criar um novo usuário e ligar uma nova porta tcp ao usuário. O seguinte é um exemplo:

# 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 ) &

Os arquivos são convertidos em serial; como tal, eles podem ser ligados à mesma porta. Você notará que os arquivos que estão sendo visualizados também estão sendo convertidos em segundo plano. Ao converter em paralelo, no entanto, cada conversor deve estar vinculado a uma porta tcp exclusiva. É claro que você pode usar qualquer usuário / porta desde que eles sejam únicos e estejam disponíveis.

No encerramento ...

É possível organizar esse processo como você gosta, dentro de scripts, sem envolver outras planilhas ou software, e aproveitar ao máximo os extensos filtros de conversão que o LibreOffice tem a oferecer.

Opcionalmente, isso pode ser feito a partir do LibreOffice usando o ooBasic. Existem filtros de exportação de importação que são construídos em que podem ser acessados para esse propósito, para serem acionados por opções de menu, por exemplo.

Como um bônus adicional, se você fizer o seguinte após uma conversão em segundo plano (por exemplo, 2), isso forçará uma atualização do LibreOffice e carregará os arquivos recém-convertidos:

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

Mas você deve instalar o xdotool primeiro, faça: sudo apt-get install xdotool .

Notas de rodapé

1 A configuração padrão UserInstallation é encontrada em / usr / lib / libreoffice / program / bootstraprc .

2 As configurações gerais são encontradas em / etc / libreoffice / sofficerc .

    
por 28.10.2015 / 16:10
0

Depois de pesquisar e testar (inclusive usando o CLI), ficou evidente que uma vez que o soffice (LibreOffice) tivesse uma planilha aberta, não iniciaria uma segunda instância no modo sem-cabeçote para converter mais arquivos .csv para o formato .ods. Descobri então que gnumeric tinha um programa de conversão ssconvert. Depois de instalar o gnumeric eu mudei o código de:

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

para: -

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

Embora eu não esteja muito interessado em usar dois pacotes de planilhas diferentes, uma enquete rápida sugeriu que os usuários não estão dispostos a mudar do LibreOffice. De fato, alguns disseram “Por que não podemos ter o Excel?”

    
por 27.10.2015 / 16:17