Java利用 Spire.XLS for Java设置Excel行列自适应

在Java中使用Spire.XLS for Java设置Excel行列自适应,主要通过设置行高和列宽的自动调整功能来实现。以下是详细的实现方法和示例代码:

图片[1]_Java利用 Spire.XLS for Java设置Excel行列自适应_知途无界

1. 添加依赖

首先需要在项目中添加Spire.XLS的依赖:

Maven:​

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls</artifactId>
    <version>13.12.4</version>
</dependency>

Gradle:​

implementation 'e-iceblue:spire.xls:13.12.4'

2. 基本自适应设置方法

2.1 自动调整列宽

import com.spire.xls.*;

public class ExcelAutoFit {
    public static void main(String[] args) {
        // 创建工作簿
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 添加示例数据
        sheet.getRange("A1").setValue("姓名");
        sheet.getRange("B1").setValue("这是一个很长的列标题需要自适应宽度");
        sheet.getRange("A2").setValue("张三");
        sheet.getRange("B2").setValue("这是一段很长的文本内容,用于测试列宽自动调整功能的效果");
        
        // 方法1:自动调整所有列的宽度
        sheet.autoFitColumns();
        
        // 方法2:自动调整指定列的宽度(例如第1列和第2列)
        // sheet.getColumns()[0].autoFit();
        // sheet.getColumns()[1].autoFit();
        
        // 方法3:自动调整指定范围的列宽
        // sheet.getRange("A:B").getEntireColumn().autoFit();
        
        // 保存文件
        workbook.saveToFile("AutoFitColumns.xlsx", FileFormat.Version2013);
    }
}

2.2 自动调整行高

import com.spire.xls.*;

public class ExcelAutoFit {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 添加带换行符的文本(需要设置单元格样式支持自动换行)
        sheet.getRange("A1").setValue("第一行内容\n第二行内容\n第三行内容");
        sheet.getRange("B1").setValue("单行内容");
        
        // 设置单元格样式支持自动换行
        CellRange range = sheet.getRange("A1");
        range.getStyle().setWrapText(true); // 启用自动换行
        
        // 方法1:自动调整所有行的高度
        sheet.autoFitRows();
        
        // 方法2:自动调整指定行的高度
        // sheet.getRows()[0].autoFit();
        
        // 方法3:自动调整指定范围的行高
        // sheet.getRange("A1:B1").getEntireRow().autoFit();
        
        // 保存文件
        workbook.saveToFile("AutoFitRows.xlsx", FileFormat.Version2013);
    }
}

3. 综合示例:同时设置行列自适应

import com.spire.xls.*;

public class ExcelAutoFitComplete {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        
        // 禁用默认网格线,使效果更清晰
        workbook.getSettings().setShowGridLines(false);
        
        Worksheet sheet = workbook.getWorksheets().get(0);
        sheet.setName("自适应示例");
        
        // 设置表头
        sheet.getRange("A1:E1").merge(); // 合并标题行
        sheet.getRange("A1").setText("员工信息表");
        sheet.getRange("A1").getStyle().setHorizontalAlignment(HorizontalAlignType.Center);
        sheet.getRange("A1").getStyle().setFontSize(16);
        sheet.getRange("A1").getStyle().setColor(Color.darkBlue);
        sheet.getRange("A1").getStyle().setFontName("微软雅黑");
        
        // 设置列标题
        String[] headers = {"姓名", "部门", "职位", "工作内容", "备注"};
        for (int i = 0; i < headers.length; i++) {
            sheet.getRange(1, i + 1).setValue(headers[i]);
            sheet.getRange(1, i + 1).getStyle().setBackgroundColor(Color.lightGray);
            sheet.getRange(1, i + 1).getStyle().setHorizontalAlignment(HorizontalAlignType.Center);
        }
        
        // 添加数据(包含长文本和换行内容)
        Object[][] data = {
            {"张三", "技术研发部", "高级工程师", "负责Java后端开发\n参与架构设计\n解决技术难题", "优秀员工"},
            {"李四", "市场营销部", "市场经理", "制定营销策略\n管理营销团队\n拓展客户资源", "需要加强团队协作"},
            {"王五", "人力资源部", "HR专员这是一个很长的职位名称需要测试列宽自适应功能的有效性", 
             "招聘优秀人才\n员工培训与发展\n绩效管理", "新员工"},
            {"赵六", "财务部", "财务分析师", "财务报表分析\n成本控制\n预算管理", "注册会计师"}
        };
        
        // 填充数据
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                CellRange cell = sheet.getRange(i + 2, j + 1);
                cell.setValue(data[i][j]);
                
                // 为包含换行符的单元格启用自动换行
                if (data[i][j].toString().contains("\n")) {
                    cell.getStyle().setWrapText(true);
                }
            }
        }
        
        // 设置表格边框
        CellRange tableRange = sheet.getRange("A1:E5");
        tableRange.getBorder().setAround();
        tableRange.getBorder().setInside();
        
        // 自动调整列宽和行高
        autoFitSheet(sheet);
        
        // 保存文件
        workbook.saveToFile("ExcelAutoFitComplete.xlsx", FileFormat.Version2013);
        System.out.println("Excel文件生成成功!");
    }
    
    /**
     * 自动调整工作表的列宽和行高
     */
    private static void autoFitSheet(Worksheet sheet) {
        // 自动调整所有列宽
        sheet.autoFitColumns();
        
        // 自动调整所有行高
        sheet.autoFitRows();
        
        // 可选:设置最小列宽和最大行高限制
        setColumnWidthLimits(sheet);
        setRowHeightLimits(sheet);
    }
    
    /**
     * 设置列宽限制(避免过宽或过窄)
     */
    private static void setColumnWidthLimits(Worksheet sheet) {
        Columns cols = sheet.getColumns();
        for (int i = 0; i < cols.length(); i++) {
            Column col = cols.get(i);
            double currentWidth = col.getWidth();
            
            // 设置最小列宽为8(约8个字符宽度)
            if (currentWidth < 8) {
                col.setWidth(8);
            }
            // 设置最大列宽为50(避免过宽)
            else if (currentWidth > 50) {
                col.setWidth(50);
            }
        }
    }
    
    /**
     * 设置行高限制(避免过高)
     */
    private static void setRowHeightLimits(Worksheet sheet) {
        Rows rows = sheet.getRows();
        for (int i = 0; i < rows.length(); i++) {
            Row row = rows.get(i);
            double currentHeight = row.getHeight();
            
            // 设置最小行高为15(约15磅)
            if (currentHeight < 15) {
                row.setHeight(15);
            }
            // 设置最大行高为100(避免过高)
            else if (currentHeight > 100) {
                row.setHeight(100);
            }
        }
    }
}

4. 高级用法:自定义自适应策略

import com.spire.xls.*;

public class AdvancedAutoFit {
    public static void main(String[] args) {
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.getWorksheets().get(0);
        
        // 添加多样化的数据
        sheet.getRange("A1").setValue("产品名称");
        sheet.getRange("B1").setValue("这是一个超级长的产品名称需要测试自动调整列宽的功能是否正常工作");
        sheet.getRange("C1").setValue("价格");
        
        sheet.getRange("A2").setValue("智能手机");
        sheet.getRange("B2").setValue("全面屏手机 8GB+256GB 超长续航 高清摄像头 面部识别");
        sheet.getRange("C2").setValue(2999.99);
        
        // 设置B列自动调整,但有最大宽度限制
        Column columnB = sheet.getColumns()[1];
        columnB.autoFit();
        
        // 自定义最大宽度
        if (columnB.getWidth() > 40) {
            columnB.setWidth(40);
        }
        
        // 为特定行设置固定高度(不自动调整)
        Row row1 = sheet.getRows()[0];
        row1.setHeight(25); // 固定表头行高
        
        // 自动调整其他行
        for (int i = 1; i < sheet.getRows().length(); i++) {
            sheet.getRows().get(i).autoFit();
        }
        
        workbook.saveToFile("AdvancedAutoFit.xlsx", FileFormat.Version2013);
    }
}

5. 注意事项

  1. 自动换行​:对于包含换行符的文本,需要先设置setWrapText(true)才能正确调整行高。
  2. 性能考虑​:对于大型Excel文件,频繁的自动调整可能影响性能,建议在数据填充完成后统一调用autoFitColumns()autoFitRows()
  3. 精度控制​:可以通过设置最小/最大列宽和行高来避免过度调整。
  4. 合并单元格​:合并单元格可能影响自动调整的效果,需要特别处理。
  5. 字体影响​:不同的字体和字号会影响自动调整的结果,建议在设置完样式后再进行自适应调整。

通过以上方法,可以灵活地实现Excel行列的自适应调整,使生成的Excel文件更加美观和易读。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞35 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容