Uso de Jacob para convertir Excel a PDF Resumen del problema

¡Continúe creando, acelere el crecimiento! Este es el primer día de mi participación en el "Nuggets Daily New Plan · June Update Challenge", haz clic para ver los detalles del evento

Hola a todos, soy un pequeño simio gris, ¡un programador que es muy bueno escribiendo errores!

Mucho tiempo sin verme, compartiendo un nuevo problema encontrado recientemente en el desarrollo de proyectos, sobre la necesidad de usar easyexcel para generar Excel y usar jacob para convertir a PDF, encontré algunos tutoriales relacionados en Internet al principio, y después de la selección, encontré que todavía estaba usando jacob para llamar al software de oficina para la conversión es el más confiable. Luego compartiré con ustedes un tutorial sobre cómo usar jacob para convertir archivos de Excel a PDF, un resumen de dos métodos para convertir Excel a PDF

Pero luego descubrí en la práctica que el código original solo puede lograr una conversión básica, y surgirán algunos problemas para algunos códigos de datos más complejos o grandes.

La operación básica de convertir con Jacob es similar a otros tutoriales en Internet, aquí registro principalmente algunos de los problemas que encontré en la conversión, así como algunas cosas agregadas en base al código más básico de Excel a PDF.

Problema 1. Cuando hay muchas columnas de datos de Excel, las columnas del PDF no se imprimen por completo.

Para algunas tablas de datos más complejas, hay muchas columnas de datos. A veces, al convertir PDF de acuerdo con la configuración normal, la visualización de la columna suele estar incompleta y algunas columnas se desbordan. En respuesta a este problema, puede realizar algunas configuraciones en Excel para convertir PDF. Los elementos de configuración y sus parámetros se pueden configurar en el siguiente código:

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

Aquí configuro propiedades como escala, impresión vertical, fila y columna para resolver los problemas anteriores. Estas configuraciones se pueden ver en el código a continuación. Puede hacer las mismas configuraciones directamente en la posición correspondiente de su código de conversión. Por supuesto, el código a continuación se configura directamente y se puede copiar y usar directamente.

Función de conversión:

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();
        }
    }
}

复制代码

Problema 2. Cuando hay una gran cantidad de datos, la página del PDF se desenfoca y se soluciona

La cantidad de datos en la tabla de Excel que debe exportarse en un proyecto normal es muy grande. En este caso, generalmente es poco probable que una tabla corresponda a una página en el PDF convertido. Sin embargo, cuando Jacob convierte, el valor predeterminado es crear una tabla en una página, lo que hace que los datos se escalen a un tamaño particularmente pequeño, lo que da como resultado datos borrosos. En este caso, generalmente podemos agregar algunas configuraciones en el procesador que escribe Excel, para que cuando Excel convierta PDF, pueda adaptarse a las páginas PDF y asignar automáticamente los datos que no se pueden almacenar en una página a la página siguiente. Al mismo tiempo, está configurado para aumentar la línea de título en cada página al imprimir.

Aquí uso easyexcel para generar Excel y uso un procesador separado.Cuando lo usa, también puede usar la configuración para imprimir PDF como un procesador separado. El código completo de este procesador es el siguiente:

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);
    }
}

复制代码

Los anteriores son los dos problemas que encontré al usar easyexcel para generar Excel y usar jacob para convertir a PDF. Haré estos dos registros por el momento. Si tiene otras preguntas, ¡pueden comunicarse juntos!

Soy Grey Ape, ¡hasta la próxima!

Supongo que te gusta

Origin juejin.im/post/7103033813319548958
Recomendado
Clasificación