瀏覽代碼

Merge branch 'refs/heads/feature-lihb-20250812' into dev

LHB 3 天之前
父節點
當前提交
4599ab7240

+ 34 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ExcelInfoUtils.java

@@ -1,5 +1,8 @@
 package org.springblade.manager.utils;
 
+import com.aspose.cells.Column;
+import com.aspose.cells.ColumnCollection;
+import com.aspose.cells.SaveFormat;
 import com.spire.xls.CellRange;
 import com.spire.xls.FileFormat;
 import com.spire.xls.Workbook;
@@ -18,9 +21,8 @@ import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.vo.DateFormat;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
+import java.awt.*;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -37,7 +39,7 @@ public class ExcelInfoUtils {
 
             // 解析原始excel
             Workbook wb = new Workbook();
-            wb.loadFromMHtml(inputStream);
+            wb.loadFromMHtml(getInputStreamByUrl(inputStream));
             Worksheet sheet = wb.getWorksheets().get(0);
             HTMLOptions options = new HTMLOptions();
             options.setImageEmbedded(true);
@@ -207,6 +209,34 @@ public class ExcelInfoUtils {
             e.printStackTrace();
         }
     }
+
+
+    /**
+     * 解析excel 对隐藏的列设置初始列宽
+     * @param inputStream
+     * @return
+     * @throws Exception
+     */
+    public static InputStream getInputStreamByUrl(InputStream inputStream) throws Exception {
+        com.aspose.cells.Workbook workbook = new com.aspose.cells.Workbook(inputStream);
+        com.aspose.cells.Worksheet worksheet = workbook.getWorksheets().get(0);
+        // 获取工作表中所有列
+        ColumnCollection columns = worksheet.getCells().getColumns();
+        // 遍历所有列
+        for (int i = 0; i < columns.getCount(); i++) {
+            Column column = columns.get(i);
+            // 如果列是隐藏的(列宽为0)
+            if (column.isHidden()) {
+                // 解除隐藏并设置一个最小列宽(例如0.1)
+                column.setHidden(false);
+                column.setWidth(0.1);
+            }
+        }
+        // 将工作簿保存到ByteArrayOutputStream,然后转换为ByteArrayInputStream
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        workbook.save(outputStream, SaveFormat.XLSX);
+        return new ByteArrayInputStream(outputStream.toByteArray());
+    }
     /**
      * 在线编辑excel 操作
      *

+ 67 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -1,7 +1,6 @@
 package org.springblade.manager.utils;
 
-import com.aspose.cells.PdfSaveOptions;
-import com.aspose.cells.SaveFormat;
+import com.aspose.cells.*;
 import com.aspose.cells.Workbook;
 import com.drew.imaging.ImageMetadataReader;
 import com.drew.imaging.ImageProcessingException;
@@ -302,7 +301,70 @@ public class FileUtils {
         }
     }
 
+    /**
+     * Excel 转 PDF(完整缩放到 A4 纸张)
+     *
+     * @param excelPath  Excel 文件路径
+     * @param pdfPath    输出 PDF 路径
+     */
+    public static void excelToPdf(String excelPath, String pdfPath, Boolean a) {
+        // 显式指定中文字体
+        FontConfigs.setDefaultFontName("WenQuanYi Micro Hei"); // 文泉驿微米黑
+        FontConfigs.setFontSubstitutes("SimSun", new String[]{"WenQuanYi Micro Hei"}); // 宋体替代
+        Workbook workbook = null;
+        try {
+            // 1. 创建输出目录(如果需要)
+            File pdfFile = new File(pdfPath);
+            File parentDir = pdfFile.getParentFile();
+            if (parentDir != null && !parentDir.exists()) {
+                parentDir.mkdirs();
+            }
 
+            // 2. 直接加载 Excel 文件(无需 Apache POI 中转)
+            workbook = new Workbook(excelPath);
+
+            // 3. 配置 PDF 保存选项
+            PdfSaveOptions pdfOptions = new PdfSaveOptions();
+            pdfOptions.setOnePagePerSheet(true); // 每张表单独一页
+
+            // 4. 遍历所有工作表设置 A4 缩放
+            WorksheetCollection worksheets = workbook.getWorksheets();
+            for (int i = 0; i < worksheets.getCount(); i++) {
+                com.aspose.cells.Worksheet sheet = worksheets.get(i);
+                PageSetup pageSetup = sheet.getPageSetup();
+
+                // 核心缩放设置
+                pageSetup.setPaperSize(PaperSizeType.PAPER_A_4);
+                pageSetup.setFitToPagesWide(1);  // 宽度缩放到1页
+                pageSetup.setFitToPagesTall(1);  // 高度缩放到1页
+
+                // 可选优化设置
+//                pageSetup.setOrientation(PageOrientationType.LANDSCAPE); // 横向(宽表格适用)
+                pageSetup.setPrintGridlines(false); // 不打印网格线
+
+                // 调整边距(毫米单位)
+                pageSetup.setLeftMargin(1);
+                pageSetup.setRightMargin(1);
+                pageSetup.setTopMargin(1);
+                pageSetup.setBottomMargin(1);
+            }
+
+            // 5. 保存为 PDF
+            workbook.save(pdfPath, pdfOptions);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 6. 释放资源(新版 Aspose.Cells 支持自动关闭)
+            if (workbook != null) {
+                try {
+                    workbook.dispose();
+                } catch (Exception e) {
+                    // 忽略关闭异常
+                }
+            }
+        }
+    }
     /**
      * excel 转pdf
      *
@@ -310,6 +372,9 @@ public class FileUtils {
      * @param pdfUrl
      */
     public static void excelToPdf(String exUrl, String pdfUrl) {
+        // 显式指定中文字体
+        FontConfigs.setDefaultFontName("WenQuanYi Micro Hei"); // 文泉驿微米黑
+        FontConfigs.setFontSubstitutes("SimSun", new String[]{"WenQuanYi Micro Hei"}); // 宋体替代
 
         org.apache.poi.ss.usermodel.Workbook ss = null;
         ByteArrayInputStream byteArrayInputStream = null;