VBA-Module mittels Maven aus Microsoft Office-Datei extrahieren

09.02.2023

Der Artikel zeigt wie man VBA-Module mittels Maven aus Microsoft Office-Dateien extrahieren kann. Dies ist hilfreich, um diese getrennt als Quellcode einchecken und versionieren zu können.

Hierzu lässt sich eine Klasse von Apache POI verwenden, der VBAMacroExtractor.

Um dies in den Maven-Build-Prozess zu integrieren entwickeln wir ein kleines Maven Plugin.

Dazu legen wir ein neues Maven-Projekt an. Als Packaging wählen wir „maven-plugin“.

Nun benötigen wir noch ein paar Dependencies. Für das Maven-Plugin selbst werden die folgenden Dependencies mit Scope „provided“ benötigt:

  • „org.apache.maven:maven-plugin-api“
  • „org.apache.maven.plugin-tools:maven-plugin-annotations“

Will man zusätzlich noch auf Informationen des Projekts zugreifen, benötigt man außerdem „org.apache.maven:maven-project“. Dies ist für unsere einfache Variante jedoch nicht nötig.

Um den VBAMacroExtractor von Apache POI nutzen zu können, ist natürlich noch die Apache POI-Dependency nötig: „org.apache.poi:poi:5.2.3“.

Bei unserer Java-Version war es darüber hinaus nötig, eine neuere Version des maven-plugin-plugin-Plugins zu verwenden:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-plugin-plugin</artifactId>
    <version>3.7.0</version>
    <!-- https://stackoverflow.com/a/38547240/1439628 -->
</plugin>

Nun noch das eigentlich Plugin:

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.poi.poifs.macros.VBAMacroExtractor;

import java.io.File;
import java.io.IOException;

@Mojo(
  name = "extract-vba", 
  defaultPhase = LifecyclePhase.GENERATE_RESOURCES
) 
public class VBAMacroExtractorMavenPlugin extends AbstractMojo {

   @Parameter(required = true) 
   private String sourceFilePath;

   @Parameter(required = true) 
   private String targetDirPath;

   @Override 
   public void execute() throws MojoExecutionException, MojoFailureException {
      try {
         new VBAMacroExtractor().extract(new File(sourceFilePath), new File(targetDirPath));
      } catch (IOException e) {
         // Fehlerhandling für das Beispiel vereinfacht. 
         // In der Realität würde man vermutlich unterscheiden zwischen MojoExecutionException und MojoFailureException.
         // Eine gute Erklärung dazu findet sich hier:
         // https://books.sonatype.com/mvnref-book/reference/writing-plugins-sect-custom-plugin.html#writing-plugins-sect-failure
         throw new MojoExecutionException(e.getMessage(), e); 
      }
   }
}

Dann Maven-Release bauen und schon kann das Plugin genutzt werden.
Dazu fügen wir es einfach in den Maven-Build-Prozess ein. Als Konfiguration übergeben wir den Pfad der Office-Datei, aus der die VBA-Module extrahiert werden sollen. Außerdem konfigurieren wir ein Zielverzeichnis, in das die VBA-Module extrahiert werden sollen.

<build>
    <plugins>
        ...
        <plugin>
            <groupId>de.example</groupId>
            <artifactId>vba-macro-export-maven-plugin</artifactId>
            <version>1.0</version>
            <executions>
                <execution>
                    <configuration>
                        <sourceFilePath>${project.basedir}/src/main/resources/my_excel.xlsm</sourceFilePath>
                        <targetDirPath>${project.basedir}/src/main/resources/my_excel_vba/</targetDirPath>
                    </configuration>
                    <goals>
                        <goal>extract-vba</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

</build>

Obiges Beispiel würde beim Buildvorgang des Projekts aus einer Excel-Datei „my_excel.xlsm“ alle VBA-Module ins Unterverzeichnis „my_excel_vba“ exportieren:

|
\---src
    \---main
        \---resources
            |   my_excel.xlsm
            |
            \---my_excel_vba
                    DieseArbeitsmappe.vba
                    Tabelle1.vba

Quellen / Links:

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*