다른 .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)가 스프레드시트를 열면 더 많은 .csv 파일을 .ods 형식으로 변환하기 위해 --headless 모드에서 두 번째 인스턴스를 시작하지 않는다는 것이 분명해졌습니다. 그러다가 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에서 변경하는 것을 꺼리는 것으로 나타났습니다. 실제로 많은 사람들이 "우리는 왜 엑셀을 못 만들까?"라고 말합니다.

관련 정보