Mam kilka dokumentów Worda, każdy zawierający kilkaset stron danych naukowych, w tym:
- Wzory chemiczne (H2SO4 ze wszystkimi odpowiednimi indeksami dolnymi i indeksami górnymi)
- Liczby naukowe (wykładniki sformatowane przy użyciu indeksu górnego)
- Wiele równań matematycznych. Napisane przy użyciu edytora równań matematycznych w programie Word.
Problem polega na tym, że przechowywanie tych danych w programie Word nie jest dla nas wydajne. Chcemy więc przechowywać wszystkie te informacje w bazie danych (MySQL). Chcemy przekonwertować formatowanie na LaTex.
Czy jest jakiś sposób na iterację wszystkich skryptów dolnych, indeksów górnych i równań w dokumencie Word za pomocą VBA?
Odpowiedzi:
Tak jest. Sugerowałbym użycie Powershell, ponieważ całkiem dobrze obsługuje pliki Word. Myślę, że będę najłatwiejszym sposobem.
Więcej na temat automatyzacji Powershell vs Word tutaj: http://www.simple-talk.com/dotnet/.net-tools/com-automation-of-office-applications-via-powershell/
Przekopałem się trochę głębiej i znalazłem ten skrypt PowerShell:
Zapisz go jako .ps1 i zacznij od:
Zapisze cały plik doc z określonego katalogu jako pliki HTML. Mam więc plik doc, w którym mam H2SO4 z indeksami dolnymi, a po konwersji programu PowerShell wyniki są następujące:
Jak widać, indeksy dolne mają własne tagi w HTML, więc pozostaje tylko parsowanie pliku w bash lub c ++ w celu wycięcia z body do / body, zmiana na LATEX i usunięcie pozostałych tagów HTML.
Opracowałem parser w C ++, aby szukać indeksu HTML i zastąpić go indeksem LATEX.
Kod:
W przypadku pliku HTML:
Dane wyjściowe to:
Oczywiście nie jest to idealne, ale traktowanie jest dowodem koncepcji.
źródło
Możesz wyodrębnić xml bezpośrednio z dowolnego dokumentu biurowego w wersji 2007+. Odbywa się to w następujący sposób:
word
podfolderem idocument.xml
plikiem. Powinien zawierać całą treść dokumentu.Utworzyłem przykładowy dokument i znalazłem go w znacznikach body (zwróć uwagę, że szybko go poskładałem, więc formatowanie może być nieco wyłączone):
Wygląda na to, że
<w:t>
znacznik dotyczy tekstu,<w:rPr>
jest to definicja czcionki i<w:p>
nowy akapit.Odpowiednik słowa wygląda następująco:
źródło
Patrzyłem na inne podejście niż stosowane przez mnmnc.
Moje próby zapisania testowego dokumentu Word jako HTML nie zakończyły się sukcesem. W przeszłości odkryłem, że HTML generowany przez pakiet Office jest tak pełen plew, że wybranie żądanych bitów jest prawie niemożliwe. Przekonałem się, że tak właśnie jest w tym przypadku. Miałem też problem z równaniami. Program Word zapisuje równania jako obrazy. Dla każdego równania będą dwa obrazy, jeden z rozszerzeniem WMZ i jeden z rozszerzeniem GIF. Jeśli wyświetlasz plik HTML w Google Chrome, równania wyglądają OK, ale nie wspaniale; wygląd pasuje do pliku GIF, gdy jest wyświetlany za pomocą narzędzia do wyświetlania / edycji obrazu, które może obsługiwać przezroczyste obrazy. Jeśli wyświetlasz plik HTML w przeglądarce Internet Explorer, równania wyglądają idealnie.
Dodatkowe informacje
Powinienem był zawrzeć tę informację w oryginalnej odpowiedzi.
Utworzyłem mały dokument Worda, który zapisałem jako HTML. Trzy panele na poniższym obrazku pokazują oryginalny dokument Word, dokument HTML wyświetlany w przeglądarce Microsoft Internet Explorer i dokument HTML wyświetlany w przeglądarce Google Chrome.
Jak wyjaśniono wcześniej, różnica między obrazami IE i Chrome wynika z dwukrotnego zapisania równań, raz w formacie WMZ i raz w formacie GIF. HTML jest za duży, aby go tu wyświetlić.
HTML utworzony przez makro to:
Który wyświetla się jako:
Nie próbowałem konwertować równań, ponieważ bezpłatny zestaw MathType Software Development Kit najwyraźniej zawiera procedury konwertowane na LaTex
Kod jest dość prosty, więc niewiele komentarzy. Zapytaj, czy coś jest niejasne. Uwaga: jest to ulepszona wersja oryginalnego kodu.
źródło
Najprostszym sposobem na to jest po prostu następujące linie w VBA:
Znajduje to cały tekst w indeksie górnym. Jeśli chcesz coś z tym zrobić, po prostu wstaw to do metody. Na przykład, aby znaleźć słowo „super” w indeksie górnym i przekształcić je w „super znaleziono”, użyj:
źródło