Excel2Latex - Workaround : Codierung, Ausrichtung an Komma

Tabellen und Grafiken erstellen und anordnen


B.O.D
Forum-Anfänger
Forum-Anfänger
Beiträge: 14
Registriert: Do 19. Nov 2015, 09:47

Excel2Latex - Workaround : Codierung, Ausrichtung an Komma

Beitrag von B.O.D »

Hallo Gemeinde,

ich nutze gerne Excel2Latex, wenn es um Tabellen geht, jedoch möchte ich mittlerweile etwas mehr Spielraum haben, d.h. Tabellenbreite, Positionierung, Tabellenfußnoten etc.

Mittels nachfolgender Basisumgebung umgehe ich die Umgebungsdefinition von Excel2Latex.
\begin{table}[htbp]
  \centering
  \caption{caption}\label{tab:beispiel}
  \begin{tabularx}{<breite>}{<ausrichtung>}
    \toprule
    \ExecuteMetaData[file]{tag}
    \bottomrule
  \end{tabularx}
\end{table}
Dabei wird für
\ExecuteMetaData[file]{tag}
das Paket 'catchfilebetweentags' benötigt, welches im obigen Beispiel zwischen den nachfolgenden Tags den Inhalt einfügt.
%<*tag>
Inhalt
%</tag>
In Excel definiere ich für die Tags Zellenformatvorlagen, sodass ich weiterhin Rechnungen durchführen lassen kann. Das ist insofern bequem, weil veränderte Zellen Einfluss auf andere Zellen nehmen, aber keine Veränderungen in der Latex-Datei notwendig sind, da lediglich die Tabelle als Tex-File neu gespeichert werden muss. Das wird dann zum Vorteil wenn man große Tabellen hat: Wer hat schon lust >100 Werte im Quellcode händisch zu ändern? Soweit so gut.

Nun zu meinen Fragen:
  • 1. Es tritt das Problem der Codierung auf, wenn man Umlaute in Excel verwendet. Wie lässt sich das lösen?

    2. Weiterhin möchte ich in der tabularx-Umgebung Inhalte am Komma ausrichten, was zum Beispiel bei Ergänzungen mittels Tabellenfußnoten notwendig wird (siehe Minimalbeispiel bzw. Anhang). Gibt es da eine Möglichkeit bzw. welche Alternativen gibt es z. B. für 'tabularx'?
Nachfolgend ein Minimalbeispiel, das funktioniert, weil keine Umlaute in der Tabelle verwendet werden. Hier definiere ich den Tabellenkopf in Latex, um die Ausrichtung anzupassen.
\documentclass[10pt,a4paper]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{amsmath}

\usepackage{threeparttable}
\usepackage{catchfilebetweentags}
\usepackage{tabularx}
\usepackage{booktabs}
\newcolumntype{G}{>{\raggedleft\arraybackslash}X}

\begin{filecontents}{Tabelle1.tex}
   % Table generated by Excel2LaTeX from sheet 'Tabelle1'
   \begin{tabular}{rrrrr}
   \toprule
   Ueberschrift 1 & Ueberschrift 2 & Ueberschrift 3 & Ueberschrift 4 & Ueberschrift 5 \\
   \midrule
   \%<*tag>Groesse 1$^\text{a}$ & 200.00 & 300.00 & 400.00 & 500.00 \\
   Groesse 2$^\text{a}$ & 20.00 & 30.00 & 40.00 & 60.00 \\
   Summe & 220.00 & 330.00$^\text{b}$ & 440.00 & 560.00 \\
   Produkt & 4000.00 & 9000.00 & 16000.00 & 30000.00$^\text{c}$\\%</tag> \\
   \bottomrule
   \end{tabular}%
\end{filecontents}

\begin{document}

\begin{table}[htbp]
	\centering
  	\caption{Anwendung von Excel2LaTeX mit Workaround}\label{tab:beispiel}
   		\begin{threeparttable}
    		\begin{tabularx}{\textwidth}{X G G G G}
    			\toprule
    			\multicolumn{1}{l}{Formel} &
    			\multicolumn{1}{r}{Versuch 1} &
    			\multicolumn{1}{r}{Versuch 2} &
    			\multicolumn{1}{r}{Versuch 3} &
    			\multicolumn{1}{r}{Versuch 4} \\\midrule
				\ExecuteMetaData[Tabelle1.tex]{tag}
 				\bottomrule
 			\end{tabularx}
    		\begin{tablenotes}
				\item[$^\text{a}$] Wie Codierung ändern??
				\item[$^\text{b}$] Erläuterung zur Summe von Versuch 2
				\item[$^\text{c}$] Erläuterung zum Produkt von Versuch 4
			\end{tablenotes}
		\end{threeparttable}	
\end{table}
\end{document}
Insgesamt bin ich für Anregungen zum Code offen.

Beste Grüße
Dateianhänge
test.pdf
(30.19 KiB) 306-mal heruntergeladen

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Ausrichtungen von Zahlen kannst du mit siunitx machen, siehe dessen Dokumentation.

Die input-Kodierung kannst du lokal mit \inputencoding{ansinew} ändern (ich nehme mal an excel speichert als ansinew), besser wäre es natürlich, wenn excel/excel2latex utf8 erzeugen würde.

B.O.D
Forum-Anfänger
Forum-Anfänger
Beiträge: 14
Registriert: Do 19. Nov 2015, 09:47

Beitrag von B.O.D »

Vielen Dank für die Antwort.
Das 'siunitx'-Paket liefert in Kombination mit den Tabellenfußnoten Probleme. Die Abstände vom hochgesetzen Buchstaben zur Zahl sind 1. unterschiedlich und 2. teilweise zu groß.

Die lokale Änderung der Codierung fand ich auch hier.
https://bugs.launchpad.net/excel2latex/+bug/944134
Leider lässt sich
{\inputencoding{ansinew}
\ExecuteMetaData[Tabelle1.tex]{tag}
 }
 
nicht anwenden. Es kommt eine Fehlermeldung, es würde ein '}' fehlen.

Es funktioniert jedoch, wenn man die Codierung der gesamten 'tabularx'-Umgebung lokal ändert. Probleme bestehen dann aber weiterhin mit dem 'ß'-Umlaut.
\documentclass[10pt,a4paper]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{siunitx}

\usepackage{threeparttable}
\usepackage{catchfilebetweentags}
\usepackage{tabularx}
\usepackage{booktabs}
\newcolumntype{G}{>{\raggedleft\arraybackslash}X}

\begin{filecontents}{Tabelle1.tex}
   % Table generated by Excel2LaTeX from sheet 'Tabelle1'
   \begin{tabular}{rrrrr}
   \toprule
   Ueberschrift 1 & Ueberschrift 2 & Ueberschrift 3 & Ueberschrift 4 & Ueberschrift 5 \\
   \midrule
   \%<*tag>Grösse 1$^\text{a}$ & 200.00 & 300.00 & 400.00 & 500.00 \\
   Groesse 2$^\text{a}$ & 20.00 & 30.00 & 40.00 & 60.00 \\
   Summe & 220.00 & 330.00$^\text{b}$ & 440.00 & 560.00 \\
   Produkt & 4000.00 & 9000.00 & 16000.00 & 30000.00$^\text{c}$\\%</tag> \\
   \bottomrule
   \end{tabular}%
\end{filecontents}

\begin{document}

\begin{table}[htbp]
	\centering
  	\caption{Anwendung von Excel2LaTeX mit Workaround}\label{tab:beispiel}
   		\begin{threeparttable}
   		{\inputencoding{ansinew}
    		\begin{tabularx}{\textwidth}{X S S S S}
    			\toprule
    			\multicolumn{1}{l}{Formel} &
    			\multicolumn{1}{r}{Versuch} &
    			\multicolumn{1}{r}{Versuch} &
    			\multicolumn{1}{r}{Versuch} &
    			\multicolumn{1}{r}{Versuch} \\
    			\midrule
    			\ExecuteMetaData[Tabelle1.tex]{tag}
 				\bottomrule
 			\end{tabularx}
 		}
    		\begin{tablenotes}
				\item[$^\text{a}$] Wie Codierung ändern??
				\item[$^\text{b}$] Erläuterung zur Summe von Versuch 2
				\item[$^\text{c}$] Erläuterung zum Produkt von Versuch 4
			\end{tablenotes}
		\end{threeparttable}	
\end{table}
\end{document}
Ist das anhand vom Code erklärbar oder ist das eine Wechselwirkung unterschiedlicher Pakete?

Beste Grüße
Dateianhänge
test.pdf
(45.13 KiB) 297-mal heruntergeladen

B.O.D
Forum-Anfänger
Forum-Anfänger
Beiträge: 14
Registriert: Do 19. Nov 2015, 09:47

Beitrag von B.O.D »

Hallo Gemeinde,

ich habe das Problem nicht vergessen. Hier mein aktueller Lösungsweg.

Das Problem mit dem Abstand hat sich durch sorgfältiges Lesen der Doku zu siunitx erledigt.

Das Umlaut-Problem konnte ich nur bedingt lösen, indem ich ein ß-Umlaut mit \ss{} setze. Für das Excel-File bedeutet das entsprechend eine untypische Darstellung, aber das stört an sich nicht weiter, weil die Formatvorlagen ebenso sichtbar sind. Mittlerweile bin ich dazu übergegangen doppelte Tabellen zu erzeugen, d.h. die eigentliche Tabelle wird mit Bezügen 1:1 an einer anderen Stelle mit entsprechenden Formatierungen für Latex kopiert.

Ich bin mit diesem Workaround zufrieden, muss aber gestehen, dass es erst eine sinnvolle Lösung ist, wenn die Tabelle groß und weitere Latex-Befehle innerhalb der Tabelle notwendig sind. Anderweitig ist copy-paste des Inhaltes schneller.

Natürlich freue ich mich auf weitere Anregungen bzw. Feedback.

Beste Grüße
\documentclass[10pt,a4paper]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{siunitx}

\usepackage{threeparttable}
\usepackage{catchfilebetweentags}
\usepackage{tabularx}
\usepackage{booktabs}
\newcolumntype{G}{>{\raggedleft\arraybackslash}X}

\begin{filecontents}{Tabelle1.tex}
   % Table generated by Excel2LaTeX from sheet 'Tabelle1'
   		\begin{tabular}{rrrrr}
   		\toprule
   		Ueberschrift 1 & Ueberschrift 2 & Ueberschrift 3 & Ueberschrift 4 & Ueberschrift 5 \\
   		\midrule
		Starttag: \%<*Eist_HW>
		\%</Eist_HW> Endtag   		
   		
   		\%<*tag>Grö\ss{}e 1$^\text{a}$ & 200.0 & 300.0& 400.0 & 500.00 \\
   		Grö\ss{}e 2$^\text{a}$ & 20.00 & 30.00 & 40.00 & 60.00 \\
  		 Summe & 220.00 & 330.00$^\text{b}$ & 440 & 560.00 \\
   		Produkt & 4000.00 & 9000.00 & 16000.00 & 30000.00$^\text{c}$\\%</tag> \\
   		\bottomrule
   		\end{tabular}%
\end{filecontents}

\begin{document}

\begin{table}[htbp]
	\centering
  	\caption{Anwendung von Excel2LaTeX mit Workaround}\label{tab:beispiel}
   		\begin{threeparttable}
   		{\inputencoding{ansinew}   
   		\sisetup{
   			table-figures-decimal = 1,
   			table-space-text-post = $^\text{a}$
   		}
    		\begin{tabularx}{\textwidth}{
    			X 
    			S [table-align-text-post = false]
    			S [table-align-text-post = false]
    			S [table-align-text-post = false]
    			S [table-align-text-post = false]}
    			\toprule
    			Formel &
    			\multicolumn{1}{X}{Versuch 1} &
    			\multicolumn{1}{X}{Versuch 2} &
    			\multicolumn{1}{X}{Versuch 3} &
    			\multicolumn{1}{X}{Versuch 4} \\
    			\midrule
    			\ExecuteMetaData[Tabelle1.tex]{tag}
 				\bottomrule
 			\end{tabularx}
 		}
    		\begin{tablenotes}
				\item[$^\text{a}$] ß mit \ss{} als vorläufige Lösung
				\item[$^\text{b}$] Erläuterung zur Summe von Versuch 2
				\item[$^\text{c}$] Erläuterung zum Produkt von Versuch 4
			\end{tablenotes}
		\end{threeparttable}	
\end{table}

%\CatchFileBetweenTags{testfile1}{file1.tex}{tag}

\end{document}
Dateianhänge
test.pdf
(45.69 KiB) 274-mal heruntergeladen

AufDieSchnelle

Beitrag von AufDieSchnelle »

Hoi B.O.D.

Ich persönlich halte von diesen "Tools" nichts allzu viel, da es meistens an irgendwelchen kleinen Problemen scheitert. Daher bin ich dazu übergegangen, mir die Latex-Dateien mit Skript (z.B. Python oder Ruby) selber zu erzeugen und diese dann immer mit \input{} dorthin zu laden, wo sie benötigt werden.

Deinem Editor musst Du dann sagen, dass er vor der Latex-Kompilierung die Skriptdatei ausführen soll. So hast Du immer schön sauberen Latex-Code.

B.O.D
Forum-Anfänger
Forum-Anfänger
Beiträge: 14
Registriert: Do 19. Nov 2015, 09:47

Beitrag von B.O.D »

Hallo AufDieSchnelle,

du hast nicht zufällig ein Beispiel?

Beste Grüße

AufDieSchnelle

Beitrag von AufDieSchnelle »

Gehen wir einmal von folgendem Beispiel aus:
\documentclass[10pt,a4paper]{scrartcl}
...
...
...
\begin{document}

\input{tbls/tbl001.tex}

\end{document}
Dann musst Du lediglich die Datei "tbl001.tex" mit einem Script erzeugen. Letztlich sind ja Tex-Dateien nichts anderes sind wie Textdateien. Du musst also wie folgt vorgehen:

- Zugriff auf Excel mittels einer Programmiersprache ODER
- Schreiben eines Makros mit VBA

dass Dir deine

- Latex-Datei 'tbl001.tex" im Ordner 'tbl' erzeugt.

Mit Ruby sieht das Erzeugen einer Datei in der Kodierung UTF-8 wie folgt aus:
File.open('c:/.../tbl/tbl001.tex', 'w:utf-8') do |f|
  f.puts "\\begin{tabular}{ll}"
   ...
   ...
  f.puts "\end{tabular}"
end
Bei Nutzung einer anderen Programmiersprache natürlich anders.

B.O.D
Forum-Anfänger
Forum-Anfänger
Beiträge: 14
Registriert: Do 19. Nov 2015, 09:47

Temporäre Lösung

Beitrag von B.O.D »

Hallo Latex-Freunde,

ich habe den Quellcode von Excel2Latex angepasst. Das Tool speichert nun das Tex-File in UTF-8 ab.

Für all jene, die sich dafür interessieren. Der Quell-Code wurde wie folgt angepasst. Die verwendete Quelle ist im Code einsehbar.
Public Sub SaveConversionResultToFile(ByVal pModel As IModel)
    Dim sFileName As String
    sFileName = pModel.AbsoluteFileName
    If sFileName = "" Then Exit Sub
    
    'Start: Urspruengliche Loesung
        'Open sFileName For Output As 1
        'Print #1, pModel.GetConversionResult;
        'Close #1
    'Ende: Urspruengliche Loesung
    
    'Start: UTF-8-Loesung
    'Quelle: https://stackoverflow.com/questions/2524703/save-text-file-utf-8-encoded-with-vba
        Dim fsT As Object
        'Create Stream object
        Set fsT = CreateObject("ADODB.Stream")
    
        'Specify stream type - we want To save text/string data.
        fsT.Type = 2
    
        'Specify charset For the source text data.
        fsT.Charset = "utf-8"
    
        'Open the stream And write binary data To the object
        fsT.Open
        fsT.writetext pModel.GetConversionResult
    
        'Save binary data To disk
        fsT.SaveToFile sFileName, 2
    'Ende: UTF-8-Loesung
    
End Sub
Ich für meinen Teil bin damit nun zufrieden. Möglicherweise werde ich mich verstärkt mit VBA auseinandersetzen und einige Features ergänzen, um zum Beispiel den Workaround mit dem 'catchbetweentag'-Paket zu entfernen.

Aktuell denke ich an zusätzliche Optionen, um die Tabellen-Umgebung anzupassen.

Damit ist Excel2Latex für mich das Top-Tool, wenn es um Tabellen und einen schönen und bequemen Workflow geht.

Danke für den Input

Antworten