fei
2 天以前 5d91a329768a2a86e01e4b9b6bc6a2b939b87adb
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtilManySheetSecond.java
@@ -22,7 +22,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -269,7 +271,30 @@
        this.init(list, sheetName, Excel.Type.EXPORT);
        exportExcel(response.getOutputStream());
    }
    private static double calculateScaleForCm(byte[] imageData, double widthCm, double heightCm) throws IOException {
        // 读取图片获取原始尺寸
        BufferedImage img = ImageIO.read(new ByteArrayInputStream(imageData));
        double originalWidthPx = img.getWidth();
        double originalHeightPx = img.getHeight();
        // Excel默认DPI(96)
        double excelDpi = 96.0;
        double pixelsPerCm = excelDpi / 2.54;
        // 目标像素尺寸
        double targetWidthPx = widthCm * pixelsPerCm;
        double targetHeightPx = heightCm * pixelsPerCm;
        // 计算比例(取宽高中的较小比例,保持纵横比)
        double scaleWidth = targetWidthPx / originalWidthPx;
        double scaleHeight = targetHeightPx / originalHeightPx;
        System.out.println("-=========67676");
        System.out.println(originalHeightPx);
        System.out.println(originalWidthPx);
        System.out.println(targetWidthPx);
        System.out.println(targetHeightPx);
        return Math.min(scaleWidth, scaleHeight);
    }
    /**
     * 对list数据源将其里面的数据导入到excel表单
     *
@@ -348,13 +373,27 @@
                        // 创建图片锚点,设置在第2行第2列
                        // 二维码显示在右上角且不填满整个格子
                        // 缩小图片范围:只占用部分单元格空间
                        ClientAnchor anchor = new HSSFClientAnchor(680, 0, 1000, 250, (short) 1, 2, (short) 1, 2);
                        ClientAnchor anchor = new HSSFClientAnchor(699, 0, 1023, 97, (short) 1, 2, (short) 1, 3);
                        // 设置图片位置和大小
                        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE);
                        
                        // 添加图片到工作表
                        getDrawingPatriarch(sheet).createPicture(anchor,
                        org.apache.poi.ss.usermodel.Picture picture = getDrawingPatriarch(sheet).createPicture(anchor,
                                wb.addPicture(data, getImageType(data)));
                        int pictureIdx = wb.addPicture(data, getImageType(data));
                     //   Picture picture = drawing.createPicture(anchor, pictureIdx);
// 关键:计算并应用3.15cm的缩放
//                        double targetSizeCm = 3.15;
//
//// 方法1:使用精确计算
//                        double scale = calculateScaleForCm(data, targetSizeCm, targetSizeCm);
//                        System.out.println(scale);
//                        picture.resize(scale);
                        // 二维码添加完成后,恢复原来的列宽设置
                        sheet.setColumnWidth(1, currentColumnWidth);
                    }
@@ -380,6 +419,8 @@
                    System.out.println(declaredFields.length);
                    int i = 0;
                    for (Field field : declaredFields) {
                        if(i==9)
                            break;
                        // 设置字段的访问权限,以便于访问私有字段
                        field.setAccessible(true);
@@ -410,7 +451,7 @@
                        sheet.setColumnWidth(1, (int) ((51.57 + 0.72) * 256)); // 第二列:宽度51
                        CellStyle style = wb.createCellStyle();
                        style.setAlignment(HorizontalAlignment.RIGHT);
                        style.setAlignment(HorizontalAlignment.LEFT);
                        style.setVerticalAlignment(VerticalAlignment.BOTTOM); // 设置垂直下对齐
                        style.setWrapText(true); // 设置自动换行
@@ -517,7 +558,7 @@
                                // 条形码居中且不超出第二个格子
                                // 调整结束列索引和位置参数
                                // 增加dx1值,使条形码整体向右移动
                                ClientAnchor anchor1 = new HSSFClientAnchor(660, 0, 900, 60, (short) 0, 9, (short) 1, 10);
                                ClientAnchor anchor1 = new HSSFClientAnchor(537, 0, 788, 245, (short) 0, 9, (short) 1, 9);
                                // 设置图片位置和大小
                                anchor1.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE);
@@ -861,7 +902,7 @@
        Cell cell = null;
        try {
            // 设置行高为自动调整
            row.setHeight((short) -1);
          //  row.setHeight((short) -1);
            // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列.
            if (attr.isExport()) {
                // 创建cell
@@ -905,6 +946,9 @@
                    // 设置列类型
                    setCellVo(value, attr, cell);
                }
                adjustRowHeightAfterSetValue(row, cell, value);
                addStatisticsData(column, Convert.toStr(value), attr);
            }
        } catch (Exception e) {
@@ -912,7 +956,65 @@
        }
        return cell;
    }
    /**
     * 设置值后调整行高
     */
    private void adjustRowHeightAfterSetValue(Row row, Cell cell, Object value) {
        if (value == null) return;
        String text = value.toString();
        Sheet sheet = row.getSheet();
        // 1. 计算自动高度(基于内容)
        short autoHeight = calculateSimpleAutoHeight(text, cell);
        // 2. 获取当前行高
        short currentHeight = row.getHeight();
        if (currentHeight == -1) {
            currentHeight = sheet.getDefaultRowHeight();
        }
        // 3. 使用较大的高度(自动计算的高度或当前高度)
        short baseHeight = (short) Math.max(currentHeight, autoHeight);
        System.out.println(baseHeight+"aaaaaaaaatttttttt");
        // 4. 在基础上增加额外高度(100单位 = 5点)
        short extraHeight = 80;
        short newHeight = (short) (baseHeight + extraHeight);
        // 5. 限制最大高度
        short maxHeight = (short) 4000; // 100点
        row.setHeight((short) Math.min(maxHeight,newHeight));
    }
    /**
     * 简化的自动高度计算
     */
    private short calculateSimpleAutoHeight(String text, Cell cell) {
        if (text == null || text.isEmpty()) return 0;
        Sheet sheet = cell.getSheet();
        int colIndex = cell.getColumnIndex();
        // 获取列宽(字符数)
        int colWidthChars = sheet.getColumnWidth(colIndex) / 256;
        if (colWidthChars <= 0) colWidthChars = 10;
        // 计算文本行数
        int lines = 1;
        if (text.contains("\n")) {
            // 有显式换行
            String[] parts = text.split("\n");
            for (String part : parts) {
                lines += Math.max(1, (int) Math.ceil(part.length() * 1.5 / colWidthChars));
            }
        } else {
            // 自动换行
            lines = (int) Math.ceil(text.length() * 1.5 / colWidthChars);
        }
        // 每行高度:假设18点(360 POI单位)
        return (short) (lines * 360);
    }
    /**
     * 设置 POI HSSFSheet 单元格提示
     *