Verwenden von Jacob zum Konvertieren von Excel in PDF-Problemzusammenfassung

Schaffen Sie weiter, beschleunigen Sie das Wachstum! Dies ist der erste Tag meiner Teilnahme an der „Nuggets Daily New Plan · June Update Challenge“, klicken Sie hier, um die Details der Veranstaltung anzuzeigen

Hallo zusammen, ich bin ein kleiner grauer Affe, ein Programmierer, der sehr gut darin ist, Fehler zu schreiben!

Lange Zeit nicht gesehen, teilte ich ein neues Problem mit, das kürzlich in der Projektentwicklung aufgetreten ist, über die Notwendigkeit, easyexcel zum Generieren von Excel und Jacob zum Konvertieren in PDF zu verwenden. Ich fand zunächst einige verwandte Tutorials im Internet, und nach dem Screening fand ich dass es immer noch die Verwendung von Jacob to Call Office-Software für die Konvertierung war, ist die zuverlässigste. Dann werde ich Ihnen ein Tutorial zur Verwendung von Jacob zum Konvertieren von Excel-Dateien in PDF geben, eine Zusammenfassung von zwei Methoden zum Konvertieren von Excel in PDF

Aber später stellte ich in der Praxis fest, dass der ursprüngliche Code nur eine grundlegende Konvertierung erreichen kann und einige Probleme bei komplexerem oder umfangreicherem Datencode auftreten.

Die grundlegende Funktionsweise der Konvertierung mit Jacob ist ähnlich wie bei anderen Tutorials im Internet. Hier zeichne ich hauptsächlich einige der Probleme auf, auf die ich bei der Konvertierung gestoßen bin, sowie einige Dinge, die auf der Grundlage des einfachsten Excel-zu-PDF-Codes hinzugefügt wurden.

Problem 1. Wenn viele Excel-Datenspalten vorhanden sind, werden die Spalten im PDF nicht vollständig gedruckt.

Bei einigen komplexeren Datentabellen gibt es viele Datenspalten.Manchmal ist bei der PDF-Konvertierung nach den normalen Einstellungen die Spaltenanzeige oft unvollständig und einige Spalten laufen über. Als Reaktion auf dieses Problem können Sie einige Einstellungen in Excel vornehmen, um PDF zu konvertieren. Die Einstellpunkte und ihre Parameter können im folgenden Code eingestellt werden:

Dispatch.put(value, "key",);
复制代码

Hier stelle ich Eigenschaften wie Skalierung, vertikales Drucken, Zeile und Spalte ein, um die oben genannten Probleme zu lösen. Diese Einstellungen sind im folgenden Code zu sehen. Sie können die gleichen Einstellungen direkt an der entsprechenden Stelle Ihres Konvertierungscodes vornehmen. Natürlich ist der unten stehende Code direkt konfiguriert und kann kopiert und direkt verwendet werden.

Konvertierungsfunktion:

package com.gyg.util;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import com.spire.xls.FileFormat;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
import lombok.extern.slf4j.Slf4j;


/**
 * @author YunGang.Guo
 * @date 2022/01/05 16:44
 **/
@Slf4j
public class ExcelToPDFUtil {

    /**
     * 使用jacob实现excel转PDF
     *
     * @param inputFilePath  导入Excel文件路径
     * @param outputFilePath 导出PDF文件路径
     */
    public static void jacobExcelToPDF(String inputFilePath, String outputFilePath) {
        ActiveXComponent ax = null;
        Dispatch excel = null;

        try {
            ComThread.InitSTA();
            ax = new ActiveXComponent("Excel.Application");
            ax.setProperty("Visible", new Variant(false));
            //禁用宏
            ax.setProperty("AutomationSecurity", new Variant(3));

            Dispatch excels = ax.getProperty("Workbooks").toDispatch();

            Object[] obj = {
                    inputFilePath,
                    new Variant(false),
                    new Variant(false)
            };

            excel = Dispatch.invoke(excels, "Open", Dispatch.Method, obj, new int[9]).toDispatch();

            //获取到sheets的集合对象
            Dispatch sheets = Dispatch.get(excel, "sheets").toDispatch();
            //获取到总表数
            int count = Dispatch.get(sheets, "count").changeType(Variant.VariantInt).getInt();
            for (int i = 1; i <= count; i++) {
                //获取到sheet页
                Dispatch sheet = Dispatch.invoke(sheets, "Item", Dispatch.Get, new Object[]{i}, new int[1]).toDispatch();
                Dispatch page = Dispatch.get(sheet, "PageSetup").toDispatch();
                //是否设置区域打印
                Dispatch.put(page, "PrintArea", false);
                //设置横向打印还是纵向打印
                Dispatch.put(page, "Orientation", 2);
                //设置缩放,值为100或false
                Dispatch.put(page, "Zoom", false);
                //所有行为一页
                Dispatch.put(page, "FitToPagesTall", false);
                //所有列为一页(1或false)
                Dispatch.put(page, "FitToPagesWide", 1);
                log.info("sheet页[" + i + "]设置成功,");
            }

            //转换格式
            Object[] obj2 = {
                    //PDF格式等于0
                    new Variant(0),
                    outputFilePath,
                    //0=标准(生成的PDF图片不会模糊),1=最小的文件
                    new Variant(0)
            };
            Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method, obj2, new int[1]);

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (excel != null) {
                Dispatch.call(excel, "Close", new Variant(false));
            }
            if (ax != null) {
                ax.invoke("Quit", new Variant[]{});
                ax = null;
            }
            ComThread.Release();
        }
    }
}

复制代码

Problem 2. Bei einer großen Datenmenge wird die PDF-Seite unscharf und gelöst

Da die zu exportierende Datenmenge der Excel-Tabelle in einem normalen Projekt sehr groß ist, ist es in diesem Fall in der Regel unwahrscheinlich, dass eine Tabelle einer Seite im konvertierten PDF entspricht. Wenn Jacob konvertiert, wird jedoch standardmäßig eine Tabelle auf einer Seite erstellt, wodurch die Daten auf eine besonders kleine Größe skaliert werden, was zu unscharfen Daten führt. In diesem Fall können wir im Allgemeinen einige Einstellungen im Prozessor hinzufügen, der Excel schreibt, sodass sich Excel bei der PDF-Konvertierung an PDF-Seiten anpassen und Daten, die nicht auf einer Seite gespeichert werden können, automatisch der nächsten Seite zuweisen kann. Gleichzeitig wird beim Drucken die Titelzeile auf jeder Seite erhöht.

Hier nutze ich easyexcel zum Generieren von Excel und nutze einen separaten Prozessor, wenn Sie es verwenden, können Sie auch die Einstellungen zum Drucken von PDF als separaten Prozessor verwenden. Der vollständige Code für diesen Prozessor lautet wie folgt:

package com.gyg.util;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 * @author YunGang.Guo
 * @date 2022/04/20 11:30
 **/
public class PrintExcelHandler implements SheetWriteHandler {

    /**
     * 该sheet页的表头列数,用于冻结表头
     */
    int handColNum;

    PrintExcelHandler(int handColNum){
        this.handColNum = handColNum;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        //冻结表头,设置打印的每一页上都加上标题行
        CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, handColNum);
        sheet.setRepeatingRows(cellRangeAddress);
        //设置横向打印
        sheet.getPrintSetup().setLandscape(true);
        sheet.getPrintSetup().setFitHeight((short) 0);
        //设置所有列为一页
        sheet.setFitToPage(true);
        //设置是否显示网格线
        sheet.setDisplayGridlines(false);
    }
}

复制代码

Die oben genannten zwei Probleme, auf die ich gestoßen bin, als ich easyexcel zum Generieren von Excel und Jacob zum Konvertieren in PDF verwendet habe. Ich werde diese beiden Aufzeichnungen vorerst erstellen. Wenn Sie weitere Fragen haben, können Sie miteinander kommunizieren!

Ich bin Grey Ape, bis zum nächsten Mal!

Ich denke du magst

Origin juejin.im/post/7103033813319548958
Empfohlen
Rangfolge