利用Jacob將Excel轉(zhuǎn)換PDF的問題匯總
前言
好久不見,分享一個近期在項目開發(fā)中遇到的一個新問題,關(guān)于使用easyexcel生成Excel,并且使用jacob轉(zhuǎn)換成PDF的需求,最開始的時候在網(wǎng)上找了一些相關(guān)的教程,經(jīng)過篩選之后發(fā)現(xiàn)還是使用jacob調(diào)用office軟件來進行轉(zhuǎn)換是最可靠的。然后就和大家出了一篇關(guān)于使用jacob將Excel文件轉(zhuǎn)換PDF的教程,Excel轉(zhuǎn)換PDF兩種方法總結(jié)
但是后來我在實踐操作中發(fā)現(xiàn),原來的代碼只能實現(xiàn)基本轉(zhuǎn)換,對于一些較為復雜或數(shù)據(jù)量較大的代碼就會出現(xiàn)一些問題,
使用Jacob轉(zhuǎn)換的基本操作和網(wǎng)上其他的教程基本類似,在這里我主要記錄一下我在轉(zhuǎn)換中遇到的一些問題,以及在最基本的Excel轉(zhuǎn)PDF的代碼的基礎(chǔ)上增加的一些東西。
問題一、Excel數(shù)據(jù)列較多時,PDF中列打印不全,
對于一些比較復雜的數(shù)據(jù)表,數(shù)據(jù)列非常的多,有時候按照正常設置在轉(zhuǎn)換PDF的時候,經(jīng)常會出現(xiàn)列顯示不全,部分列溢出的情況。 針對這個問題,可以在Excel轉(zhuǎn)換PDF中做一些設置。其中設置項及其參數(shù)可以在如下的代碼中設置:
Dispatch.put(value, "key",);
在這里我設置了縮放、縱向打印、行列等屬性來解決上面的問題,這些設置可以在下面的代碼中看到,大家可以直接在自己的轉(zhuǎn)換代碼對應位置做同樣的設置。當然我下面的代碼是直接配置好的,可以直接復制使用。
轉(zhuǎ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實現(xiàn)excel轉(zhuǎn)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();
//獲取到總表數(shù)
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();
//是否設置區(qū)域打印
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 + "]設置成功,");
}
//轉(zhuǎn)換格式
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();
}
}
}問題二、大量數(shù)據(jù)時,PDF頁模糊解決
在平常項目中需要導出的Excel表中的數(shù)據(jù)量是非常大的,對于這種情況,一般在轉(zhuǎn)換的PDF中一張表對應一頁是不太可能的。但是Jacob轉(zhuǎn)換時默認就是讓一個表在一頁上,這樣就導致了數(shù)據(jù)會被縮放的特別小,導致數(shù)據(jù)模糊。 對于這種情況,我們一般可以在寫Excel的處理器中增加一些設置,讓Excel在轉(zhuǎn)換PDF的時候,可以自適應PDF頁,并且對于一頁存放不下的數(shù)據(jù),自動分配到下一頁。同時設置打印時每一頁上都增加標題行。
我在這里是使用了easyexcel生成Excel,并且使用了一個單獨的處理器,小伙伴們在使用的時候,也可以將打印PDF的設置項作為一個單獨的處理器去使用。該處理器的完整代碼如下:
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頁的表頭列數(shù),用于凍結(jié)表頭
*/
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();
//凍結(jié)表頭,設置打印的每一頁上都加上標題行
CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, handColNum);
sheet.setRepeatingRows(cellRangeAddress);
//設置橫向打印
sheet.getPrintSetup().setLandscape(true);
sheet.getPrintSetup().setFitHeight((short) 0);
//設置所有列為一頁
sheet.setFitToPage(true);
//設置是否顯示網(wǎng)格線
sheet.setDisplayGridlines(false);
}
}以上就是我在使用easyexcel生成Excel,并且使用jacob轉(zhuǎn)換成PDF時遇到的兩個問題,暫且做這兩個記錄,如果小伙伴們還有其他問題,可以一起交流!
總結(jié)
到此這篇關(guān)于利用Jacob將Excel轉(zhuǎn)換PDF問題的文章就介紹到這了,更多相關(guān)Jacob將Excel轉(zhuǎn)換PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot2.6.x默認禁用循環(huán)依賴后的問題解決
由于SpringBoot從底層逐漸引導開發(fā)者書寫規(guī)范的代碼,同時也是個憂傷的消息,循環(huán)依賴的應用場景實在是太廣泛了,所以SpringBoot 2.6.x不推薦使用循環(huán)依賴,本文給大家說下SpringBoot2.6.x默認禁用循環(huán)依賴后的應對策略,感興趣的朋友一起看看吧2022-02-02
推薦兩款java開發(fā)實用工具 hutool 和 lombok
通過本文給大家推薦兩款java開發(fā)實用工具 hutool 和 lombok,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2021-04-04
SpringBoot實現(xiàn)application配置信息加密
在配置文件中,我們有開發(fā)環(huán)境配置和生產(chǎn)環(huán)境配置,而生產(chǎn)環(huán)境的配置信息是需要做好防護的,避免外泄,所以本文為大家整理了application配置信息加密的方法,需要的可以參考下2023-07-07
springboot中實現(xiàn)通過后臺創(chuàng)建臨時表
這篇文章主要介紹了springboot中實現(xiàn)通過后臺創(chuàng)建臨時表操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
springboot2.3之后hibernate-validator依賴缺失【踩坑】
這篇文章主要介紹了springboot2.3之后hibernate-validator依賴缺失【踩坑】,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解
這篇文章主要介紹了Java之a(chǎn)pi網(wǎng)關(guān)斷言及過濾器案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
解決springcloud啟動時報錯Connection refused:connect問題
這篇文章主要介紹了解決springcloud啟動時報錯Connection refused:connect問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05

